]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: separate RWTracker's waitlist from getting locks
authorGreg Farnum <greg@inktank.com>
Mon, 21 Oct 2013 21:02:57 +0000 (14:02 -0700)
committerSamuel Just <sam.just@inktank.com>
Sun, 27 Oct 2013 17:40:32 +0000 (10:40 -0700)
This way we can try and get locks which aren't associated with
an OpRequest.

Signed-off-by: Greg Farnum <greg@inktank.com>
src/osd/ReplicatedPG.h

index afa0ca7902edd42ab7f5573682319c1db4efefbe..7b4b04b354f125ce8e5aa2cd4f06c138a2822927 100644 (file)
@@ -502,9 +502,16 @@ protected:
 
       ObjState() : state(NONE), count(0) {}
       bool get_read(OpRequestRef op) {
-       // don't starve!
+       if (get_read_lock()) {
+         return true;
+       } // else
+       waiters.push_back(op);
+       return false;
+      }
+      /// this function adjusts the counts if necessary
+      bool get_read_lock() {
+       // don't starve anybody!
        if (!waiters.empty()) {
-         waiters.push_back(op);
          return false;
        }
        switch (state) {
@@ -516,17 +523,23 @@ protected:
          count++;
          return true;
        case WRITE:
-         waiters.push_back(op);
          return false;
        default:
          assert(0 == "unhandled case");
          return false;
        }
       }
+
       bool get_write(OpRequestRef op) {
+       if (get_write_lock()) {
+         return true;
+       } // else
+       waiters.push_back(op);
+       return false;
+      }
+      bool get_write_lock() {
+       // don't starve anybody!
        if (!waiters.empty()) {
-         // don't starve!
-         waiters.push_back(op);
          return false;
        }
        switch (state) {
@@ -538,7 +551,6 @@ protected:
          count++;
          return true;
        case READ:
-         waiters.push_back(op);
          return false;
        default:
          assert(0 == "unhandled case");