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);
}
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;
if (struct_v >= 5)
decode(snaprealm_v2_since, bl);
else
- snaprealm_v2_since = last_snap + 1;
+ snaprealm_v2_since = CEPH_NOSNAP;
DECODE_FINISH(bl);
}
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) {