]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add removal snap_seq to removed_snaps
authorSage Weil <sage@newdream.net>
Mon, 3 May 2010 23:41:16 +0000 (16:41 -0700)
committerSage Weil <sage@newdream.net>
Mon, 3 May 2010 23:41:16 +0000 (16:41 -0700)
This prevents lots of fragmentation in removed_snaps interval set.

src/mds/SnapServer.cc
src/mds/SnapServer.h

index 2434b6821245e09b3d892c05fedbb0280c9cf02d..b576c76c006222d0a2e051374ae25277e3a70698 100644 (file)
@@ -75,12 +75,14 @@ void SnapServer::_prepare(bufferlist &bl, __u64 reqid, int bymds)
       ::decode(ino, p);    // not used, currently.
       ::decode(snapid, p);
       version++;
-      pending_destroy[version] = snapid;
-      dout(10) << "prepare v" << version << " destroy " << snapid << dendl;
 
       // bump last_snap... we use it as a version value on the snaprealm.
-      bl.clear();
       ++last_snap;
+
+      pending_destroy[version] = pair<snapid_t,snapid_t>(snapid, last_snap);
+      dout(10) << "prepare v" << version << " destroy " << snapid << " seq " << last_snap << dendl;
+
+      bl.clear();
       ::encode(last_snap, bl);
     }
     break;
@@ -107,14 +109,17 @@ void SnapServer::_commit(version_t tid)
   } 
 
   else if (pending_destroy.count(tid)) {
-    snapid_t sn = pending_destroy[tid];
-    dout(7) << "commit " << tid << " destroy " << sn << dendl;
+    snapid_t sn = pending_destroy[tid].first;
+    snapid_t seq = pending_destroy[tid].second;
+    dout(7) << "commit " << tid << " destroy " << sn << " seq " << seq << dendl;
     snaps.erase(sn);
 
     for (vector<__u32>::const_iterator p = mds->mdsmap->get_data_pg_pools().begin();
         p != mds->mdsmap->get_data_pg_pools().end();
-        p++)
+        p++) {
       need_to_purge[*p].insert(sn);
+      need_to_purge[*p].insert(seq);
+    }
 
     pending_destroy.erase(tid);
   }
index 8380786b8d69c43e201932a2919814e0c1a707fe..a8783f1c63d0910ee6343528de3464c26faeffd8 100644 (file)
@@ -29,7 +29,7 @@ protected:
   map<int, set<snapid_t> > need_to_purge;
   
   map<version_t, SnapInfo> pending_create;
-  map<version_t, snapid_t> pending_destroy;
+  map<version_t, pair<snapid_t,snapid_t> > pending_destroy; // (removed_snap, seq)
   set<version_t>           pending_noop;
 
   version_t last_checked_osdmap;
@@ -40,7 +40,7 @@ public:
     
   void reset_state();
   void encode_server_state(bufferlist& bl) {
-    __u8 v = 1;
+    __u8 v = 2;
     ::encode(v, bl);
     ::encode(last_snap, bl);
     ::encode(snaps, bl);
@@ -56,7 +56,14 @@ public:
     ::decode(snaps, bl);
     ::decode(need_to_purge, bl);
     ::decode(pending_create, bl);
-    ::decode(pending_destroy, bl);
+    if (v >= 2)
+      ::decode(pending_destroy, bl);
+    else {
+      map<version_t, snapid_t> t;
+      ::decode(t, bl);
+      for (map<version_t, snapid_t>::iterator p = t.begin(); p != t.end(); p++)
+       pending_destroy[p->first].first = p->second; 
+    } 
     ::decode(pending_noop, bl);
   }