From 69322e73a4913bf378f9f8b774370352b1be6685 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 29 Sep 2009 16:40:53 -0700 Subject: [PATCH] auth: fix osd init sequence --- src/mon/MonClient.cc | 74 +++++++++++++++++++++++++++++++++++--------- src/mon/MonClient.h | 29 +++++------------ src/osd/OSD.cc | 2 ++ 3 files changed, 69 insertions(+), 36 deletions(-) diff --git a/src/mon/MonClient.cc b/src/mon/MonClient.cc index 92169619e9095..52c26368be08e 100644 --- a/src/mon/MonClient.cc +++ b/src/mon/MonClient.cc @@ -313,7 +313,8 @@ void MonClient::handle_auth(MAuthReply *m) auth.send_session_request(this, &auth_handler, 30.0); } else { state = MC_STATE_AUTHENTICATED; - _reopen_session(); + authenticate_cond.SignalAll(); + _open_session(); } } @@ -348,12 +349,12 @@ void MonClient::_pick_new_mon() dout(10) << "_pick_new_mon picked mon" << cur_mon << dendl; } -void MonClient::_reopen_session() +void MonClient::_open_session() { - dout(10) << "_reopen_session" << dendl; + dout(10) << "_open_session" << dendl; _pick_new_mon(); - dout(0) << "_reopen_session 0" << dendl; + dout(0) << "_open_session 0" << dendl; if (state == MC_STATE_NONE) { state = MC_STATE_AUTHENTICATING; auth.send_session_request(this, &auth_handler, 30.0); @@ -363,9 +364,11 @@ void MonClient::_reopen_session() if (state == MC_STATE_AUTHENTICATING) return; - if (g_keyring.need_rotating_secrets()) - _start_auth_rotating(KEY_ROTATE_TIME); - dout(0) << "_reopen_session 2" << dendl; + if (g_keyring.need_rotating_secrets()) { + _start_auth_rotating(); + //_wait_auth_rotating(KEY_ROTATE_TIME); + } + dout(0) << "_open_session 2" << dendl; if (mounting) _send_mount(); @@ -376,6 +379,14 @@ void MonClient::_reopen_session() } } +void MonClient::_reopen_session() +{ + dout(10) << "_reopen_session" << dendl; + _pick_new_mon(); + _open_session(); +} + + bool MonClient::ms_handle_reset(Connection *con, const entity_addr_t& peer) { dout(10) << "ms_handle_reset " << peer << dendl; @@ -402,7 +413,7 @@ void MonClient::tick() if (g_keyring.need_rotating_secrets()) { dout(0) << "MonClient::tick: need rotating secret" << dendl; - _start_auth_rotating(KEY_ROTATE_TIME); + _start_auth_rotating(); } if (state == MC_STATE_NONE) { @@ -470,12 +481,25 @@ void MonClient::handle_subscribe_ack(MMonSubscribeAck *m) delete m; } +int MonClient::wait_authenticate(double timeout) +{ + Mutex::Locker l(monc_lock); + utime_t interval; + interval += timeout; + + int ret = authenticate_cond.WaitInterval(monc_lock, interval); + + dout(0) << "wait_authenticate ended, returned " << ret << dendl; + + return ret; +} + int MonClient::authorize(double timeout) { return auth.authorize(CEPHX_PRINCIPAL_MON, timeout); } -int MonClient::_start_auth_rotating(double timeout) +int MonClient::_start_auth_rotating() { if (entity_name.entity_type != CEPHX_PRINCIPAL_OSD) return 0; @@ -486,8 +510,9 @@ int MonClient::_start_auth_rotating(double timeout) m->entity_name = entity_name; + dout(0) << "MonClient::_start_auth_rotating sending message" << dendl; _send_mon_message(m); - +#if 0 auth_timeout_event = new C_AuthRotatingTimeout(this, timeout); if (!auth_timeout_event) return -ENOMEM; @@ -506,18 +531,39 @@ int MonClient::_start_auth_rotating(double timeout) timer.cancel_event(auth_timeout_event); auth_timeout_event = NULL; } +#endif return 0; } -void MonClient::handle_auth_rotating_response(MAuthRotating *m) +int MonClient::_wait_auth_rotating(double timeout) +{ + utime_t interval; + interval += timeout; + + int ret = auth_cond.WaitInterval(monc_lock, interval); + + return ret; +} + +int MonClient::wait_auth_rotating(double timeout) { Mutex::Locker l(monc_lock); - if (auth_got_timeout) - return; + if (entity_name.entity_type != CEPHX_PRINCIPAL_OSD) + return 0; + + if (!g_keyring.need_rotating_secrets()) + return 0; + + return _wait_auth_rotating(timeout); +} + +void MonClient::handle_auth_rotating_response(MAuthRotating *m) +{ + Mutex::Locker l(monc_lock); - auth_cond.Signal(); + auth_cond.SignalAll(); dout(0) << "MonClient::handle_auth_rotating_response got_response status=" << m->status << " length=" << m->response_bl.length() << dendl; diff --git a/src/mon/MonClient.h b/src/mon/MonClient.h index 9bad754c0fb5b..88e17227f5254 100644 --- a/src/mon/MonClient.h +++ b/src/mon/MonClient.h @@ -80,23 +80,8 @@ private: }; void tick(); - Context *auth_timeout_event; - bool auth_got_timeout; Cond auth_cond; - class C_AuthRotatingTimeout : public Context { - protected: - MonClient *client; - double timeout; - public: - C_AuthRotatingTimeout(MonClient *c, double to) : - client(c), timeout(to) { - } - void finish(int r) { - if (r >= 0) client->_auth_rotating_timeout(timeout); - } - }; - void handle_auth_rotating_response(MAuthRotating *m); // monclient bool want_monmap; @@ -107,9 +92,11 @@ private: int mounting; int mount_err; Cond mount_cond, map_cond; + Cond authenticate_cond; utime_t mount_started; void _finish_hunting(); + void _open_session(); void _reopen_session(); void _pick_new_mon(); void _send_mon_message(Message *m); @@ -118,16 +105,16 @@ private: public: void set_entity_name(EntityName name) { entity_name = name; } - void _auth_rotating_timeout(double timeout) { - auth_got_timeout = true; - auth_cond.Signal(); - } - int _start_auth_rotating(double timeout); + int _start_auth_rotating(); + int _wait_auth_rotating(double timeout); + int wait_auth_rotating(double timeout); int mount(double mount_timeout); int authenticate(double timeout); int authorize(double timeout); + + int wait_authenticate(double timeout); // mon subscriptions private: @@ -185,8 +172,6 @@ public: monc_lock("MonClient::monc_lock"), timer(monc_lock), hunting(false), - auth_timeout_event(NULL), - auth_got_timeout(false), mounting(0), mount_err(0), auth_handler(&auth, 0, 0) { } ~MonClient() { diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f2b82f56d6e16..5df1a00a9dd2b 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -428,6 +428,8 @@ int OSD::init() monc->sub_want("monmap", 0); monc->renew_subs(); + monc->wait_authenticate(30.0); + monc->wait_auth_rotating(30.0); // announce to monitor i exist and have booted. do_mon_report(); -- 2.39.5