From: Sage Weil Date: Wed, 13 Aug 2008 19:27:00 +0000 (-0700) Subject: mds: do split in mksnap X-Git-Tag: v0.4~263 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a46bc4530d9657be5b27d909136319e0e949552a;p=ceph.git mds: do split in mksnap --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 47d2904334f..cd27a403d59 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -845,11 +845,8 @@ void CInode::decode_lock_state(int type, bufferlist& bl) if (snaprealm) seq = snaprealm->seq; decode_snap(p); - if (snaprealm && snaprealm->seq != seq) { - if (!seq) - mdcache->do_realm_split_notify(this); - mdcache->do_realm_invalidate_and_update_notify(this, CEPH_SNAP_OP_UPDATE); - } + if (snaprealm && snaprealm->seq != seq) + mdcache->do_realm_invalidate_and_update_notify(this, seq ? CEPH_SNAP_OP_UPDATE:CEPH_SNAP_OP_SPLIT); } break; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 58a42cfdeeb..1f63efd3992 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -6119,57 +6119,23 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in) } -void MDCache::do_realm_split_notify(CInode *in) +void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop) { - dout(10) << "do_realm_split_notify " << *in->snaprealm << " " << *in << dendl; - - // notify clients of update|split - vector split_inos; - for (xlist::iterator p = in->snaprealm->inodes_with_caps.begin(); !p.end(); ++p) - split_inos.push_back((*p)->ino()); + dout(10) << "do_realm_invalidate_and_update_notify " << *in->snaprealm << " " << *in << dendl; + vector split_inos; vector split_realms; - for (set::iterator p = in->snaprealm->open_children.begin(); - p != in->snaprealm->open_children.end(); - p++) - split_realms.push_back((*p)->inode->ino()); - - bufferlist snapbl; - in->snaprealm->build_snap_trace(snapbl); - - map updates; - - // send splits for all clients with caps in this _or nested_ realms. - list q; - q.push_back(in->snaprealm); - while (!q.empty()) { - SnapRealm *realm = q.front(); - q.pop_front(); - for (map >::iterator p = realm->client_caps.begin(); - p != realm->client_caps.end(); - p++) { - assert(!p->second.empty()); - MClientSnap *update = updates[p->first] = new MClientSnap(CEPH_SNAP_OP_SPLIT); - update->head.split = in->ino(); - update->split_inos = split_inos; - update->split_realms = split_realms; - update->bl = snapbl; - updates[p->first] = update; - } - - for (set::iterator p = realm->open_children.begin(); - p != realm->open_children.end(); + if (snapop == CEPH_SNAP_OP_SPLIT) { + // notify clients of update|split + for (xlist::iterator p = in->snaprealm->inodes_with_caps.begin(); !p.end(); ++p) + split_inos.push_back((*p)->ino()); + + for (set::iterator p = in->snaprealm->open_children.begin(); + p != in->snaprealm->open_children.end(); p++) - q.push_back(*p); + split_realms.push_back((*p)->inode->ino()); } - - send_snaps(updates); -} - -void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop) -{ - dout(10) << "do_realm_invalidate_and_update_notify " << *in->snaprealm << " " << *in << dendl; bufferlist snapbl; in->snaprealm->build_snap_trace(snapbl); @@ -6181,8 +6147,7 @@ void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop) SnapRealm *realm = q.front(); q.pop_front(); - dout(10) << " realm " << *realm - << " on " << *realm->inode << dendl; + dout(10) << " realm " << *realm << " on " << *realm->inode << dendl; realm->invalidate_cached_snaps(); for (map >::iterator p = realm->client_caps.begin(); @@ -6190,8 +6155,12 @@ void MDCache::do_realm_invalidate_and_update_notify(CInode *in, int snapop) p++) { assert(!p->second.empty()); if (updates.count(p->first) == 0) { - MClientSnap *update = updates[p->first] = new MClientSnap(snapop); + MClientSnap *update = new MClientSnap(snapop); + update->head.split = in->ino(); + update->split_inos = split_inos; + update->split_realms = split_realms; update->bl = snapbl; + updates[p->first] = update; } } @@ -6227,7 +6196,7 @@ void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in in->open_snaprealm(); in->snaprealm->seq = in->snaprealm->created = seq; - do_realm_split_notify(in); + do_realm_invalidate_and_update_notify(in, CEPH_SNAP_OP_SPLIT); /* static int count = 5; diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 8267f4112eb..4d9db108842 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -666,7 +666,6 @@ 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 do_realm_invalidate_and_update_notify(CInode *in, int snapop); void send_snaps(map& splits); void rejoin_import_cap(CInode *in, int client, ceph_mds_cap_reconnect& icr, int frommds); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 7e32a88ba90..0d2dabc266c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3018,7 +3018,7 @@ void Server::_unlink_local_finish(MDRequest *mdr, } straydn->inode->snaprealm->add_past_parent(oldparent); if (isnew) - mdcache->do_realm_split_notify(straydn->inode); + mdcache->do_realm_invalidate_and_update_notify(straydn->inode, CEPH_SNAP_OP_SPLIT); } dn->mark_dirty(dnpv, mdr->ls); @@ -5025,13 +5025,6 @@ void Server::handle_client_mksnap(MDRequest *mdr) if (mdr->now == utime_t()) mdr->now = g_clock.now(); - - // create snaprealm? - if (!diri->snaprealm) { - mds->mdcache->snaprealm_create(mdr, diri); - return; - } - // allocate a snapid if (!mdr->more()->stid) { // prepare an stid @@ -5067,6 +5060,12 @@ void Server::handle_client_mksnap(MDRequest *mdr) // project the snaprealm.. hack! bufferlist snapbl; + bool newrealm = false; + if (!diri->snaprealm) { + newrealm = true; + diri->open_snaprealm(true); + diri->snaprealm->created = snapid; + } snapid_t old_seq = diri->snaprealm->seq; snapid_t old_lc = diri->snaprealm->last_created; diri->snaprealm->snaps[snapid] = info; @@ -5076,6 +5075,9 @@ void Server::handle_client_mksnap(MDRequest *mdr) diri->snaprealm->snaps.erase(snapid); diri->snaprealm->seq = old_seq; diri->snaprealm->last_created = old_lc; + if (newrealm) + diri->close_snaprealm(true); + le->metablob.add_primary_dentry(diri->get_projected_parent_dn(), true, 0, pi, 0, &snapbl); mdlog->submit_entry(le, new C_MDS_mksnap_finish(mds, mdr, diri, info)); @@ -5092,12 +5094,18 @@ void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info) // create snap snapid_t snapid = info.snapid; + int op = CEPH_SNAP_OP_CREATE; + if (!diri->snaprealm) { + diri->open_snaprealm(); + diri->snaprealm->created = snapid; + op = CEPH_SNAP_OP_SPLIT; + } diri->snaprealm->snaps[snapid] = info; diri->snaprealm->seq = snapid; diri->snaprealm->last_created = snapid; dout(10) << "snaprealm now " << *diri->snaprealm << dendl; - mdcache->do_realm_invalidate_and_update_notify(diri, CEPH_SNAP_OP_CREATE); + mdcache->do_realm_invalidate_and_update_notify(diri, op); // yay mdr->ref = diri;