]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: add SKIPRWLOCKS flag
authorSage Weil <sage@inktank.com>
Fri, 25 Oct 2013 04:35:45 +0000 (21:35 -0700)
committerSage Weil <sage@inktank.com>
Sat, 14 Dec 2013 00:35:55 +0000 (16:35 -0800)
Flush puts us in an conundrum:

 - the flush eventually writes, behaving like a write
 - writes take the write lock at the start
 - to flush, we send copy-from to the base pool, which does a copy-get on
   our object
 - the copy-get is a read, that blocks on the write.

This flag will allow an op to skip the initial locking step.  It will need
to take it later, of course.

Signed-off-by: Sage Weil <sage@inktank.com>
Conflicts:

src/osd/ReplicatedPG.cc

src/include/rados.h
src/include/rados/librados.hpp
src/librados/librados.cc
src/osd/ReplicatedPG.cc
src/osd/osd_types.cc

index 484f221751655362df36337f48ffdfba7d31e19d..57491ba6b9b32e5ba19381d6c268e50d83da854c 100644 (file)
@@ -347,6 +347,7 @@ enum {
        CEPH_OSD_FLAG_LOCALIZE_READS = 0x2000,  /* read from nearby replica, if any */
        CEPH_OSD_FLAG_RWORDERED =      0x4000,  /* order wrt concurrent reads */
        CEPH_OSD_FLAG_IGNORE_OVERLAY = 0x8000,  /* ignore pool overlay */
+       CEPH_OSD_FLAG_SKIPRWLOCKS =   0x10000,  /* skip rw locks */
 };
 
 enum {
index 2a280760bd10fb007a5d7627901aebcaa6e0f010..b66e7843ade77d4fee9bfb5407d3053c1a991cb2 100644 (file)
@@ -152,6 +152,7 @@ namespace librados
     OPERATION_LOCALIZE_READS = 2,
     OPERATION_ORDER_READS_WRITES = 4,
     OPERATION_IGNORE_OVERLAY = 8,
+    OPERATION_SKIPRWLOCKS = 16,
   };
 
   /*
index c3dba67eecad02930517be501451958c73197b6d..74888a0aa211d8dc6c3d79382ecb98e109c5198d 100644 (file)
@@ -953,6 +953,8 @@ static int translate_flags(int flags)
     op_flags |= CEPH_OSD_FLAG_RWORDERED;
   if (flags & librados::OPERATION_IGNORE_OVERLAY)
     op_flags |= CEPH_OSD_FLAG_IGNORE_OVERLAY;
+  if (flags & librados::OPERATION_SKIPRWLOCKS)
+    op_flags |= CEPH_OSD_FLAG_SKIPRWLOCKS;
   return op_flags;
 }
 
index 9641bb52d278139b5f4c54ce8c859b6d50a07d88..3c3ede6d08fb3bbd0ad84396d00ee13eb794a7c9 100644 (file)
@@ -1190,7 +1190,9 @@ void ReplicatedPG::do_op(OpRequestRef op)
                                 &obc->obs, obc->ssc, 
                                 this);
   ctx->obc = obc;
-  if (!get_rw_locks(ctx)) {
+  if (m->get_flags() & CEPH_OSD_FLAG_SKIPRWLOCKS) {
+    dout(20) << __func__ << ": skipping rw locks" << dendl;
+  } else if (!get_rw_locks(ctx)) {
     op->mark_delayed("waiting for rw locks");
     close_op_ctx(ctx);
     return;
index 41be52e20e9f2418b5994a5cbf8f2e3f049271c5..064fa91a24ff773910afe8e7d74e6074caa2fc2c 100644 (file)
@@ -36,6 +36,7 @@ const char *ceph_osd_flag_name(unsigned flag)
   case CEPH_OSD_FLAG_LOCALIZE_READS: return "localize_reads";
   case CEPH_OSD_FLAG_RWORDERED: return "rwordered";
   case CEPH_OSD_FLAG_IGNORE_OVERLAY: return "ignore_overlay";
+  case CEPH_OSD_FLAG_SKIPRWLOCKS: return "skiprwlocks";
   default: return "???";
   }
 }