]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Monitor: start timer thread in init(), not ctor
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Wed, 3 Nov 2010 23:31:13 +0000 (16:31 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 4 Nov 2010 04:40:24 +0000 (21:40 -0700)
Don't start the SafeTimer when class Monitor is created. We want to hold off on
starting the thread until SimpleMessenger has fork()ed the process.  Instead,
start the timer thread in Timer::init().

Use an auto_ptr to store the SafeTimer.

Signed-off-by: Colin McCabe <colinm@hq.newdream.net>
src/mon/Elector.cc
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/Paxos.cc
src/mon/PaxosService.cc

index c51cbbac035591afa4d43cf61ae23e0784ea246b..450cfcab9fe9afc9eb21771b69d234a83701cc3e 100644 (file)
@@ -44,7 +44,7 @@ void Elector::init()
 void Elector::shutdown()
 {
   if (expire_event)
-    mon->timer.cancel_event(expire_event);
+    mon->timer->cancel_event(expire_event);
 }
 
 void Elector::bump_epoch(epoch_t e) 
@@ -110,7 +110,7 @@ void Elector::reset_timer(double plus)
   // set the timer
   cancel_timer();
   expire_event = new C_ElectionExpire(this);
-  mon->timer.add_event_after(g_conf.mon_lease + plus,
+  mon->timer->add_event_after(g_conf.mon_lease + plus,
                             expire_event);
 }
 
@@ -118,7 +118,7 @@ void Elector::reset_timer(double plus)
 void Elector::cancel_timer()
 {
   if (expire_event) {
-    mon->timer.cancel_event(expire_event);
+    mon->timer->cancel_event(expire_event);
     expire_event = 0;
   }
 }
index b13946d9da8c0b696dbde370c5123dd14ab7c80f..377cb8698c06e219ee8d35f0bef039b949c68785 100644 (file)
@@ -95,7 +95,6 @@ Monitor::Monitor(string nm, MonitorStore *s, Messenger *m, MonMap *map) :
   lock("Monitor::lock"),
   monmap(map),
   logclient(messenger, monmap),
-  timer(lock), tick_timer(0),
   store(s),
   
   state(STATE_STARTING), stopping(false),
@@ -170,8 +169,9 @@ void Monitor::init()
   messenger->add_dispatcher_head(&logclient);
   
   // start ticker
-  reset_tick();
-  
+  timer.reset(new SafeTimer(lock));
+  new_tick();
+
   // call election?
   if (monmap->size() > 1) {
     call_election();
@@ -193,7 +193,7 @@ void Monitor::shutdown()
     (*p)->shutdown();
 
   // Cancel all events. The timer thread will be joined later in ~SafeTimer
-  timer.cancel_all_events();
+  timer->cancel_all_events();
 
   // die.
   messenger->shutdown();
@@ -911,23 +911,14 @@ public:
   }
 };
 
-void Monitor::cancel_tick()
-{
-  if (tick_timer) timer.cancel_event(tick_timer);
-}
-
-void Monitor::reset_tick()
+void Monitor::new_tick()
 {
-  cancel_tick();
-  tick_timer = new C_Mon_Tick(this);
-  timer.add_event_after(g_conf.mon_tick_interval, tick_timer);
+  C_Mon_Tick *ctx = new C_Mon_Tick(this);
+  timer->add_event_after(g_conf.mon_tick_interval, ctx);
 }
 
-
 void Monitor::tick()
 {
-  tick_timer = 0;
-
   _dout_check_log();
 
   // ok go.
@@ -955,14 +946,9 @@ void Monitor::tick()
     }
   }
 
-  // next tick!
-  reset_tick();
+  new_tick();
 }
 
-
-
-
-
 /*
  * this is the closest thing to a traditional 'mkfs' for ceph.
  * initialize the monitor state machines to their initial values.
index fcf61b8ee1d737d4bb79f6b941ec52f49391252e..d750d0cd94e3bfe4a199f872b1c0ef11306279ae 100644 (file)
@@ -39,6 +39,7 @@
 
 #include "auth/cephx/CephxKeyServer.h"
 
+#include <memory>
 
 class MonitorStore;
 
@@ -66,18 +67,14 @@ public:
   MonMap *monmap;
 
   LogClient logclient;
+  KeyServer key_server;
 
   // timer.
-  SafeTimer timer;
-  Context *tick_timer;
-  void cancel_tick();
-  void reset_tick();
+  std::auto_ptr < SafeTimer > timer;
+private:
+  void new_tick();
   friend class C_Mon_Tick;
 
-  KeyServer key_server;
-
-
-
   // -- local storage --
 public:
   MonitorStore *store;
index 39bd4a05abe6b86e8fbf290de6414a58c713d013..2dc28f5210f256d158b4800fc963c26f21cb4b12 100644 (file)
@@ -98,7 +98,7 @@ void Paxos::collect(version_t oldpn)
 
   // set timeout event
   collect_timeout_event = new C_CollectTimeout(this);
-  mon->timer.add_event_after(g_conf.mon_accept_timeout, collect_timeout_event);
+  mon->timer->add_event_after(g_conf.mon_accept_timeout, collect_timeout_event);
 }
 
 
@@ -252,7 +252,7 @@ void Paxos::handle_last(MMonPaxos *last)
     dout(10) << " they had a higher pn than us, picking a new one." << dendl;
 
     // cancel timeout event
-    mon->timer.cancel_event(collect_timeout_event);
+    mon->timer->cancel_event(collect_timeout_event);
     collect_timeout_event = 0;
 
     collect(last->pn);
@@ -277,7 +277,7 @@ void Paxos::handle_last(MMonPaxos *last)
     // is that everyone?
     if (num_last == mon->get_quorum().size()) {
       // cancel timeout event
-      mon->timer.cancel_event(collect_timeout_event);
+      mon->timer->cancel_event(collect_timeout_event);
       collect_timeout_event = 0;
 
       // almost...
@@ -369,7 +369,7 @@ void Paxos::begin(bufferlist& v)
 
   // set timeout event
   accept_timeout_event = new C_AcceptTimeout(this);
-  mon->timer.add_event_after(g_conf.mon_accept_timeout, accept_timeout_event);
+  mon->timer->add_event_after(g_conf.mon_accept_timeout, accept_timeout_event);
 }
 
 // peon
@@ -442,7 +442,7 @@ void Paxos::handle_accept(MMonPaxos *accept)
   if (accepted == mon->get_quorum()) {
     dout(10) << " got quorum, done with update" << dendl;
     // cancel timeout event
-    mon->timer.cancel_event(accept_timeout_event);
+    mon->timer->cancel_event(accept_timeout_event);
     accept_timeout_event = 0;
 
     // yay!
@@ -549,7 +549,7 @@ void Paxos::extend_lease()
   //  if old timeout is still in place, leave it.
   if (!lease_ack_timeout_event) {
     lease_ack_timeout_event = new C_LeaseAckTimeout(this);
-    mon->timer.add_event_after(g_conf.mon_lease_ack_timeout, lease_ack_timeout_event);
+    mon->timer->add_event_after(g_conf.mon_lease_ack_timeout, lease_ack_timeout_event);
   }
 
   // set renew event
@@ -557,7 +557,7 @@ void Paxos::extend_lease()
   utime_t at = lease_expire;
   at -= g_conf.mon_lease;
   at += g_conf.mon_lease_renew_interval;
-  mon->timer.add_event_at(at, lease_renew_event);      
+  mon->timer->add_event_at(at, lease_renew_event);
 }
 
 
@@ -607,9 +607,9 @@ void Paxos::handle_lease(MMonPaxos *lease)
 
   // (re)set timeout event.
   if (lease_timeout_event) 
-    mon->timer.cancel_event(lease_timeout_event);
+    mon->timer->cancel_event(lease_timeout_event);
   lease_timeout_event = new C_LeaseTimeout(this);
-  mon->timer.add_event_after(g_conf.mon_lease_ack_timeout, lease_timeout_event);
+  mon->timer->add_event_after(g_conf.mon_lease_ack_timeout, lease_timeout_event);
 
   // trim?
   trim_to(lease->first_committed);
@@ -636,7 +636,7 @@ void Paxos::handle_lease_ack(MMonPaxos *ack)
       // yay!
       dout(10) << "handle_lease_ack from " << ack->get_source() 
               << " -- got everyone" << dendl;
-      mon->timer.cancel_event(lease_ack_timeout_event);
+      mon->timer->cancel_event(lease_ack_timeout_event);
       lease_ack_timeout_event = 0;
     } else {
       dout(10) << "handle_lease_ack from " << ack->get_source() 
@@ -744,23 +744,23 @@ version_t Paxos::get_new_proposal_number(version_t gt)
 void Paxos::cancel_events()
 {
   if (collect_timeout_event) {
-    mon->timer.cancel_event(collect_timeout_event);
+    mon->timer->cancel_event(collect_timeout_event);
     collect_timeout_event = 0;
   }
   if (accept_timeout_event) {
-    mon->timer.cancel_event(accept_timeout_event);
+    mon->timer->cancel_event(accept_timeout_event);
     accept_timeout_event = 0;
   }
   if (lease_renew_event) {
-    mon->timer.cancel_event(lease_renew_event);
+    mon->timer->cancel_event(lease_renew_event);
     lease_renew_event = 0;
   }
   if (lease_ack_timeout_event) {
-    mon->timer.cancel_event(lease_ack_timeout_event);
+    mon->timer->cancel_event(lease_ack_timeout_event);
     lease_ack_timeout_event = 0;
   }  
   if (lease_timeout_event) {
-    mon->timer.cancel_event(lease_timeout_event);
+    mon->timer->cancel_event(lease_timeout_event);
     lease_timeout_event = 0;
   }
 }
index 61b469a13032fe3df6df378591621b9773600156..16fb3767c09c9d4ead08133e6529e70b13fc0862 100644 (file)
@@ -77,7 +77,7 @@ bool PaxosService::dispatch(PaxosServiceMessage *m)
        if (!proposal_timer) {
          dout(10) << " setting propose timer with delay of " << delay << dendl;
          proposal_timer = new C_Propose(this);
-         mon->timer.add_event_after(delay, proposal_timer);
+         mon->timer->add_event_after(delay, proposal_timer);
        } else { 
          dout(10) << " propose timer already set" << dendl;
        }
@@ -128,7 +128,7 @@ void PaxosService::propose_pending()
   assert(mon->is_leader() && paxos->is_active());
 
   if (proposal_timer) {
-    mon->timer.cancel_event(proposal_timer);
+    mon->timer->cancel_event(proposal_timer);
     proposal_timer = 0;
   }
 
@@ -148,7 +148,7 @@ void PaxosService::election_starting()
 {
   dout(10) << "election_starting" << dendl;
   if (proposal_timer) {
-    mon->timer.cancel_event(proposal_timer);
+    mon->timer->cancel_event(proposal_timer);
     proposal_timer = 0;
   }
 
@@ -196,7 +196,7 @@ void PaxosService::shutdown()
   paxos->cancel_events();
 
   if (proposal_timer) {
-    mon->timer.cancel_event(proposal_timer);
+    mon->timer->cancel_event(proposal_timer);
     proposal_timer = 0;
   }
 }