From d65b58a960acb6b9de09436deded316d4af5a8b1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 4 Aug 2008 21:03:07 -0700 Subject: [PATCH] mds: factor out do_realm_split_notify, call on snap lock update --- src/mds/CInode.cc | 9 ++++++++- src/mds/MDCache.cc | 45 ++++++++++++++++++++++++--------------------- src/mds/MDCache.h | 1 + 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index ddeb18233f35d..51907b59839bc 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -837,7 +837,14 @@ void CInode::decode_lock_state(int type, bufferlist& bl) break; case CEPH_LOCK_ISNAP: - decode_snap(p); + { + bool had = snaprealm ? true:false; + decode_snap(p); + if (!had && snaprealm) { + assert(!is_auth()); + mdcache->do_realm_split_notify(this); + } + } break; default: diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 1615378b70a97..4cc111b5d90ab 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -6113,28 +6113,11 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in) mds->mdlog->submit_entry(le, new C_MDC_snaprealm_create_finish(this, mdr, mut, in)); } -void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in) -{ - dout(10) << "_snaprealm_create_finish " << *in << dendl; - - // apply - in->pop_and_dirty_projected_inode(mut->ls); - mut->apply(); - mut->cleanup(); - delete mut; - - // tell table we've committed - mds->snapclient->commit(mdr->more()->stid, mut->ls); - - // create - in->open_snaprealm(); - in->snaprealm->seq = in->snaprealm->created = mdr->more()->stid; - - // split existing caps - SnapRealm *parent = in->snaprealm->parent; - assert(parent); - assert(parent->open_children.count(in->snaprealm)); +void MDCache::do_realm_split_notify(CInode *in) +{ + dout(10) << "do_realm_split_notify " << *in->snaprealm << " " << *in << dendl; + // notify clients of update|split list split_inos; for (xlist::iterator p = in->snaprealm->inodes_with_caps.begin(); !p.end(); ++p) @@ -6178,6 +6161,26 @@ void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in } send_realm_splits(updates); +} + +void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in) +{ + dout(10) << "_snaprealm_create_finish " << *in << dendl; + + // apply + in->pop_and_dirty_projected_inode(mut->ls); + mut->apply(); + mut->cleanup(); + delete mut; + + // tell table we've committed + mds->snapclient->commit(mdr->more()->stid, mut->ls); + + // create + in->open_snaprealm(); + in->snaprealm->seq = in->snaprealm->created = mdr->more()->stid; + + do_realm_split_notify(in); /* static int count = 5; diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 6007f3be9d546..68e8609257599 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -665,6 +665,7 @@ public: void process_reconnected_caps(); void prepare_realm_split(SnapRealm *realm, int client, inodeno_t ino, map& splits); + void do_realm_split_notify(CInode *in); void send_realm_splits(map& splits); void rejoin_import_cap(CInode *in, int client, ceph_mds_cap_reconnect& icr, int frommds); void finish_snaprealm_reconnect(int client, SnapRealm *realm, snapid_t seq); -- 2.39.5