Place an upper bound on the number of segments to clean at one time, no

matter how empty they are.

Note that if two blocks have the same inode and block number, they sort
the same (this should never happen, but if it does there's no reason to
have qsort scramble the list).

Add some diagnostic syslog messages for unusual cases.
This commit is contained in:
perseant 2006-07-07 18:19:30 +00:00
parent fa517f1fc0
commit 21393db687
1 changed files with 11 additions and 1 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: lfs_cleanerd.c,v 1.7 2006/05/12 19:33:02 perseant Exp $ */
/* $NetBSD: lfs_cleanerd.c,v 1.8 2006/07/07 18:19:30 perseant Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@ -320,6 +320,9 @@ lfs_ientry(IFILE **ifpp, struct clfs *fs, ino_t ino, struct ubuf **bpp)
error = bread(fs->lfs_ivnode, ino / fs->lfs_ifpb + fs->lfs_cleansz +
fs->lfs_segtabsz, fs->lfs_bsize, NOCRED, bpp);
if (error)
syslog(LOG_ERR, "%s: ientry failed for ino %d",
fs->lfs_fsmnt, (int)ino);
*ifpp = (IFILE *)(*bpp)->b_data + ino % fs->lfs_ifpb;
return;
}
@ -505,6 +508,8 @@ parse_pseg(struct clfs *fs, daddr_t daddr, BLOCK_INFO **bipp, int *bic)
fs->lfs_sumsize - sizeof(nssp->ss_sumsum));
bwrite(nbp);
#endif
syslog(LOG_WARNING, "zero-length FINFO at %x (seg %d)",
odaddr, dtosn(fs, odaddr));
continue;
}
@ -755,6 +760,8 @@ bi_comparator(const void *va, const void *vb)
return 1;
else
return -1;
return 0;
}
/*
@ -1043,6 +1050,9 @@ clean_fs(struct clfs *fs, CLEANERINFO *cip)
for (i = 0; i < fs->lfs_nseg && totbytes < goal; i++) {
if (fs->clfs_segtabp[i]->priority == 0)
break;
/* Upper bound on number of segments at once */
if (ngood * fs->lfs_ssize > 4 * goal)
break;
sn = (fs->clfs_segtabp[i] - fs->clfs_segtab);
dlog("%s: add seg %d prio %" PRIu64
" containing %ld bytes",