fix buildindex minibuf sizing bug

This commit is contained in:
rsc 2007-05-03 03:13:47 +00:00
parent 6a5a2a9562
commit 1d53bf4a03

View file

@ -68,7 +68,7 @@ threadmain(int argc, char *argv[])
usage(); usage();
break; break;
}ARGEND }ARGEND
if(argc != 1) if(argc != 1)
usage(); usage();
@ -324,7 +324,7 @@ bflush(Buf *buf)
u32int bufsize; u32int bufsize;
if(buf->woffset >= buf->eoffset) if(buf->woffset >= buf->eoffset)
sysfatal("buf index chunk overflow - need bufger index"); sysfatal("buf index chunk overflow - need bigger index");
bufsize = buf->ep - buf->bp; bufsize = buf->ep - buf->bp;
if(writepart(buf->part, buf->woffset, buf->bp, bufsize) < 0){ if(writepart(buf->part, buf->woffset, buf->bp, bufsize) < 0){
fprint(2, "write %s: %r\n", buf->part->name); fprint(2, "write %s: %r\n", buf->part->name);
@ -781,7 +781,7 @@ isectproc(void *v)
xminiclump = isectmem/2/IEntrySize; xminiclump = isectmem/2/IEntrySize;
/* total number of minibufs we need */ /* total number of minibufs we need */
prod = xclump / xminiclump; prod = (xclump+xminiclump-1) / xminiclump;
/* if possible, skip second pass */ /* if possible, skip second pass */
if(!dumb && prod*MinBufSize < isectmem){ if(!dumb && prod*MinBufSize < isectmem){
@ -801,7 +801,6 @@ isectproc(void *v)
bufsize *= 2; bufsize *= 2;
data = emalloc(nbuf*bufsize); data = emalloc(nbuf*bufsize);
epbuf = bufsize/IEntrySize; epbuf = bufsize/IEntrySize;
fprint(2, "%T %s: %,ud buckets, %,ud groups, %,ud minigroups, %,ud buffer\n", fprint(2, "%T %s: %,ud buckets, %,ud groups, %,ud minigroups, %,ud buffer\n",
is->part->name, nbucket, nbuf, nminibuf, bufsize); is->part->name, nbucket, nbuf, nminibuf, bufsize);
/* /*
@ -859,9 +858,15 @@ isectproc(void *v)
/* /*
* Rearrange entries into minibuffers and then * Rearrange entries into minibuffers and then
* split each minibuffer into buckets. * split each minibuffer into buckets.
* The minibuffer must be sized so that it is
* a multiple of blocksize -- ipoolloadblock assumes
* that each minibuf starts aligned on a blocksize
* boundary.
*/ */
mbuf = MKN(Minibuf, nminibuf); mbuf = MKN(Minibuf, nminibuf);
mbufbuckets = (bufbuckets+nminibuf-1)/nminibuf; mbufbuckets = (bufbuckets+nminibuf-1)/nminibuf;
while(mbufbuckets*blocksize % bufsize)
mbufbuckets++;
for(i=0; i<nbuf; i++){ for(i=0; i<nbuf; i++){
/* /*
* Set up descriptors. * Set up descriptors.
@ -873,11 +878,10 @@ isectproc(void *v)
for(j=0; j<nminibuf; j++){ for(j=0; j<nminibuf; j++){
mb = &mbuf[j]; mb = &mbuf[j];
mb->boffset = offset; mb->boffset = offset;
if(j < nminibuf-1){ offset += mbufbuckets*blocksize;
offset += mbufbuckets*blocksize; if(offset > buf[i].eoffset)
mb->eoffset = offset; offset = buf[i].eoffset;
}else mb->eoffset = offset;
mb->eoffset = buf[i].eoffset;
mb->roffset = mb->boffset; mb->roffset = mb->boffset;
mb->woffset = mb->boffset; mb->woffset = mb->boffset;
mb->nentry = epbuf * (mb->eoffset - mb->boffset)/bufsize; mb->nentry = epbuf * (mb->eoffset - mb->boffset)/bufsize;