]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
AsyncConnection: Avoid event creation leak when stopping
authorHaomai Wang <haomaiwang@gmail.com>
Wed, 27 May 2015 08:27:50 +0000 (16:27 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Sat, 30 May 2015 14:29:55 +0000 (22:29 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/async/AsyncConnection.cc

index 9ef88ab8d340ac8bad1fbab283b3f3a7a9134a4a..f4745f5a7f09f4c920e56f30c81caade94a6cdcf 100644 (file)
@@ -2017,8 +2017,8 @@ void AsyncConnection::discard_requeued_up_to(uint64_t seq)
 void AsyncConnection::discard_out_queue()
 {
   ldout(async_msgr->cct, 10) << __func__ << " started" << dendl;
+  assert(write_lock.is_locked());
 
-  Mutex::Locker l(write_lock);
   for (list<pair<bufferlist, Message*> >::iterator p = sent.begin(); p != sent.end(); ++p) {
     ldout(async_msgr->cct, 20) << __func__ << " discard " << p->second << dendl;
     p->second->put();
@@ -2133,6 +2133,7 @@ void AsyncConnection::fault()
 void AsyncConnection::was_session_reset()
 {
   ldout(async_msgr->cct,10) << __func__ << " started" << dendl;
+  Mutex::Locker l(write_lock);
   discard_out_queue();
 
   center->dispatch_event_external(remote_reset_handler);
@@ -2145,6 +2146,7 @@ void AsyncConnection::was_session_reset()
   connect_seq = 0;
   in_seq_acked = 0;
   once_ready = false;
+  can_write = 0;
 }
 
 void AsyncConnection::_stop()
@@ -2154,6 +2156,7 @@ void AsyncConnection::_stop()
     return ;
 
   ldout(async_msgr->cct, 10) << __func__ << dendl;
+  Mutex::Locker l(write_lock);
   if (sd >= 0)
     center->delete_file_event(sd, EVENT_READABLE|EVENT_WRITABLE);
 
@@ -2161,7 +2164,6 @@ void AsyncConnection::_stop()
   async_msgr->unregister_conn(this);
 
   state = STATE_CLOSED;
-  Mutex::Locker l(write_lock);
   open_write = false;
   can_write = 2;
   state_offset = 0;