]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
msg/async: dont delete time event when exchange eventcenter
authorHaomai Wang <haomai@xsky.com>
Sat, 2 Jul 2016 06:04:23 +0000 (14:04 +0800)
committerHaomai Wang <haomai@xsky.com>
Tue, 12 Jul 2016 15:51:27 +0000 (23:51 +0800)
When replacing and someone called mark_down, it will delete_time_event which
isn't allowed. Because we're exchaning EventCenter now!

Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/AsyncConnection.cc
src/msg/async/AsyncConnection.h
src/msg/async/Event.cc

index f2eb152e988eb47e15c6f638eaf0c6be2a1f52d9..f5147dfa4868ea46ed72361b64eda22ac29f156f 100644 (file)
@@ -1321,7 +1321,8 @@ ssize_t AsyncConnection::_process_connection()
         async_msgr->ms_deliver_handle_fast_connect(this);
 
         // make sure no pending tick timer
-        center->delete_time_event(last_tick_id);
+        if (last_tick_id)
+          center->delete_time_event(last_tick_id);
         last_tick_id = center->create_time_event(inactive_timeout_us, tick_handler);
 
         // message may in queue between last _try_send and connection ready
@@ -1496,7 +1497,8 @@ ssize_t AsyncConnection::_process_connection()
         if (delay_state)
           assert(delay_state->ready());
         // make sure no pending tick timer
-        center->delete_time_event(last_tick_id);
+        if (last_tick_id)
+          center->delete_time_event(last_tick_id);
         last_tick_id = center->create_time_event(inactive_timeout_us, tick_handler);
 
         write_lock.Lock();
@@ -2654,6 +2656,7 @@ void AsyncConnection::tick(uint64_t id)
                              << " last_active" << last_active << dendl;
   assert(last_tick_id == id);
   Mutex::Locker l(lock);
+  last_tick_id = 0;
   auto idle_period = std::chrono::duration_cast<std::chrono::microseconds>(now - last_active).count();
   if (inactive_timeout_us < (uint64_t)idle_period) {
     ldout(async_msgr->cct, 1) << __func__ << " idle(" << idle_period << ") more than "
index de81e6c5fcb9dd39d1ac58a44063708ac576f1b0..29854e41144959ea885dfd572501166972ca90ec 100644 (file)
@@ -107,7 +107,10 @@ class AsyncConnection : public Connection {
     for (auto &&t : register_time_events)
       center->delete_time_event(t);
     register_time_events.clear();
-    center->delete_time_event(last_tick_id);
+    if (last_tick_id) {
+      center->delete_time_event(last_tick_id);
+      last_tick_id = 0;
+    }
     if (sd >= 0) {
       center->delete_file_event(sd, EVENT_READABLE|EVENT_WRITABLE);
       ::shutdown(sd, SHUT_RDWR);
index 3bbe76eac900d8fd650904f72800c69118ea172b..1388ee9bd5a1b997e405b25aec622133a0d41846 100644 (file)
@@ -245,7 +245,7 @@ void EventCenter::delete_time_event(uint64_t id)
 {
   assert(in_thread());
   ldout(cct, 10) << __func__ << " id=" << id << dendl;
-  if (id >= time_event_next_id)
+  if (id >= time_event_next_id || id == 0)
     return ;
 
   auto it = event_map.find(id);