From 8497009411a966a61c56447d3c8c4488a14b3cf0 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 25 Jul 2008 16:09:10 -0700 Subject: [PATCH] mds: factor out dup snap update code --- src/mds/Server.cc | 74 ++++++++++++----------------------------------- src/mds/Server.h | 1 + 2 files changed, 20 insertions(+), 55 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index ff15133aff8a3..abd784b65c6de 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -4889,6 +4889,8 @@ void Server::handle_client_lssnap(MDRequest *mdr) } +// MKSNAP + struct C_MDS_mksnap_finish : public Context { MDS *mds; MDRequest *mdr; @@ -5028,6 +5030,19 @@ void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info) diri->snaprealm->last_created = snapid; dout(10) << "snaprealm now " << *diri->snaprealm << dendl; + _invalidate_and_send_snap_updates(diri, CEPH_SNAP_OP_CREATE); + + // yay + mdr->ref = diri; + mdr->ref_snapid = snapid; + mdr->ref_snapdiri = diri; + MClientReply *reply = new MClientReply(mdr->client_request, 0); + diri->snaprealm->build_snap_trace(reply->snapbl); + reply_request(mdr, reply); +} + +void Server::_invalidate_and_send_snap_updates(CInode *diri, int snapop) +{ bufferlist snapbl; diri->snaprealm->build_snap_trace(snapbl); @@ -5047,7 +5062,7 @@ void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info) p++) { assert(!p->second.empty()); if (updates.count(p->first) == 0) { - MClientSnap *update = updates[p->first] = new MClientSnap(CEPH_SNAP_OP_CREATE); + MClientSnap *update = updates[p->first] = new MClientSnap(snapop); update->bl = snapbl; } } @@ -5065,18 +5080,12 @@ void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info) p != updates.end(); p++) mds->send_message_client(p->second, p->first); - - // yay - mdr->ref = diri; - mdr->ref_snapid = snapid; - mdr->ref_snapdiri = diri; - MClientReply *reply = new MClientReply(mdr->client_request, 0); - diri->snaprealm->build_snap_trace(reply->snapbl); - reply_request(mdr, reply); } +// RMSNAP + struct C_MDS_rmsnap_finish : public Context { MDS *mds; MDRequest *mdr; @@ -5192,43 +5201,7 @@ void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid) diri->snaprealm->seq = mdr->more()->stid; dout(10) << "snaprealm now " << *diri->snaprealm << dendl; - bufferlist snapbl; - diri->snaprealm->build_snap_trace(snapbl); - - map updates; - list q; - q.push_back(diri->snaprealm); - while (!q.empty()) { - SnapRealm *realm = q.front(); - q.pop_front(); - - dout(10) << " realm " << *realm - << " on " << *realm->inode << dendl; - realm->invalidate_cached_snaps(); - - for (map >::iterator p = realm->client_caps.begin(); - p != realm->client_caps.end(); - p++) { - assert(!p->second.empty()); - if (updates.count(p->first) == 0) { - MClientSnap *update = updates[p->first] = new MClientSnap(CEPH_SNAP_OP_DESTROY); - update->bl = snapbl; - } - } - - // notify for active children, too. - dout(10) << " " << realm << " open_children are " << realm->open_children << dendl; - for (set::iterator p = realm->open_children.begin(); - p != realm->open_children.end(); - p++) - q.push_back(*p); - } - - // send - for (map::iterator p = updates.begin(); - p != updates.end(); - p++) - mds->send_message_client(p->second, p->first); + _invalidate_and_send_snap_updates(diri, CEPH_SNAP_OP_DESTROY); // yay mdr->ref = diri; @@ -5237,12 +5210,3 @@ void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid) } - - - - - - - - - diff --git a/src/mds/Server.h b/src/mds/Server.h index 3b5a5c0c25161..5b8f978f3b9e8 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -161,6 +161,7 @@ public: void handle_client_lssnap(MDRequest *mdr); void handle_client_mksnap(MDRequest *mdr); void _mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info); + void _invalidate_and_send_snap_updates(CInode *diri, int snapop); void handle_client_rmsnap(MDRequest *mdr); void _rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid); -- 2.39.5