]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon: prime MgrClient only after messengers are initialized
authorSage Weil <sage@redhat.com>
Sun, 3 Feb 2019 19:58:48 +0000 (13:58 -0600)
committerSage Weil <sage@redhat.com>
Thu, 7 Feb 2019 18:10:34 +0000 (12:10 -0600)
If we do it earlier we may crash due to an uninitialised messenger
auth_client.

Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/MgrMonitor.cc
src/mon/MgrMonitor.h
src/mon/Monitor.cc
src/mon/Monitor.h

index 5f2402fb08d821f0d6fd7e06658e6eb926b7aa98..94b5922cd0f24841f00a3926a1d560b632c58546 100644 (file)
@@ -213,7 +213,15 @@ void MgrMonitor::update_from_paxos(bool *need_bootstrap)
   // pointers into our mgr_module_options (which we just rebuilt).
   mon->configmon()->load_config();
 
-  // feed our pet MgrClient
+  if (!mon->is_init()) {
+    // feed our pet MgrClient, unless we are in Monitor::[pre]init()
+    prime_mgr_client();
+  }
+}
+
+void MgrMonitor::prime_mgr_client()
+{
+  dout(10) << __func__ << dendl;
   mon->mgr_client.ms_dispatch(new MMgrMap(map));
 }
 
index d8cfc0e5dd0c9d434bc20eb1f649d0875c3fc7b8..0fc031403b25179927e9394fbe4da3256bcb570e 100644 (file)
@@ -87,6 +87,8 @@ public:
 
   version_t get_trim_to() const override;
 
+  void prime_mgr_client();
+
   void create_initial() override;
   void get_store_prefixes(std::set<string>& s) const override;
   void update_from_paxos(bool *need_bootstrap) override;
index 7f271e8e37728dc966dd81a81677b44fb3674eea..666eeacce375655f05abdf5e0cdc788cd04dd453 100644 (file)
@@ -156,8 +156,6 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s,
   gss_ktfile_client(cct->_conf.get_val<std::string>("gss_ktab_client_file")),
   store(s),
   
-  state(STATE_PROBING),
-  
   elector(this),
   required_features(0),
   leader(0),
@@ -882,10 +880,13 @@ int Monitor::init()
   // i'm ready!
   messenger->add_dispatcher_tail(this);
 
+  // kickstart pet mgrclient
   mgr_client.init();
   mgr_messenger->add_dispatcher_tail(&mgr_client);
   mgr_messenger->add_dispatcher_tail(this);  // for auth ms_* calls
+  mgrmon()->prime_mgr_client();
 
+  state = STATE_PROBING;
   bootstrap();
   // add features of myself into feature_map
   session_map.feature_map.add_mon(con_self->get_features());
index 6c528ab522f51da54ba478b061c349de5a206edf..80d7b7ad11d86e358ae583ea4aa74a079a6a245e 100644 (file)
@@ -195,14 +195,15 @@ public:
   // -- monitor state --
 private:
   enum {
-    STATE_PROBING = 1,
+    STATE_INIT = 1,
+    STATE_PROBING,
     STATE_SYNCHRONIZING,
     STATE_ELECTING,
     STATE_LEADER,
     STATE_PEON,
     STATE_SHUTDOWN
   };
-  int state;
+  int state = STATE_INIT;
 
 public:
   static const char *get_state_name(int s) {
@@ -220,6 +221,7 @@ public:
     return get_state_name(state);
   }
 
+  bool is_init() const { return state == STATE_INIT; }
   bool is_shutdown() const { return state == STATE_SHUTDOWN; }
   bool is_probing() const { return state == STATE_PROBING; }
   bool is_synchronizing() const { return state == STATE_SYNCHRONIZING; }