From: Sage Weil Date: Wed, 13 Aug 2008 17:00:44 +0000 (-0700) Subject: mds: set seq correctly for rmsnap, snaprealm create X-Git-Tag: v0.4~267 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6ed11f75c92159c4522734b5825081d99018e75d;p=ceph.git mds: set seq correctly for rmsnap, snaprealm create --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index d24782aaa3c..bf117ac92d5 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -6087,7 +6087,7 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in) // allocate an id.. if (!mdr->more()->stid) { - mds->snapclient->prepare_create_realm(in->ino(), &mdr->more()->stid, + mds->snapclient->prepare_create_realm(in->ino(), &mdr->more()->stid, &mdr->more()->snapidbl, new C_MDS_RetryRequest(this, mdr)); return; } @@ -6101,8 +6101,12 @@ void MDCache::snaprealm_create(MDRequest *mdr, CInode *in) pi->version = in->pre_dirty(); pi->rstat.rsnaprealms++; + bufferlist::iterator p = mdr->more()->snapidbl.begin(); + snapid_t seq; + ::decode(seq, p); + SnapRealm t(this, in); - t.created = mdr->more()->stid; + t.created = seq; bufferlist snapbl; ::encode(t, snapbl); @@ -6215,8 +6219,12 @@ void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in mds->snapclient->commit(mdr->more()->stid, mut->ls); // create + bufferlist::iterator p = mdr->more()->snapidbl.begin(); + snapid_t seq; + ::decode(seq, p); + in->open_snaprealm(); - in->snaprealm->seq = in->snaprealm->created = mdr->more()->stid; + in->snaprealm->seq = in->snaprealm->created = seq; do_realm_split_notify(in); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 7413e3b77eb..7e32a88ba90 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5179,12 +5179,15 @@ void Server::handle_client_rmsnap(MDRequest *mdr) // prepare if (!mdr->more()->stid) { mds->snapclient->prepare_destroy(diri->ino(), snapid, - &mdr->more()->stid, + &mdr->more()->stid, &mdr->more()->snapidbl, new C_MDS_RetryRequest(mds->mdcache, mdr)); return; } version_t stid = mdr->more()->stid; - dout(10) << " stid is " << stid << dendl; + bufferlist::iterator p = mdr->more()->snapidbl.begin(); + snapid_t seq; + ::decode(seq, p); + dout(10) << " stid is " << stid << ", seq is " << seq << dendl; // journal inode_t *pi = diri->project_inode(); @@ -5204,8 +5207,8 @@ void Server::handle_client_rmsnap(MDRequest *mdr) snapid_t old_ld = diri->snaprealm->last_destroyed; SnapInfo old_info = diri->snaprealm->snaps[snapid]; diri->snaprealm->snaps.erase(snapid); - diri->snaprealm->seq = stid; - diri->snaprealm->last_destroyed = stid; + diri->snaprealm->seq = seq; + diri->snaprealm->last_destroyed = seq; diri->encode_snap_blob(snapbl); diri->snaprealm->snaps[snapid] = old_info; diri->snaprealm->seq = old_seq; @@ -5219,6 +5222,9 @@ void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid) { dout(10) << "_rmsnap_finish " << *mdr << " " << snapid << dendl; snapid_t stid = mdr->more()->stid; + bufferlist::iterator p = mdr->more()->snapidbl.begin(); + snapid_t seq; + ::decode(seq, p); diri->pop_and_dirty_projected_inode(mdr->ls); mdr->apply(); @@ -5227,8 +5233,8 @@ void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid) // remove snap diri->snaprealm->snaps.erase(snapid); - diri->snaprealm->last_destroyed = stid; - diri->snaprealm->seq = stid; + diri->snaprealm->last_destroyed = seq; + diri->snaprealm->seq = seq; dout(10) << "snaprealm now " << *diri->snaprealm << dendl; mdcache->do_realm_invalidate_and_update_notify(diri, CEPH_SNAP_OP_DESTROY); diff --git a/src/mds/SnapClient.h b/src/mds/SnapClient.h index cb618c8e2ad..e995a30cfe6 100644 --- a/src/mds/SnapClient.h +++ b/src/mds/SnapClient.h @@ -40,21 +40,21 @@ public: _prepare(bl, pstid, pbl, onfinish); } - void prepare_create_realm(inodeno_t ino, version_t *pstid, Context *onfinish) { + void prepare_create_realm(inodeno_t ino, version_t *pstid, bufferlist *pbl, Context *onfinish) { bufferlist bl; __u32 op = TABLE_OP_CREATE; ::encode(op, bl); ::encode(ino, bl); - _prepare(bl, pstid, 0, onfinish); + _prepare(bl, pstid, pbl, onfinish); } - void prepare_destroy(inodeno_t ino, snapid_t snapid, version_t *pstid, Context *onfinish) { + void prepare_destroy(inodeno_t ino, snapid_t snapid, version_t *pstid, bufferlist *pbl, Context *onfinish) { bufferlist bl; __u32 op = TABLE_OP_DESTROY; ::encode(op, bl); ::encode(ino, bl); ::encode(snapid, bl); - _prepare(bl, pstid, 0, onfinish); + _prepare(bl, pstid, pbl, onfinish); } }; diff --git a/src/mds/SnapServer.cc b/src/mds/SnapServer.cc index d63b27d6177..d6eb9a42598 100644 --- a/src/mds/SnapServer.cc +++ b/src/mds/SnapServer.cc @@ -61,12 +61,12 @@ void SnapServer::_prepare(bufferlist &bl, __u64 reqid, int bymds) info.snapid = ++last_snap; pending_create[version] = info; dout(10) << "prepare v" << version << " create " << info << dendl; - bl.clear(); - ::encode(info.snapid, bl); } else { pending_noop.insert(version); dout(10) << "prepare v" << version << " noop" << dendl; } + bl.clear(); + ::encode(last_snap, bl); } break;