]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
timer: make init/shutdown explicit
authorSage Weil <sage@newdream.net>
Mon, 15 Nov 2010 21:23:42 +0000 (13:23 -0800)
committerSage Weil <sage@newdream.net>
Mon, 15 Nov 2010 21:23:42 +0000 (13:23 -0800)
Signed-off-by: Sage Weil <sage@newdream.net>
24 files changed:
src/client/Client.cc
src/common/Logger.cc
src/common/Timer.cc
src/common/Timer.h
src/librados.cc
src/mds/Dumper.cc
src/mds/Dumper.h
src/mds/MDLog.cc
src/mds/MDS.cc
src/mon/Elector.cc
src/mon/MonClient.cc
src/mon/MonClient.h
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/Paxos.cc
src/mon/PaxosService.cc
src/osd/OSD.cc
src/osd/OSD.h
src/osdc/Journaler.cc
src/osdc/Journaler.h
src/osdc/Objecter.cc
src/osdc/Objecter.h
src/tools/ceph.cc
src/tools/ceph.h

index e591ba75bad0db815c98b12993403664e35c90cf..478e5b8f728aad3cc1c6f25eacd6ac94a91f4f63 100644 (file)
@@ -149,7 +149,7 @@ Client::Client(Messenger *m, MonClient *mc) : timer(client_lock), client_lock("C
   // osd interfaces
   osdmap = new OSDMap;     // initially blank.. see mount()
   mdsmap = new MDSMap;
-  objecter = new Objecter(messenger, monclient, osdmap, client_lock);
+  objecter = new Objecter(messenger, monclient, osdmap, client_lock, timer);
   objecter->set_client_incarnation(0);  // client always 0, for now.
   objectcacher = new ObjectCacher(objecter, client_lock, 
                                  0,                            // all ack callback
index 1a9b20b9428d541d0dfdd2789fa9ca8806c626dc..a1b5f55eeb4a0cf0957d25b854eb1c1b966eafa9 100644 (file)
@@ -32,7 +32,7 @@
 
 // per-process lock.  lame, but this way I protect LogType too!
 Mutex logger_lock("logger_lock");
-std::auto_ptr < SafeTimer >logger_timer;
+SafeTimer logger_timer(logger_lock);
 Context *logger_event = 0;
 list<Logger*> logger_list;
 utime_t start;
@@ -75,6 +75,7 @@ void logger_reset_all()
 void logger_start()
 {
   Mutex::Locker l(logger_lock);
+  logger_timer.init();
   flush_all_loggers();
 }
 
@@ -173,14 +174,12 @@ static void flush_all_loggers()
                   << "  next=" << next 
                   << dendl;
   logger_event = new C_FlushLoggers;
-  if (!logger_timer.get())
-    logger_timer.reset(new SafeTimer(logger_lock));
-  logger_timer->add_event_at(next, logger_event);
+  logger_timer.add_event_at(next, logger_event);
 }
 
 static void stop()
 {
-  logger_timer.reset(NULL);
+  logger_timer.shutdown();
 }
 
 
index 5156cfc98e42734ec4b25a13037ff5baf5ff9bfb..8aec0eb8678818e46316181b4157e29091db40c3 100644 (file)
@@ -50,27 +50,32 @@ SafeTimer::SafeTimer(Mutex &l)
     thread(NULL),
     stopping(false) 
 {
-  thread = new SafeTimerThread(this);
-  thread->create();
 }
 
 SafeTimer::~SafeTimer()
 {
-  shutdown();
+  assert(thread == NULL);
+}
+
+void SafeTimer::init()
+{
+  dout(10) << "init" << dendl;
+  thread = new SafeTimerThread(this);
+  thread->create();
 }
 
 void SafeTimer::shutdown()
 {
+  dout(10) << "shutdown" << dendl;
   if (thread) {
-    lock.Lock();
     cancel_all_events();
-    
     stopping = true;
     cond.Signal();
     lock.Unlock();
 
     thread->join();
 
+    lock.Lock();
     delete thread;
     thread = NULL;
   }
index e196add12d8750736cab995735c9810e2a0f56f4..36fa9eaceb8880bb48c76ec490a06bb14be41157 100644 (file)
@@ -54,6 +54,7 @@ public:
    *
    * If there are any events that still have to run, they will need to take
    * the event_lock first. */
+  void init();
   void shutdown();
 
   /* Schedule an event in the future
index 9a070d699029a99e19e8b340e4993705132e0e40..db5f7532c61c857642389ab67c4745e8ec1109c6 100644 (file)
@@ -72,10 +72,11 @@ class RadosClient : public Dispatcher
 
   Mutex lock;
   Cond cond;
+  SafeTimer timer;
 
  
 public:
-  RadosClient() : messenger(NULL), lock("radosclient") {
+  RadosClient() : messenger(NULL), lock("radosclient"), timer(lock) {
     messenger = new SimpleMessenger();
   }
 
@@ -347,7 +348,7 @@ bool RadosClient::init()
     return false;
   dout(1) << "starting objecter" << dendl;
 
-  objecter = new Objecter(messenger, &monclient, &osdmap, lock);
+  objecter = new Objecter(messenger, &monclient, &osdmap, lock, timer);
   if (!objecter)
     return false;
   objecter->set_balanced_budget();
@@ -373,6 +374,8 @@ bool RadosClient::init()
 
   lock.Lock();
 
+  timer.init();
+
   objecter->set_client_incarnation(0);
   objecter->init();
   monclient.renew_subs();
@@ -392,6 +395,7 @@ void RadosClient::shutdown()
 {
   lock.Lock();
   objecter->shutdown();
+  timer.shutdown();
   lock.Unlock();
   messenger->shutdown();
   messenger->wait();
index d73c2cc7d5decb4b8352960574a2a7e2f8fd4b0c..5e4bbc7ae300e71314892a0092641004d0bd74f8 100644 (file)
@@ -32,13 +32,14 @@ bool Dumper::ms_get_authorizer(int dest_type, AuthAuthorizer **authorizer,
   return *authorizer != NULL;
 }
 
-void Dumper::init() {
+void Dumper::init() 
+{
   inodeno_t ino = MDS_INO_LOG_OFFSET + strtol(g_conf.id, 0, 0);
   unsigned pg_pool = CEPH_METADATA_RULE;
   osdmap = new OSDMap();
-  objecter = new Objecter(messenger, monc, osdmap, lock);
+  objecter = new Objecter(messenger, monc, osdmap, lock, timer);
   journaler = new Journaler(ino, pg_pool, CEPH_FS_ONDISK_MAGIC,
-                                       objecter, 0, 0,  &lock);
+                                       objecter, 0, 0, &timer);
 
   objecter->set_client_incarnation(0);
 
@@ -54,6 +55,14 @@ void Dumper::init() {
   lock.Lock();
   objecter->init();
   objecter->wait_for_osd_map();
+  timer.init();
+  lock.Unlock();
+}
+
+void Dumper::shutdown()
+{
+  lock.Lock();
+  timer.shutdown();
   lock.Unlock();
 }
 
@@ -90,4 +99,5 @@ void Dumper::dump(const char *dump_file)
   // wait for messenger to finish
   messenger->wait();
 
+  shutdown();
 }
index 22b6082f23aebeac61b88608571bfe7cd1858c44..39f7bffaf86adcd91c49dd9f53505685ee4278eb 100644 (file)
@@ -38,6 +38,7 @@ public:
   SimpleMessenger *messenger;
   MonClient *monc;
   Mutex lock;
+  SafeTimer timer;
 
   /*
    * The messenger should be a valid SimpleMessenger. You should call bind()
@@ -45,9 +46,10 @@ public:
    * The MonClient needs to be valid, and you should have called
    * build_initial_monmap().
    */
-  Dumper(SimpleMessenger *messenger_, MonClient *monc_) : messenger(messenger_),
-      monc(monc_),
-      lock("Dumper::lock")
+  Dumper(SimpleMessenger *messenger_, MonClient *monc_) :
+    messenger(messenger_),
+    monc(monc_),
+    lock("Dumper::lock"), timer(lock)
   {}
 
   bool ms_dispatch(Message *m) {
@@ -68,6 +70,7 @@ public:
   bool ms_get_authorizer(int dest_type, AuthAuthorizer **authorizer,
                          bool force_new);
   void init();
+  void shutdown();
   void dump(const char *dumpfile);
 };
 
index f5dd1bc48936a9854052f2ad964922f99c536f6d..4cf0b7c670da9494f386699ef0d188fb0631882f 100644 (file)
@@ -93,7 +93,7 @@ void MDLog::init_journaler()
   if (journaler) delete journaler;
   journaler = new Journaler(ino, mds->mdsmap->get_metadata_pg_pool(), CEPH_FS_ONDISK_MAGIC, mds->objecter, 
                            logger, l_mdl_jlat,
-                           &mds->mds_lock);
+                           &mds->timer);
 }
 
 void MDLog::write_head(Context *c) 
index eb460fd92cd1153e32d1ce3d4629acd16014842d..af6e3afa5e1d39b2614e96e0ca52577d48dbea73 100644 (file)
@@ -96,7 +96,7 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) :
   mdsmap = new MDSMap;
   osdmap = new OSDMap;
 
-  objecter = new Objecter(messenger, monc, osdmap, mds_lock);
+  objecter = new Objecter(messenger, monc, osdmap, mds_lock, timer);
   objecter->unset_honor_osdmap_full();
 
   filer = new Filer(objecter);
@@ -135,7 +135,6 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) :
 }
 
 MDS::~MDS() {
-  timer.shutdown();
   Mutex::Locker lock(mds_lock);
 
   if (mdcache) { delete mdcache; mdcache = NULL; }
@@ -453,6 +452,8 @@ int MDS::init(int wanted_state)
 
   mds_lock.Lock();
 
+  timer.init();
+
   // starting beacon.  this will induce an MDSMap from the monitor
   want_state = wanted_state;
   if (wanted_state == MDSMap::STATE_STANDBY && g_conf.id)
@@ -1406,6 +1407,8 @@ void MDS::suicide()
   messenger->shutdown();
 
   monc->shutdown();
+
+  timer.shutdown();
 }
 
 void MDS::respawn()
index 450cfcab9fe9afc9eb21771b69d234a83701cc3e..c51cbbac035591afa4d43cf61ae23e0784ea246b 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 0f6c412930faeb1f72092ddc6f48d001949c05dd..8d9ea06a32c98c900f9e083deb4f766eb82e547d 100644 (file)
@@ -279,12 +279,13 @@ void MonClient::handle_monmap(MMonMap *m)
 void MonClient::init()
 {
   dout(10) << "init" << dendl;
-  timer.reset(new SafeTimer(monc_lock));
+
   messenger->add_dispatcher_head(this);
 
   entity_name = *g_conf.entity_name;
   
   Mutex::Locker l(monc_lock);
+  timer.init();
   schedule_tick();
 
   // seed rng so we choose a different monitor each time
@@ -310,7 +311,7 @@ void MonClient::init()
 void MonClient::shutdown()
 {
   monc_lock.Lock();
-  timer->cancel_all_events();
+  timer.shutdown();
   monc_lock.Unlock();
 }
 
@@ -517,9 +518,9 @@ void MonClient::tick()
 void MonClient::schedule_tick()
 {
   if (hunting)
-    timer->add_event_after(g_conf.mon_client_hunt_interval, new C_Tick(this));
+    timer.add_event_after(g_conf.mon_client_hunt_interval, new C_Tick(this));
   else
-    timer->add_event_after(g_conf.mon_client_ping_interval, new C_Tick(this));
+    timer.add_event_after(g_conf.mon_client_ping_interval, new C_Tick(this));
 }
 
 
index ffdde1e5ff4147d0c899e28d86eb78ae31f40456..99958818ef35f3133236733ac54324adf3797670 100644 (file)
@@ -58,7 +58,7 @@ private:
   entity_addr_t my_addr;
 
   Mutex monc_lock;
-  std::auto_ptr < SafeTimer > timer;
+  SafeTimer timer;
 
   set<__u32> auth_supported;
 
@@ -165,6 +165,7 @@ public:
     state(MC_STATE_NONE),
     messenger(NULL),
     monc_lock("MonClient::monc_lock"),
+    timer(monc_lock),
     hunting(true),
     want_monmap(true),
     want_keys(0), global_id(0),
index 377cb8698c06e219ee8d35f0bef039b949c68785..5d7ecd2fa28d47e15af5c180021a4abf4bbaab0a 100644 (file)
@@ -93,6 +93,7 @@ Monitor::Monitor(string nm, MonitorStore *s, Messenger *m, MonMap *map) :
   rank(-1), 
   messenger(m),
   lock("Monitor::lock"),
+  timer(lock),
   monmap(map),
   logclient(messenger, monmap),
   store(s),
@@ -169,7 +170,7 @@ void Monitor::init()
   messenger->add_dispatcher_head(&logclient);
   
   // start ticker
-  timer.reset(new SafeTimer(lock));
+  timer.init();
   new_tick();
 
   // call election?
@@ -192,8 +193,7 @@ void Monitor::shutdown()
   for (vector<PaxosService*>::iterator p = paxos_service.begin(); p != paxos_service.end(); p++)
     (*p)->shutdown();
 
-  // Cancel all events. The timer thread will be joined later in ~SafeTimer
-  timer->cancel_all_events();
+  timer.shutdown();
 
   // die.
   messenger->shutdown();
@@ -914,7 +914,7 @@ public:
 void Monitor::new_tick()
 {
   C_Mon_Tick *ctx = new C_Mon_Tick(this);
-  timer->add_event_after(g_conf.mon_tick_interval, ctx);
+  timer.add_event_after(g_conf.mon_tick_interval, ctx);
 }
 
 void Monitor::tick()
index d750d0cd94e3bfe4a199f872b1c0ef11306279ae..60d5f2aa22b27a4f335148842e26cad65e80b50a 100644 (file)
@@ -63,14 +63,13 @@ public:
   entity_addr_t myaddr;
   Messenger *messenger;
   Mutex lock;
+  SafeTimer timer;
 
   MonMap *monmap;
 
   LogClient logclient;
   KeyServer key_server;
 
-  // timer.
-  std::auto_ptr < SafeTimer > timer;
 private:
   void new_tick();
   friend class C_Mon_Tick;
index 2dc28f5210f256d158b4800fc963c26f21cb4b12..8058f1119a461cc673246f6631c9121baee8017f 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 16fb3767c09c9d4ead08133e6529e70b13fc0862..61b469a13032fe3df6df378591621b9773600156 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;
   }
 }
index 5710eb7c0f6490e4fa457f802539443c52416957..77ae4595bf2d005c1a75fc15d545911ba56db890 100644 (file)
@@ -333,6 +333,7 @@ int OSD::peek_meta(const char *dev, string& magic, ceph_fsid_t& fsid, int& whoam
 
 OSD::OSD(int id, Messenger *internal_messenger, Messenger *external_messenger, Messenger *hbm, MonClient *mc, const char *dev, const char *jdev) :
   osd_lock("OSD::osd_lock"),
+  timer(osd_lock),
   cluster_messenger(internal_messenger),
   client_messenger(external_messenger),
   monc(mc),
@@ -451,9 +452,10 @@ int OSD::pre_init()
 
 int OSD::init()
 {
-  timer.reset(new SafeTimer(osd_lock));
   Mutex::Locker lock(osd_lock);
 
+  timer.init();
+
   // mount.
   dout(2) << "mounting " << dev_path << " " << (journal_path ? journal_path : "(no journal)") << dendl;
   assert(store);  // call pre_init() first!
@@ -542,7 +544,7 @@ int OSD::init()
   heartbeat_thread.create();
 
   // tick
-  timer->add_event_after(g_conf.osd_heartbeat_interval, new C_Tick(this));
+  timer.add_event_after(g_conf.osd_heartbeat_interval, new C_Tick(this));
 
   if (false) {
     signal(SIGTERM, handle_signal);
@@ -647,8 +649,7 @@ int OSD::shutdown()
 
   state = STATE_STOPPING;
 
-  // Cancel all timers. The timer thread will be destroyed by ~SafeTimer
-  timer->cancel_all_events();
+  timer.shutdown();
 
   heartbeat_lock.Lock();
   heartbeat_stop = true;
@@ -1552,7 +1553,7 @@ void OSD::tick()
 
   logclient.send_log();
 
-  timer->add_event_after(1.0, new C_Tick(this));
+  timer.add_event_after(1.0, new C_Tick(this));
 
   // only do waiters if dispatch() isn't currently running.  (if it is,
   // it'll do the waiters, and doing them here may screw up ordering
index b418dd711aae1d022fb567adc7d7f97c14c0eb03..9a7c769de3f925c3d85b5f3fc11a1f574e203f2e 100644 (file)
@@ -104,7 +104,7 @@ class OSD : public Dispatcher {
   /** OSD **/
 protected:
   Mutex osd_lock;                      // global lock
-  std::auto_ptr < SafeTimer > timer;    // safe timer (osd_lock)
+  SafeTimer timer;    // safe timer (osd_lock)
 
   Messenger   *cluster_messenger;
   Messenger   *client_messenger;
index 5cc80b2ae5d7b44a0879020f6a5e2f56d7204440..af12e382fb4e04b2dc9f3b25a4bc15471c0043fa 100644 (file)
@@ -473,9 +473,10 @@ void Journaler::flush(Context *onsync, Context *onsafe, bool add_ack_barrier)
       if (write_buf.length() < g_conf.journaler_batch_max) {
        // delay!  schedule an event.
        dout(20) << "flush delaying flush" << dendl;
-       if (delay_flush_event) timer.cancel_event(delay_flush_event);
+       if (delay_flush_event)
+         timer->cancel_event(delay_flush_event);
        delay_flush_event = new C_DelayFlush(this);
-       timer.add_event_after(g_conf.journaler_batch_interval, delay_flush_event);      
+       timer->add_event_after(g_conf.journaler_batch_interval, delay_flush_event);     
       } else {
        dout(20) << "flush not delaying flush" << dendl;
        _do_flush();
index f329b0624e41813bbe5c877f5946ec9944940a8a..705de92641d092e401d147f82a546087a827a3d1 100644 (file)
@@ -111,8 +111,7 @@ public:
   Logger *logger;
   int logger_key_lat;
 
-  Mutex *lock;
-  SafeTimer timer;
+  SafeTimer *timer;
 
   class C_DelayFlush : public Context {
     Journaler *journaler;
@@ -207,11 +206,11 @@ public:
   friend class C_Trim;
 
 public:
-  Journaler(inodeno_t ino_, int pool, const char *mag, Objecter *obj, Logger *l, int lkey, Mutex *lk) : 
+  Journaler(inodeno_t ino_, int pool, const char *mag, Objecter *obj, Logger *l, int lkey, SafeTimer *tim) : 
     last_written(mag), last_committed(mag),
     ino(ino_), pg_pool(pool), magic(mag),
     objecter(obj), filer(objecter), logger(l), logger_key_lat(lkey),
-    lock(lk), timer(*lk), delay_flush_event(0),
+    timer(tim), delay_flush_event(0),
     state(STATE_UNDEF), error(0),
     write_pos(0), flush_pos(0), ack_pos(0), safe_pos(0),
     read_pos(0), requested_pos(0), received_pos(0),
index f6e38733d80cb76ed4408d9e01d3334c7d44ac93..5ee5469de9d39e0c0efd6c637877d5d27300977b 100644 (file)
 void Objecter::init()
 {
   assert(client_lock.is_locked());
-  timer.reset(new SafeTimer(client_lock));
-  timer->add_event_after(g_conf.objecter_tick_interval, new C_Tick(this));
+  timer.add_event_after(g_conf.objecter_tick_interval, new C_Tick(this));
   maybe_request_map();
 }
 
 void Objecter::shutdown() 
 {
-  client_lock.Unlock();
-  timer->shutdown();
-  client_lock.Lock();
 }
 
 
@@ -380,7 +376,7 @@ void Objecter::tick()
     messenger->send_message(new MPing, osdmap->get_inst(*p));
 
   // reschedule
-  timer->add_event_after(g_conf.objecter_tick_interval, new C_Tick(this));
+  timer.add_event_after(g_conf.objecter_tick_interval, new C_Tick(this));
 }
 
 void Objecter::resend_mon_ops()
index a0d4c9d90bba261460c0f1048c2cebaad616bd53..cc7cc794f51ff75cd42f75b067087f64120f32ea 100644 (file)
@@ -203,7 +203,7 @@ class Objecter {
   version_t last_seen_pgmap_version;
 
   Mutex &client_lock;
-  std::auto_ptr < SafeTimer > timer;
+  SafeTimer &timer;
   
   class C_Tick : public Context {
     Objecter *ob;
@@ -447,14 +447,14 @@ public:
   Throttle op_throttler;
 
  public:
-  Objecter(Messenger *m, MonClient *mc, OSDMap *om, Mutex& l) : 
+  Objecter(Messenger *m, MonClient *mc, OSDMap *om, Mutex& l, SafeTimer& t) : 
     messenger(m), monc(mc), osdmap(om),
     last_tid(0), client_inc(-1),
     num_unacked(0), num_uncommitted(0),
     keep_balanced_budget(false), honor_osdmap_full(true),
     last_seen_osdmap_version(0),
     last_seen_pgmap_version(0),
-    client_lock(l),
+    client_lock(l), timer(t),
     op_throttler(g_conf.objecter_inflight_op_bytes)
   { }
   ~Objecter() { }
index f0575fa4cd5c0bba828584a9110e3c9534cb5e3f..98d8c9b998f40b321bade392dd2342173df72c6a 100644 (file)
@@ -56,7 +56,6 @@ struct ceph_tool_data g;
 
 static Cond cmd_cond;
 static SimpleMessenger *messenger = 0;
-static std::auto_ptr < SafeTimer > timer;
 static Tokenizer *tok;
 
 static const char *outfile = 0;
@@ -283,7 +282,7 @@ static void send_observe_requests()
   registered.clear();
   float seconds = g_conf.paxos_observer_timeout/2;
   dout(1) << " refresh after " << seconds << " with same mon" << dendl;
-  timer->add_event_after(seconds, new C_ObserverRefresh(false));
+  g.timer.add_event_after(seconds, new C_ObserverRefresh(false));
 }
 
 static void handle_ack(MMonCommandAck *ack)
@@ -296,7 +295,7 @@ static void handle_ack(MMonCommandAck *ack)
   reply_bl = ack->get_data();
   cmd_cond.Signal();
   if (resend_event) {
-    timer->cancel_event(resend_event);
+    g.timer.cancel_event(resend_event);
     resend_event = 0;
   }
   g.lock.Unlock();
@@ -540,7 +539,6 @@ int main(int argc, const char **argv)
   
   common_set_defaults(false);
   common_init(args, "ceph", true);
-  timer.reset(new SafeTimer(g.lock));
 
   vec_to_argv(args, argc, argv);
 
@@ -606,20 +604,24 @@ int main(int argc, const char **argv)
 
   messenger->start();
 
+  g.lock.Lock();
+  g.timer.init();
+  g.lock.Unlock();
+
   g.mc.set_messenger(messenger);
   g.mc.init();
 
+  int ret = -1;
+
   if (g.mc.authenticate() < 0) {
     cerr << "unable to authenticate as " << *g_conf.entity_name << std::endl;
-    return -1;
+    goto out;
   }
   if (g.mc.get_monmap() < 0) {
     cerr << "unable to get monmap" << std::endl;
-    return -1;
+    goto out;
   }
 
-  int ret = 0;
-
   switch (ceph_tool_mode)
   {
     case CEPH_TOOL_MODE_OBSERVER:
@@ -681,10 +683,17 @@ int main(int argc, const char **argv)
       break;
   }
 
+  ret = 0;
+ out:
+
   // wait for messenger to finish
   messenger->wait();
   messenger->destroy();
-  timer->shutdown();
   tok_end(tok);
+  
+  g.lock.Lock();
+  g.mc.shutdown();
+  g.timer.shutdown();
+  g.lock.Unlock();
   return ret;
 }
index ca15c2ca1e256b2bda6c4434dc1a253ef8b118b0..be0092d8d28b2527b0b95ffce22c165a769b9b64 100644 (file)
@@ -7,6 +7,7 @@
 #include "mon/PGMap.h"
 #include "mds/MDSMap.h"
 #include "osd/OSDMap.h"
+#include "common/Timer.h"
 
 #include <iosfwd>
 #include <stdint.h>
@@ -37,15 +38,16 @@ struct ceph_tool_data
 
   // The ceph-tool lock
   Mutex lock;
+  SafeTimer timer;
 
   // A condition variable used to wake up the GUI thread
   Cond gui_cond;
 
-  ceph_tool_data()
-    updates(EVERYTHING_UPDATE),
-      log(&std::cout),
-      slog(NULL),
-      lock("ceph.cc lock")
+  ceph_tool_data() :
+    updates(EVERYTHING_UPDATE),
+    log(&std::cout),
+    slog(NULL),
+    lock("ceph.cc lock"), timer(lock)
   {
   }
 };