Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-1-4]: src/libexec/lfs_cleanerd pullup 1.13->1.14 (perseant)



details:   https://anonhg.NetBSD.org/src/rev/a259293f6edc
branches:  netbsd-1-4
changeset: 469068:a259293f6edc
user:      perry <perry%NetBSD.org@localhost>
date:      Fri Jun 25 20:52:37 1999 +0000

description:
pullup 1.13->1.14 (perseant)

diffstat:

 libexec/lfs_cleanerd/cleanerd.c |  88 +++++++++++++++++++++++++---------------
 1 files changed, 55 insertions(+), 33 deletions(-)

diffs (239 lines):

diff -r deacde65eafe -r a259293f6edc libexec/lfs_cleanerd/cleanerd.c
--- a/libexec/lfs_cleanerd/cleanerd.c   Fri Jun 25 20:51:32 1999 +0000
+++ b/libexec/lfs_cleanerd/cleanerd.c   Fri Jun 25 20:52:37 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cleanerd.c,v 1.13 1999/03/14 11:39:28 drochner Exp $   */
+/*     $NetBSD: cleanerd.c,v 1.13.2.1 1999/06/25 20:52:37 perry Exp $  */
 
 /*-
  * Copyright (c) 1992, 1993
@@ -40,7 +40,7 @@
 #if 0
 static char sccsid[] = "@(#)cleanerd.c 8.5 (Berkeley) 6/10/95";
 #else
-__RCSID("$NetBSD: cleanerd.c,v 1.13 1999/03/14 11:39:28 drochner Exp $");
+__RCSID("$NetBSD: cleanerd.c,v 1.13.2.1 1999/06/25 20:52:37 perry Exp $");
 #endif
 #endif /* not lint */
 
@@ -83,9 +83,10 @@
 } cleaner_stats;
 
 struct seglist { 
-       int sl_id;      /* segment number */
-       int sl_cost;    /* cleaning cost */
-       int sl_bytes;   /* bytes in segment */
+       unsigned long sl_id;    /* segment number */
+       unsigned long sl_cost;  /* cleaning cost */
+       unsigned long sl_bytes; /* bytes in segment */
+       unsigned long sl_age;   /* age in seconds */
 };
 
 struct tossstruct {
@@ -104,11 +105,11 @@
 /* function prototypes */
 int     bi_tossold __P((const void *, const void *, const void *));
 int     choose_segments __P((FS_INFO *, struct seglist *, 
-            int (*)(FS_INFO *, SEGUSE *)));
-void    clean_fs __P((FS_INFO  *, int (*)(FS_INFO *, SEGUSE *), int, long));
+            unsigned long (*)(FS_INFO *, SEGUSE *)));
+void    clean_fs __P((FS_INFO  *, unsigned long (*)(FS_INFO *, SEGUSE *), int, long));
 int     clean_loop __P((FS_INFO *, int, long));
 int     clean_segment __P((FS_INFO *, struct seglist *));
-int     cost_benefit __P((FS_INFO *, SEGUSE *));
+unsigned long   cost_benefit __P((FS_INFO *, SEGUSE *));
 int     cost_compare __P((const void *, const void *));
 void    sig_report __P((int));
 int     main __P((int, char *[]));
@@ -125,15 +126,15 @@
  * 1991 SOSP paper.
  */
 
-int
+unsigned long
 cost_benefit(fsp, su)
        FS_INFO *fsp;           /* file system information */
        SEGUSE *su;
 {
        struct lfs *lfsp;
        struct timeval t;
-       int age;
-       int live;
+       time_t age;
+       unsigned long live;
 
        gettimeofday(&t, NULL);
 
@@ -141,9 +142,9 @@
        age = t.tv_sec < su->su_lastmod ? 0 : t.tv_sec - su->su_lastmod;
        
        lfsp = &fsp->fi_lfs;
-       if (live == 0)
-               return (t.tv_sec * lblkno(lfsp, seg_size(lfsp)));
-       else {
+       if (live == 0) { /* No cost, only benefit. */
+               return lblkno(lfsp, seg_size(lfsp)) * t.tv_sec;
+       } else {
                /* 
                 * from lfsSegUsage.c (Mendel's code).
                 * priority calculation is done using INTEGER arithmetic.
@@ -156,12 +157,8 @@
                         syslog(LOG_NOTICE,"bad segusage count: %d", live);
                        live = 0;
                }
-#if 0
-               return lblkno(lfsp, seg_size(lfsp) - live);
-#else
                return (lblkno(lfsp, seg_size(lfsp) - live) * age)
                        / lblkno(lfsp, seg_size(lfsp) + live);
-#endif
        }
 }
 
@@ -401,13 +398,13 @@
 void
 clean_fs(fsp, cost_func, nsegs, options)
        FS_INFO *fsp;   /* file system information */
-       int (*cost_func) __P((FS_INFO *, SEGUSE *));
+       unsigned long (*cost_func) __P((FS_INFO *, SEGUSE *));
        int nsegs;
        long options;
 {
        struct seglist *segs, *sp;
        long int to_clean, cleaned_bytes;
-       int i, total;
+       unsigned long i, j, total;
 
        if ((segs =
            malloc(fsp->fi_lfs.lfs_nseg * sizeof(struct seglist))) == NULL) {
@@ -416,6 +413,20 @@
        }
        total = i = choose_segments(fsp, segs, cost_func);
 
+       /* If we can get lots of cleaning for free, do it now */
+       sp=segs;
+       for(j=0; j < total && sp->sl_bytes == 0; j++) {
+               if(debug)
+                       syslog(LOG_DEBUG,"Wiping empty segment %d",sp->sl_id);
+               if(lfs_segclean(&fsp->fi_statfsp->f_fsid, sp->sl_id) < 0)
+                       syslog(LOG_NOTICE,"lfs_segclean failed empty segment %d: %m", sp->sl_id);
+                ++cleaner_stats.segs_empty;
+               sp++;
+               i--;
+       }
+       if(j > nsegs)
+               return;
+
        /* If we relly need to clean a lot, do it now */
        if(fsp->fi_cip->clean < 2*MIN_FREE_SEGS)
                nsegs = MAX(nsegs,MIN_FREE_SEGS);
@@ -432,7 +443,7 @@
                if (options & CLEAN_BYTES) {
                        cleaned_bytes = 0;
                        to_clean = nsegs << fsp->fi_lfs.lfs_segshift;
-                       for (sp = segs; i && cleaned_bytes < to_clean;
+                       for (; i && cleaned_bytes < to_clean;
                            i--, ++sp) {
                                if (clean_segment(fsp, sp) < 0)
                                        syslog(LOG_NOTICE,"clean_segment failed segment %d: %m", sp->sl_id);
@@ -452,7 +463,7 @@
                                }
                        }
                } else
-                       for (i = MIN(i, nsegs), sp = segs; i-- ; ++sp) {
+                       for (i = MIN(i, nsegs); i-- ; ++sp) {
                                total--;
                                syslog(LOG_DEBUG,"Cleaning segment %d (of %d choices)", sp->sl_id, i+1);
                                if (clean_segment(fsp, sp) < 0) {
@@ -487,8 +498,7 @@
        const void *a;
        const void *b;
 {
-       return (((struct seglist *)b)->sl_cost -
-           ((struct seglist *)a)->sl_cost);
+       return ((struct seglist *)b)->sl_cost < ((struct seglist *)a)->sl_cost ? -1 : 1;
 }
 
 
@@ -500,7 +510,7 @@
 choose_segments(fsp, seglist, cost_func)
        FS_INFO *fsp;
        struct seglist *seglist;
-       int (*cost_func) __P((FS_INFO *, SEGUSE *));
+       unsigned long (*cost_func) __P((FS_INFO *, SEGUSE *));
 {
        struct lfs *lfsp;
        struct seglist *sp;
@@ -526,11 +536,18 @@
                sp->sl_cost = (*cost_func)(fsp, sup);
                sp->sl_id = i;
                sp->sl_bytes = sup->su_nbytes;
+               sp->sl_age = time(NULL) - sup->su_lastmod;
                ++sp;
        }
        nsegs = sp - seglist;
        qsort(seglist, nsegs, sizeof(struct seglist), cost_compare);
-
+#if 0
+       for(i=0; i<nsegs; i++) {
+               printf("%d: segment %lu age %lu contains %lu priority %lu\n", i,
+                       seglist[i].sl_age, seglist[i].sl_id, seglist[i].sl_bytes,
+                       seglist[i].sl_cost);
+       }
+#endif
         if(debug > 1)
             syslog(LOG_DEBUG,"Returning %d segments", nsegs);
 
@@ -553,23 +570,21 @@
        caddr_t seg_buf;
        daddr_t seg_addr;
        int num_blocks, maxblocks, clean_blocks, i, j;
+       int seg_isempty=0;
         unsigned long *lp;
 
        lfsp = &fsp->fi_lfs;
        sp = SEGUSE_ENTRY(lfsp, fsp->fi_segusep, id);
        seg_addr = sntoda(lfsp,id);
 
-        if(debug > 1)
-            syslog(LOG_DEBUG, "cleaning segment %d: contains %lu bytes", id,
+        syslog(LOG_DEBUG, "cleaning segment %d: contains %lu bytes", id,
                    (unsigned long)sp->su_nbytes);
 
-#if 0
        /* XXX could add debugging to verify that segment is really empty */
-       if (sp->su_nbytes == sp->su_nsums * LFS_SUMMARY_SIZE) {
+       if (sp->su_nbytes == 0) {
                ++cleaner_stats.segs_empty;
-               return (0);
+               ++seg_isempty;
        }
-#endif
 
        /* map the segment into a buffer */
        if (mmap_segment(fsp, id, &seg_buf, do_mmap) < 0) {
@@ -604,6 +619,12 @@
        if (num_blocks && bi_tossold(&t, block_array + num_blocks - 1, NULL))
                --num_blocks;
 
+       if(seg_isempty) {
+               if(num_blocks)
+                       syslog(LOG_WARNING,"segment %d was supposed to be empty, but has %d live blocks!", id, num_blocks);
+               else
+                       syslog(LOG_DEBUG,"segment %d is empty, as claimed", id);
+       }
        /* XXX KS - check for misplaced blocks */
        for(i=0; i<num_blocks; i++) {
                if(block_array[i].bi_daddr
@@ -612,9 +633,10 @@
                {
                        if(debug > 1) {
                                syslog(LOG_DEBUG, "seg %d, ino %d lbn %d, 0x%x != 0x%lx (fixed)",
+                                       id,
                                       block_array[i].bi_inode,
                                       block_array[i].bi_lbn,
-                                      id, block_array[i].bi_daddr,
+                                      block_array[i].bi_daddr,
                                       (long)seg_addr + ((char *)(block_array[i].bi_bp) - seg_buf)/DEV_BSIZE);
                        }
                        /*



Home | Main Index | Thread Index | Old Index