From: Yan, Zheng Date: Sat, 28 Apr 2018 03:16:52 +0000 (+0800) Subject: mds: initialize SnapServer::snaprealm_v2_since after journal replay X-Git-Tag: v13.1.0~2^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aedd5301dcb801d8c9ecdd3e14704d3230585a24;p=ceph.git mds: initialize SnapServer::snaprealm_v2_since after journal replay Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 35826924fde..b8c839897af 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -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); } diff --git a/src/mds/SnapServer.h b/src/mds/SnapServer.h index bcc02e2d447..7b9c4af9e47 100644 --- a/src/mds/SnapServer.h +++ b/src/mds/SnapServer.h @@ -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 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) {