]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: initialize SnapServer::snaprealm_v2_since after journal replay
authorYan, Zheng <zyan@redhat.com>
Sat, 28 Apr 2018 03:16:52 +0000 (11:16 +0800)
committerYan, Zheng <zyan@redhat.com>
Sat, 28 Apr 2018 03:26:23 +0000 (11:26 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDSRank.cc
src/mds/SnapServer.h

index 35826924fde496efc456cc45c2ec095c36e90b08..b8c839897af5a20b31c80f61f167ebc85410e37c 100644 (file)
@@ -1373,10 +1373,8 @@ void MDSRank::replay_done()
   mdlog->get_journaler()->trim_tail();
 
   if (mdsmap->get_tableserver() == whoami &&
-      snapserver->get_version() == 0) {
-    // upgraded from old filesystem. version 0 snaptable confuses current code.
-    dout(1) << "upgrading snaptable version from 0 to 1" << dendl;
-    snapserver->reset();
+      snapserver->upgrade_format()) {
+    dout(1) << "upgrading snaptable format" << dendl;
     snapserver->save(new C_MDSInternalNoop);
   }
 
index bcc02e2d447ede4aabdc6db4bec8e3286188213c..7b9c4af9e47fd5863f62d3fd14637abbf7b942e9 100644 (file)
@@ -24,7 +24,7 @@ class MonClient;
 class SnapServer : public MDSTableServer {
 protected:
   MonClient *mon_client = nullptr;
-  snapid_t last_snap;
+  snapid_t last_snap = 0;
   snapid_t last_created, last_destroyed;
   snapid_t snaprealm_v2_since;
   map<snapid_t, SnapInfo> snaps;
@@ -77,7 +77,7 @@ protected:
     if (struct_v >= 5)
       decode(snaprealm_v2_since, bl);
     else
-      snaprealm_v2_since = last_snap + 1;
+      snaprealm_v2_since = CEPH_NOSNAP;
 
     DECODE_FINISH(bl);
   }
@@ -98,6 +98,23 @@ public:
 
   void reset_state() override;
 
+  bool upgrade_format() {
+    // upgraded from old filesystem
+    assert(last_snap > 0);
+    bool upgraded = false;
+    if (get_version() == 0) {
+      // version 0 confuses snapclient code
+      reset_state();
+      upgraded = true;
+    }
+    if (snaprealm_v2_since == CEPH_NOSNAP) {
+      // new snapshots will have new format snaprealms
+      snaprealm_v2_since = last_snap + 1;
+      upgraded = true;
+    }
+    return upgraded;
+  }
+
   void check_osd_map(bool force);
 
   void mark_base_recursively_scrubbed(inodeno_t ino) {