From: Sage Weil Date: Mon, 24 Aug 2009 21:01:14 +0000 (-0700) Subject: mds: avoid propagating nestlock more frequently than mds_dirstat_min_interval X-Git-Tag: v0.14~129 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=03411a1565bdac8e84d6de85ddd755ab43ffa7fe;p=ceph.git mds: avoid propagating nestlock more frequently than mds_dirstat_min_interval Instead, add the lock to the update_scatterlock list, as usual. --- diff --git a/src/config.cc b/src/config.cc index 1cee555069d9..e16ebfc3c443 100644 --- a/src/config.cc +++ b/src/config.cc @@ -407,6 +407,7 @@ static struct config_option config_optionsp[] = { OPTION(mds_reconnect_timeout, 0, OPT_FLOAT, 45), // seconds to wait for clients during mds restart // make it (mds_session_timeout - mds_beacon_grace) OPTION(mds_tick_interval, 0, OPT_FLOAT, 5), + OPTION(mds_dirstat_min_interval, 0, OPT_FLOAT, 1), // try to avoid propagating more often than this OPTION(mds_scatter_nudge_interval, 0, OPT_FLOAT, 5), // how quickly dirstat changes propagate up the hierarchy OPTION(mds_client_prealloc_inos, 0, OPT_INT, 1000), OPTION(mds_early_reply, 0, OPT_BOOL, true), diff --git a/src/config.h b/src/config.h index 6cde0ba9aab5..08f9f6dd5898 100644 --- a/src/config.h +++ b/src/config.h @@ -198,6 +198,7 @@ struct md_config_t { float mds_reconnect_timeout; float mds_tick_interval; + float mds_dirstat_min_interval; float mds_scatter_nudge_interval; int mds_client_prealloc_inos; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 101c18d8d8db..4562fb1d360d 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2546,6 +2546,12 @@ bool Locker::simple_sync(SimpleLock *lock, bool *need_issue) gather++; } + if (!gather && lock->is_updated()) { + lock->get_parent()->auth_pin(lock); + scatter_writebehind((ScatterLock*)lock); + return false; + } + if (gather) { lock->get_parent()->auth_pin(lock); return false; @@ -2664,8 +2670,9 @@ void Locker::simple_lock(SimpleLock *lock, bool *need_issue) } if (!gather && lock->is_updated()) { + lock->get_parent()->auth_pin(lock); scatter_writebehind((ScatterLock*)lock); - gather++; + return; } if (gather) { diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index cccd80926898..8f39d9263256 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1667,6 +1667,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, list lsi; CInode *cur = in; CDentry *parentdn = cur->get_projected_parent_dn(); + bool first = true; while (parent) { //assert(cur->is_auth() || !primary_dn); // this breaks the rename auth twiddle hack assert(parent->is_auth()); @@ -1749,6 +1750,26 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, dout(10) << "predirty_journal_parents !auth or ambig on " << *pin << dendl; stop = true; } + + // delay propagating until later? + if (!stop && !first && + g_conf.mds_dirstat_min_interval > 0) { + if (pin->last_dirstat_prop.sec() > 0) { + double since_last_prop = mut->now - pin->last_dirstat_prop; + if (since_last_prop < g_conf.mds_dirstat_min_interval) { + dout(10) << "predirty_journal_parents last prop " << since_last_prop + << " < " << g_conf.mds_dirstat_min_interval + << ", stopping" << dendl; + stop = true; + } else { + dout(10) << "predirty_journal_parents last prop " << since_last_prop << " ago, continuing" << dendl; + } + } else { + dout(10) << "predirty_journal_parents last prop never, stopping" << dendl; + stop = true; + } + } + if (!stop && mut->wrlocks.count(&pin->nestlock) == 0 && (!pin->can_auth_pin() || @@ -1772,6 +1793,8 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, assert(mut->wrlocks.count(&pin->nestlock) || mut->is_slave()); + + pin->last_dirstat_prop = mut->now; // dirfrag -> diri mut->auth_pin(pin); @@ -1827,6 +1850,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, linkunlink = 0; do_parent_mtime = false; primary_dn = true; + first = false; } // now, stick it in the blob diff --git a/src/mds/ScatterLock.h b/src/mds/ScatterLock.h index aff5a1d5f3d6..b8804265e6a2 100644 --- a/src/mds/ScatterLock.h +++ b/src/mds/ScatterLock.h @@ -39,6 +39,9 @@ public: void clear_scatter_wanted() { scatter_wanted = false; } bool get_scatter_wanted() { return scatter_wanted; } + bool is_updated() { + return dirty; + } void mark_dirty() { if (!dirty) { if (!flushing)