]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mds/SnapServer.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / mds / SnapServer.h
index 3eceaaef7a7fb18d1e6d67c40b888effbbf769b8..50925e9553ed7bc565a4f59453b7303eacf9caee 100644 (file)
@@ -23,8 +23,10 @@ class MonClient;
 
 class SnapServer : public MDSTableServer {
 protected:
-  MonClient *mon_client;
-  snapid_t last_snap;
+  MonClient *mon_client = nullptr;
+  snapid_t last_snap = 0;
+  snapid_t last_created, last_destroyed;
+  snapid_t snaprealm_v2_since;
   map<snapid_t, SnapInfo> snaps;
   map<int, set<snapid_t> > need_to_purge;
   
@@ -34,60 +36,112 @@ protected:
 
   version_t last_checked_osdmap;
 
-public:
-  SnapServer(MDSRank *m, MonClient *monc)
-    : MDSTableServer(m, TABLE_SNAP), mon_client(monc), last_checked_osdmap(0)
-  {}
-    
-  void reset_state() override;
+  bool root_scrubbed = false; // all snaprealms under root are converted?
+  bool mdsdir_scrubbed = false; // all snaprealms under ~mds0 are converted?
+
   void encode_server_state(bufferlist& bl) const override {
-    ENCODE_START(3, 3, bl);
-    ::encode(last_snap, bl);
-    ::encode(snaps, bl);
-    ::encode(need_to_purge, bl);
-    ::encode(pending_update, bl);
-    ::encode(pending_destroy, bl);
-    ::encode(pending_noop, bl);
+    ENCODE_START(5, 3, bl);
+    encode(last_snap, bl);
+    encode(snaps, bl);
+    encode(need_to_purge, bl);
+    encode(pending_update, bl);
+    encode(pending_destroy, bl);
+    encode(pending_noop, bl);
+    encode(last_created, bl);
+    encode(last_destroyed, bl);
+    encode(snaprealm_v2_since, bl);
     ENCODE_FINISH(bl);
   }
-  void decode_server_state(bufferlist::iterator& bl) override {
-    DECODE_START_LEGACY_COMPAT_LEN(3, 3, 3, bl);
-    ::decode(last_snap, bl);
-    ::decode(snaps, bl);
-    ::decode(need_to_purge, bl);
-    ::decode(pending_update, bl);
+  void decode_server_state(bufferlist::const_iterator& bl) override {
+    DECODE_START_LEGACY_COMPAT_LEN(5, 3, 3, bl);
+    decode(last_snap, bl);
+    decode(snaps, bl);
+    decode(need_to_purge, bl);
+    decode(pending_update, bl);
     if (struct_v >= 2)
-      ::decode(pending_destroy, bl);
+      decode(pending_destroy, bl);
     else {
       map<version_t, snapid_t> t;
-      ::decode(t, bl);
+      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);
+    decode(pending_noop, bl);
+    if (struct_v >= 4) {
+      decode(last_created, bl);
+      decode(last_destroyed, bl);
+    } else {
+      last_created = last_snap;
+      last_destroyed = last_snap;
+    }
+    if (struct_v >= 5)
+      decode(snaprealm_v2_since, bl);
+    else
+      snaprealm_v2_since = CEPH_NOSNAP;
+
     DECODE_FINISH(bl);
   }
 
-  // To permit enc/decoding in isolation in dencoder
+  // server bits
+  void _prepare(const bufferlist &bl, uint64_t reqid, mds_rank_t bymds, bufferlist &out) override;
+  void _get_reply_buffer(version_t tid, bufferlist *pbl) const override;
+  void _commit(version_t tid, MMDSTableRequest::const_ref req) override;
+  void _rollback(version_t tid) override;
+  void _server_update(bufferlist& bl) override;
+  bool _notify_prep(version_t tid) override;
+  void handle_query(const MMDSTableRequest::const_ref &m) override;
+
+public:
+  SnapServer(MDSRank *m, MonClient *monc)
+    : MDSTableServer(m, TABLE_SNAP), mon_client(monc), last_checked_osdmap(0) {}
   SnapServer() : MDSTableServer(NULL, TABLE_SNAP), last_checked_osdmap(0) {}
+
+  void reset_state() override;
+
+  bool upgrade_format() {
+    // upgraded from old filesystem
+    ceph_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) {
+    if (ino ==  MDS_INO_ROOT)
+      root_scrubbed = true;
+    else if (ino == MDS_INO_MDSDIR(rank))
+      mdsdir_scrubbed = true;
+    else
+      ceph_abort();
+  }
+  bool can_allow_multimds_snaps() const {
+    return (root_scrubbed && mdsdir_scrubbed) ||
+          snaps.empty() || snaps.begin()->first >= snaprealm_v2_since;
+  }
+
   void encode(bufferlist& bl) const {
     encode_server_state(bl);
   }
-  void decode(bufferlist::iterator& bl) {
+  void decode(bufferlist::const_iterator& bl) {
     decode_server_state(bl);
   }
+
   void dump(Formatter *f) const;
   static void generate_test_instances(list<SnapServer*>& ls);
 
-  // server bits
-  void _prepare(bufferlist &bl, uint64_t reqid, mds_rank_t bymds) override;
-  bool _is_prepared(version_t tid) const;
-  bool _commit(version_t tid, MMDSTableRequest *req=NULL) override;
-  void _rollback(version_t tid) override;
-  void _server_update(bufferlist& bl) override;
-  void handle_query(MMDSTableRequest *m) override;
-
-  void check_osd_map(bool force);
+  bool force_update(snapid_t last, snapid_t v2_since,
+                   map<snapid_t, SnapInfo>& _snaps);
 };
 WRITE_CLASS_ENCODER(SnapServer)