]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mds/Migrator.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / mds / Migrator.h
index d718a7ac48fac450e60f201d61341c50b000e591..e237463abccc84dc7f2fbd25e537d0de2469faee 100644 (file)
 
 #include "include/types.h"
 
+#include "MDSContext.h"
+
 #include <map>
 #include <list>
 #include <set>
-using std::map;
-using std::list;
-using std::set;
-
+#include <string_view>
 
 class MDSRank;
 class CDir;
@@ -33,20 +32,19 @@ class CInode;
 class CDentry;
 class Session;
 
-class MExportDirDiscover;
-class MExportDirDiscoverAck;
-class MExportDirCancel;
-class MExportDirPrep;
-class MExportDirPrepAck;
-class MExportDir;
-class MExportDirAck;
-class MExportDirNotify;
-class MExportDirNotifyAck;
-class MExportDirFinish;
-
-class MExportCaps;
-class MExportCapsAck;
-class MGatherCaps;
+#include "messages/MExportCaps.h"
+#include "messages/MExportCapsAck.h"
+#include "messages/MExportDir.h"
+#include "messages/MExportDirAck.h"
+#include "messages/MExportDirCancel.h"
+#include "messages/MExportDirDiscover.h"
+#include "messages/MExportDirDiscoverAck.h"
+#include "messages/MExportDirFinish.h"
+#include "messages/MExportDirNotify.h"
+#include "messages/MExportDirNotifyAck.h"
+#include "messages/MExportDirPrep.h"
+#include "messages/MExportDirPrepAck.h"
+#include "messages/MGatherCaps.h"
 
 class EImportStart;
 
@@ -63,7 +61,7 @@ public:
   const static int EXPORT_EXPORTING    = 7;  // sent actual export, waiting for ack
   const static int EXPORT_LOGGINGFINISH        = 8;  // logging EExportFinish
   const static int EXPORT_NOTIFYING    = 9;  // waiting for notifyacks
-  static const char *get_export_statename(int s) {
+  static std::string_view get_export_statename(int s) {
     switch (s) {
     case EXPORT_CANCELLING: return "cancelling";
     case EXPORT_LOCKING: return "locking";
@@ -74,7 +72,7 @@ public:
     case EXPORT_EXPORTING: return "exporting";
     case EXPORT_LOGGINGFINISH: return "loggingfinish";
     case EXPORT_NOTIFYING: return "notifying";
-    default: ceph_abort(); return 0;
+    default: ceph_abort(); return std::string_view();
     }
   }
 
@@ -87,7 +85,7 @@ public:
   const static int IMPORT_ACKING        = 6; // logged EImportStart, sent ack, waiting for finish
   const static int IMPORT_FINISHING     = 7; // sent cap imports, waiting for finish
   const static int IMPORT_ABORTING      = 8; // notifying bystanders of an abort before unfreezing
-  static const char *get_import_statename(int s) {
+  static std::string_view get_import_statename(int s) {
     switch (s) {
     case IMPORT_DISCOVERING: return "discovering";
     case IMPORT_DISCOVERED: return "discovered";
@@ -97,14 +95,14 @@ public:
     case IMPORT_ACKING: return "acking";
     case IMPORT_FINISHING: return "finishing";
     case IMPORT_ABORTING: return "aborting";
-    default: ceph_abort(); return 0;
+    default: ceph_abort(); return std::string_view();
     }
   }
 
   // -- cons --
   Migrator(MDSRank *m, MDCache *c);
 
-  void handle_conf_change(const struct md_config_t *conf,
+  void handle_conf_change(const ConfigProxy& conf,
                           const std::set <std::string> &changed,
                           const MDSMap &mds_map);
 
@@ -124,12 +122,11 @@ protected:
     int state = 0;
     mds_rank_t peer = MDS_RANK_NONE;
     uint64_t tid = 0;
-    set<mds_rank_t> warning_ack_waiting;
-    set<mds_rank_t> notify_ack_waiting;
-    map<inodeno_t,map<client_t,Capability::Import> > peer_imported;
+    std::set<mds_rank_t> warning_ack_waiting;
+    std::set<mds_rank_t> notify_ack_waiting;
+    std::map<inodeno_t,std::map<client_t,Capability::Import> > peer_imported;
     MutationRef mut;
     size_t approx_size = 0;
-    size_t orig_size = 0;
     // for freeze tree deadlock detection
     utime_t last_cum_auth_pins_change;
     int last_cum_auth_pins = 0;
@@ -138,13 +135,13 @@ protected:
 
     std::shared_ptr<export_base_t> parent;
   };
-  map<CDir*, export_state_t>  export_state;
+  std::map<CDir*, export_state_t>  export_state;
   typedef map<CDir*, export_state_t>::iterator export_state_iterator;
 
   uint64_t total_exporting_size = 0;
   unsigned num_locking_exports = 0; // exports in locking state (approx_size == 0)
 
-  list<pair<dirfrag_t,mds_rank_t> >  export_queue;
+  std::list<pair<dirfrag_t,mds_rank_t> >  export_queue;
   uint64_t export_queue_gen = 1;
 
   // import fun
@@ -152,65 +149,67 @@ protected:
     int state;
     mds_rank_t peer;
     uint64_t tid;
-    set<mds_rank_t> bystanders;
-    list<dirfrag_t> bound_ls;
-    list<ScatterLock*> updated_scatterlocks;
-    map<client_t,pair<Session*,uint64_t> > session_map;
-    map<CInode*, map<client_t,Capability::Export> > peer_exports;
+    std::set<mds_rank_t> bystanders;
+    std::list<dirfrag_t> bound_ls;
+    std::list<ScatterLock*> updated_scatterlocks;
+    std::map<client_t,pair<Session*,uint64_t> > session_map;
+    std::map<CInode*, std::map<client_t,Capability::Export> > peer_exports;
     MutationRef mut;
     import_state_t() : state(0), peer(0), tid(0), mut() {}
   };
 
-  map<dirfrag_t, import_state_t>  import_state;
+  std::map<dirfrag_t, import_state_t>  import_state;
 
-  void handle_export_discover_ack(MExportDirDiscoverAck *m);
+  void handle_export_discover_ack(const MExportDirDiscoverAck::const_ref &m);
   void export_frozen(CDir *dir, uint64_t tid);
-  void handle_export_prep_ack(MExportDirPrepAck *m);
+  void handle_export_prep_ack(const MExportDirPrepAck::const_ref &m);
   void export_sessions_flushed(CDir *dir, uint64_t tid);
   void export_go(CDir *dir);
   void export_go_synced(CDir *dir, uint64_t tid);
   void export_try_cancel(CDir *dir, bool notify_peer=true);
   void export_cancel_finish(export_state_iterator& it);
   void export_reverse(CDir *dir, export_state_t& stat);
-  void export_notify_abort(CDir *dir, export_state_t& stat, set<CDir*>& bounds);
-  void handle_export_ack(MExportDirAck *m);
+  void export_notify_abort(CDir *dir, export_state_t& stat, std::set<CDir*>& bounds);
+  void handle_export_ack(const MExportDirAck::const_ref &m);
   void export_logged_finish(CDir *dir);
-  void handle_export_notify_ack(MExportDirNotifyAck *m);
+  void handle_export_notify_ack(const MExportDirNotifyAck::const_ref &m);
   void export_finish(CDir *dir);
 
-  void handle_gather_caps(MGatherCaps *m);
+  void handle_gather_caps(const MGatherCaps::const_ref &m);
 
   friend class C_MDC_ExportFreeze;
   friend class C_MDS_ExportFinishLogged;
   friend class C_M_ExportGo;
   friend class C_M_ExportSessionsFlushed;
+  friend class C_MDS_ExportDiscover;
+  friend class C_MDS_ExportPrep;
   friend class MigratorContext;
   friend class MigratorLogContext;
 
   // importer
-  void handle_export_discover(MExportDirDiscover *m);
-  void handle_export_cancel(MExportDirCancel *m);
-  void handle_export_prep(MExportDirPrep *m);
-  void handle_export_dir(MExportDir *m);
+  void handle_export_discover(const MExportDirDiscover::const_ref &m, bool started=false);
+  void handle_export_cancel(const MExportDirCancel::const_ref &m);
+  void handle_export_prep(const MExportDirPrep::const_ref &m, bool did_assim=false);
+  void handle_export_dir(const MExportDir::const_ref &m);
 
   void import_reverse_discovering(dirfrag_t df);
   void import_reverse_discovered(dirfrag_t df, CInode *diri);
   void import_reverse_prepping(CDir *dir, import_state_t& stat);
-  void import_remove_pins(CDir *dir, set<CDir*>& bounds);
+  void import_remove_pins(CDir *dir, std::set<CDir*>& bounds);
   void import_reverse_unfreeze(CDir *dir);
   void import_reverse_final(CDir *dir);
-  void import_notify_abort(CDir *dir, set<CDir*>& bounds);
-  void import_notify_finish(CDir *dir, set<CDir*>& bounds);
+  void import_notify_abort(CDir *dir, std::set<CDir*>& bounds);
+  void import_notify_finish(CDir *dir, std::set<CDir*>& bounds);
   void import_logged_start(dirfrag_t df, CDir *dir, mds_rank_t from,
-                          map<client_t,pair<Session*,uint64_t> >& imported_session_map);
-  void handle_export_finish(MExportDirFinish *m);
+                          std::map<client_t,pair<Session*,uint64_t> >& imported_session_map);
+  void handle_export_finish(const MExportDirFinish::const_ref &m);
 
-  void handle_export_caps(MExportCaps *m);
-  void handle_export_caps_ack(MExportCapsAck *m);
+  void handle_export_caps(const MExportCaps::const_ref &m);
+  void handle_export_caps_ack(const MExportCapsAck::const_ref &m);
   void logged_import_caps(CInode *in,
                          mds_rank_t from,
-                         map<client_t,pair<Session*,uint64_t> >& imported_session_map,
-                         map<CInode*, map<client_t,Capability::Export> >& cap_imports);
+                         std::map<client_t,pair<Session*,uint64_t> >& imported_session_map,
+                         std::map<CInode*, std::map<client_t,Capability::Export> >& cap_imports);
 
 
   friend class C_MDS_ImportDirLoggedStart;
@@ -218,12 +217,12 @@ protected:
   friend class C_M_LoggedImportCaps;
 
   // bystander
-  void handle_export_notify(MExportDirNotify *m);
+  void handle_export_notify(const MExportDirNotify::const_ref &m);
 
 
 public:
 
-  void dispatch(Message*);
+  void dispatch(const Message::const_ref &);
 
   void show_importing();
   void show_exporting();
@@ -233,42 +232,42 @@ public:
   
   // -- status --
   int is_exporting(CDir *dir) const {
-    map<CDir*, export_state_t>::const_iterator it = export_state.find(dir);
+    auto it = export_state.find(dir);
     if (it != export_state.end()) return it->second.state;
     return 0;
   }
   bool is_exporting() const { return !export_state.empty(); }
   int is_importing(dirfrag_t df) const {
-    map<dirfrag_t, import_state_t>::const_iterator it = import_state.find(df);
+    auto it = import_state.find(df);
     if (it != import_state.end()) return it->second.state;
     return 0;
   }
   bool is_importing() const { return !import_state.empty(); }
 
   bool is_ambiguous_import(dirfrag_t df) const {
-    map<dirfrag_t, import_state_t>::const_iterator p = import_state.find(df);
-    if (p == import_state.end())
+    auto it = import_state.find(df);
+    if (it == import_state.end())
       return false;
-    if (p->second.state >= IMPORT_LOGGINGSTART &&
-       p->second.state < IMPORT_ABORTING)
+    if (it->second.state >= IMPORT_LOGGINGSTART &&
+       it->second.state < IMPORT_ABORTING)
       return true;
     return false;
   }
 
   int get_import_state(dirfrag_t df) const {
-    map<dirfrag_t, import_state_t>::const_iterator it = import_state.find(df);
-    assert(it != import_state.end());
+    auto it = import_state.find(df);
+    ceph_assert(it != import_state.end());
     return it->second.state;
   }
   int get_import_peer(dirfrag_t df) const {
-    map<dirfrag_t, import_state_t>::const_iterator it = import_state.find(df);
-    assert(it != import_state.end());
+    auto it = import_state.find(df);
+    ceph_assert(it != import_state.end());
     return it->second.peer;
   }
 
   int get_export_state(CDir *dir) const {
-    map<CDir*, export_state_t>::const_iterator it = export_state.find(dir);
-    assert(it != export_state.end());
+    auto it = export_state.find(dir);
+    ceph_assert(it != export_state.end());
     return it->second.state;
   }
   // this returns true if we are export @dir,
@@ -276,22 +275,22 @@ public:
   // be warned of ambiguous auth.
   // only returns meaningful results during EXPORT_WARNING state.
   bool export_has_warned(CDir *dir, mds_rank_t who) {
-    map<CDir*, export_state_t>::iterator it = export_state.find(dir);
-    assert(it != export_state.end());
-    assert(it->second.state == EXPORT_WARNING);
+    auto it = export_state.find(dir);
+    ceph_assert(it != export_state.end());
+    ceph_assert(it->second.state == EXPORT_WARNING);
     return (it->second.warning_ack_waiting.count(who) == 0);
   }
 
   bool export_has_notified(CDir *dir, mds_rank_t who) const {
-    map<CDir*, export_state_t>::const_iterator it = export_state.find(dir);
-    assert(it != export_state.end());
-    assert(it->second.state == EXPORT_NOTIFYING);
+    auto it = export_state.find(dir);
+    ceph_assert(it != export_state.end());
+    ceph_assert(it->second.state == EXPORT_NOTIFYING);
     return (it->second.notify_ack_waiting.count(who) == 0);
   }
 
   void export_freeze_inc_num_waiters(CDir *dir) {
-    map<CDir*, export_state_t>::iterator it = export_state.find(dir);
-    assert(it != export_state.end());
+    auto it = export_state.find(dir);
+    ceph_assert(it != export_state.end());
     it->second.num_remote_waiters++;
   }
   void find_stale_export_freeze();
@@ -316,55 +315,54 @@ public:
   
   void maybe_split_export(CDir* dir, uint64_t max_size, bool null_okay,
                          vector<pair<CDir*, size_t> >& results);
-  void restart_export_dir(CDir *dir, uint64_t tid);
-  bool adjust_export_size(export_state_t &stat, CDir *dir);
-  void adjust_export_after_rename(CInode* diri, CDir *olddir);
   void child_export_finish(std::shared_ptr<export_base_t>& parent, bool success);
 
-  void get_export_lock_set(CDir *dir, set<SimpleLock*>& locks);
-  void get_export_client_set(CDir *dir, set<client_t> &client_set);
-  void get_export_client_set(CInode *in, set<client_t> &client_set);
+  void get_export_lock_set(CDir *dir, MutationImpl::LockOpVec& lov);
+  void get_export_client_set(CDir *dir, std::set<client_t> &client_set);
+  void get_export_client_set(CInode *in, std::set<client_t> &client_set);
 
   void encode_export_inode(CInode *in, bufferlist& bl, 
-                          map<client_t,entity_inst_t>& exported_client_map);
+                          std::map<client_t,entity_inst_t>& exported_client_map,
+                          std::map<client_t,client_metadata_t>& exported_client_metadata_map);
   void encode_export_inode_caps(CInode *in, bool auth_cap, bufferlist& bl,
-                               map<client_t,entity_inst_t>& exported_client_map);
-  void finish_export_inode(CInode *in, utime_t now, mds_rank_t target,
-                          map<client_t,Capability::Import>& peer_imported,
-                          list<MDSInternalContextBase*>& finished);
+                               std::map<client_t,entity_inst_t>& exported_client_map,
+                               std::map<client_t,client_metadata_t>& exported_client_metadata_map);
+  void finish_export_inode(CInode *in, mds_rank_t target,
+                          std::map<client_t,Capability::Import>& peer_imported,
+                          MDSContext::vec& finished);
   void finish_export_inode_caps(CInode *in, mds_rank_t target,
-                               map<client_t,Capability::Import>& peer_imported);
+                               std::map<client_t,Capability::Import>& peer_imported);
 
 
   uint64_t encode_export_dir(bufferlist& exportbl,
                        CDir *dir,
-                       map<client_t,entity_inst_t>& exported_client_map,
-                       utime_t now);
-  void finish_export_dir(CDir *dir, utime_t now, mds_rank_t target,
-                        map<inodeno_t,map<client_t,Capability::Import> >& peer_imported,
-                        list<MDSInternalContextBase*>& finished, int *num_dentries);
+                       std::map<client_t,entity_inst_t>& exported_client_map,
+                       std::map<client_t,client_metadata_t>& exported_client_metadata_map);
+  void finish_export_dir(CDir *dir, mds_rank_t target,
+                        std::map<inodeno_t,std::map<client_t,Capability::Import> >& peer_imported,
+                        MDSContext::vec& finished, int *num_dentries);
 
   void clear_export_proxy_pins(CDir *dir);
 
   void export_caps(CInode *in);
 
-  void decode_import_inode(CDentry *dn, bufferlist::iterator& blp,
+  void decode_import_inode(CDentry *dn, bufferlist::const_iterator& blp,
                           mds_rank_t oldauth, LogSegment *ls,
-                          map<CInode*, map<client_t,Capability::Export> >& cap_imports,
-                          list<ScatterLock*>& updated_scatterlocks);
-  void decode_import_inode_caps(CInode *in, bool auth_cap, bufferlist::iterator &blp,
-                               map<CInode*, map<client_t,Capability::Export> >& cap_imports);
+                          std::map<CInode*, std::map<client_t,Capability::Export> >& cap_imports,
+                          std::list<ScatterLock*>& updated_scatterlocks);
+  void decode_import_inode_caps(CInode *in, bool auth_cap, bufferlist::const_iterator &blp,
+                               std::map<CInode*, std::map<client_t,Capability::Export> >& cap_imports);
   void finish_import_inode_caps(CInode *in, mds_rank_t from, bool auth_cap,
-                               const map<client_t,pair<Session*,uint64_t> >& smap,
-                               const map<client_t,Capability::Export> &export_map,
-                               map<client_t,Capability::Import> &import_map);
-  int decode_import_dir(bufferlist::iterator& blp,
+                               const std::map<client_t,pair<Session*,uint64_t> >& smap,
+                               const std::map<client_t,Capability::Export> &export_map,
+                               std::map<client_t,Capability::Import> &import_map);
+  int decode_import_dir(bufferlist::const_iterator& blp,
                        mds_rank_t oldauth,
                        CDir *import_root,
                        EImportStart *le, 
                        LogSegment *ls,
-                       map<CInode*, map<client_t,Capability::Export> >& cap_imports,
-                       list<ScatterLock*>& updated_scatterlocks, utime_t now);
+                       std::map<CInode*, std::map<client_t,Capability::Export> >& cap_imports,
+                       std::list<ScatterLock*>& updated_scatterlocks);
 
   void import_reverse(CDir *dir);
 
@@ -375,7 +373,6 @@ private:
   MDCache *cache;
   uint64_t max_export_size = 0;
   bool inject_session_race = false;
-  int inject_message_loss = 0;
 };
 
 #endif