Whamcloud - gitweb
Branch HEAD
authorbobijam <bobijam>
Tue, 22 Jul 2008 03:12:39 +0000 (03:12 +0000)
committerbobijam <bobijam>
Tue, 22 Jul 2008 03:12:39 +0000 (03:12 +0000)
b=16205
i=shadow, adilger

make max_grow_count on MDS tunable.

lustre/include/lustre_export.h
lustre/osc/lproc_osc.c
lustre/osc/osc_create.c

index 917e0da..d961807 100644 (file)
@@ -35,6 +35,7 @@ struct osc_creator {
         obd_id                  oscc_last_id;//last available pre-created object
         obd_id                  oscc_next_id;// what object id to give out next
         int                     oscc_grow_count;
+        int                     oscc_max_grow_count;
         struct obdo             oscc_oa;
         int                     oscc_flags;
         cfs_waitq_t             oscc_waitq; /* creating procs wait on this */
index 1d7c0a4..f66b769 100644 (file)
@@ -229,6 +229,53 @@ static int osc_wr_create_count(struct file *file, const char *buffer,
                                unsigned long count, void *data)
 {
         struct obd_device *obd = data;
+        int val, rc, i;
+
+        if (obd == NULL)
+                return 0;
+
+        rc = lprocfs_write_helper(buffer, count, &val);
+        if (rc)
+                return rc;
+
+        /* The MDT ALWAYS needs to limit the precreate count to
+         * OST_MAX_PRECREATE, and the constant cannot be changed
+         * because it is a value shared between the OSC and OST
+         * that is the maximum possible number of objects that will
+         * ever be handled by MDT->OST recovery processing.
+         *
+         * If the OST ever gets a request to delete more orphans,
+         * this implies that something has gone badly on the MDT
+         * and the OST will refuse to delete so much data from the
+         * filesystem as a safety measure. */
+        if (val < OST_MIN_PRECREATE || val > OST_MAX_PRECREATE)
+                return -ERANGE;
+        if (val > obd->u.cli.cl_oscc.oscc_max_grow_count)
+                return -ERANGE;
+
+        for (i = 1; (i << 1) <= val; i <<= 1)
+                ;
+        obd->u.cli.cl_oscc.oscc_grow_count = i;
+
+        return count;
+}
+
+static int osc_rd_max_create_count(char *page, char **start, off_t off,
+                                   int count, int *eof, void *data)
+{
+        struct obd_device *obd = data;
+
+        if (obd == NULL)
+                return 0;
+
+        return snprintf(page, count, "%d\n",
+                        obd->u.cli.cl_oscc.oscc_max_grow_count);
+}
+
+static int osc_wr_max_create_count(struct file *file, const char *buffer,
+                                   unsigned long count, void *data)
+{
+        struct obd_device *obd = data;
         int val, rc;
 
         if (obd == NULL)
@@ -243,7 +290,10 @@ static int osc_wr_create_count(struct file *file, const char *buffer,
         if (val > OST_MAX_PRECREATE)
                 return -ERANGE;
 
-        obd->u.cli.cl_oscc.oscc_grow_count = val;
+        if (obd->u.cli.cl_oscc.oscc_grow_count > val)
+                obd->u.cli.cl_oscc.oscc_grow_count = val;
+
+        obd->u.cli.cl_oscc.oscc_max_grow_count = val;
 
         return count;
 }
@@ -407,6 +457,8 @@ static struct lprocfs_vars lprocfs_osc_obd_vars[] = {
         { "cur_dirty_bytes", osc_rd_cur_dirty_bytes, 0, 0 },
         { "cur_grant_bytes", osc_rd_cur_grant_bytes, 0, 0 },
         { "create_count",    osc_rd_create_count, osc_wr_create_count, 0 },
+        { "max_create_count", osc_rd_max_create_count,
+                              osc_wr_max_create_count, 0},
         { "prealloc_next_id", osc_rd_prealloc_next_id, 0, 0 },
         { "prealloc_last_id", osc_rd_prealloc_last_id, 0, 0 },
         { "checksums",       osc_rd_checksum, osc_wr_checksum, 0 },
index 892df3c..53f384f 100644 (file)
@@ -139,7 +139,7 @@ static int oscc_internal_create(struct osc_creator *oscc)
                 RETURN(0);
         }
 
-        if (oscc->oscc_grow_count < OST_MAX_PRECREATE &&
+        if (oscc->oscc_grow_count < oscc->oscc_max_grow_count &&
             ((oscc->oscc_flags & OSCC_FLAG_LOW) == 0) &&
             (__s64)(oscc->oscc_last_id - oscc->oscc_next_id) <=
                    (oscc->oscc_grow_count / 4 + 1)) {
@@ -147,8 +147,8 @@ static int oscc_internal_create(struct osc_creator *oscc)
                 oscc->oscc_grow_count *= 2;
         }
 
-        if (oscc->oscc_grow_count > OST_MAX_PRECREATE / 2)
-                oscc->oscc_grow_count = OST_MAX_PRECREATE / 2;
+        if (oscc->oscc_grow_count > oscc->oscc_max_grow_count / 2)
+                oscc->oscc_grow_count = oscc->oscc_max_grow_count / 2;
 
         oscc->oscc_flags |= OSCC_FLAG_CREATING;
         spin_unlock(&oscc->oscc_lock);
@@ -443,6 +443,7 @@ void oscc_init(struct obd_device *obd)
         spin_lock_init(&oscc->oscc_lock);
         oscc->oscc_obd = obd;
         oscc->oscc_grow_count = OST_MIN_PRECREATE;
+        oscc->oscc_max_grow_count = OST_MAX_PRECREATE;
 
         oscc->oscc_next_id = 2;
         oscc->oscc_last_id = 1;