From 7114f0252d6039f01546bcce03cf0a956ee1a356 Mon Sep 17 00:00:00 2001 From: bobijam <bobijam> Date: Tue, 22 Jul 2008 03:12:39 +0000 Subject: [PATCH] Branch HEAD b=16205 i=shadow, adilger make max_grow_count on MDS tunable. --- lustre/include/lustre_export.h | 1 + lustre/osc/lproc_osc.c | 54 +++++++++++++++++++++++++++++++++- lustre/osc/osc_create.c | 7 +++-- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/lustre/include/lustre_export.h b/lustre/include/lustre_export.h index 917e0da4d1..d961807bbd 100644 --- a/lustre/include/lustre_export.h +++ b/lustre/include/lustre_export.h @@ -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 */ diff --git a/lustre/osc/lproc_osc.c b/lustre/osc/lproc_osc.c index 1d7c0a4d4a..f66b769935 100644 --- a/lustre/osc/lproc_osc.c +++ b/lustre/osc/lproc_osc.c @@ -227,6 +227,53 @@ static int osc_rd_create_count(char *page, char **start, off_t off, int count, 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; @@ -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 }, diff --git a/lustre/osc/osc_create.c b/lustre/osc/osc_create.c index 892df3c6d5..53f384ff61 100644 --- a/lustre/osc/osc_create.c +++ b/lustre/osc/osc_create.c @@ -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; -- GitLab