]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msgr: fix lock ordering on accept()
authorSage Weil <sage@newdream.net>
Mon, 3 Nov 2008 03:49:20 +0000 (19:49 -0800)
committerSage Weil <sage@newdream.net>
Mon, 3 Nov 2008 03:49:20 +0000 (19:49 -0800)
src/msg/SimpleMessenger.cc

index 9a96fb7344f05c77ab4bc4f6afb887845aa1e41b..2adc6e0bf16ff5aecb7e56cf20e3ffd02d5ac127 100644 (file)
@@ -994,9 +994,6 @@ int Rank::Pipe::accept()
 
  open:
   // open
-  register_pipe();
-  rank.lock.Unlock();
-
   connect_seq = connect.connect_seq + 1;
   peer_global_seq = connect.global_seq;
   dout(10) << "accept success, connect_seq = " << connect_seq << ", sending READY" << dendl;
@@ -1013,17 +1010,24 @@ int Rank::Pipe::accept()
       goto fail;
   }
 
+  register_pipe();
+  rank.lock.Unlock();
+
+  lock.Lock();
   if (state != STATE_CLOSED) {
     dout(10) << "accept starting writer, " << "state=" << state << dendl;
     start_writer();
   }
   dout(20) << "accept done" << dendl;
+  lock.Unlock();
   return 0;   // success.
 
 
  fail:
+  lock.Lock();
   state = STATE_CLOSED;
   fault();
+  lock.Unlock();
   return -1;
 }
 
@@ -1236,7 +1240,7 @@ int Rank::Pipe::connect()
        goto fail;
       }
       lossy_rx = flags & CEPH_MSG_CONNECT_LOSSYTX;
-
+      
 
       // hooray!
       state = STATE_OPEN;
@@ -1443,11 +1447,11 @@ void Rank::Pipe::dirty_close()
  */
 void Rank::Pipe::reader()
 {
-  lock.Lock();
-
   if (state == STATE_ACCEPTING) 
     accept();
 
+  lock.Lock();
+
   // loop.
   while (state != STATE_CLOSED) {
     assert(lock.is_locked());