]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: do not proxy read *and* process op locally 8187/head
authorSage Weil <sage@redhat.com>
Thu, 17 Mar 2016 17:28:40 +0000 (13:28 -0400)
committerSage Weil <sage@redhat.com>
Thu, 17 Mar 2016 17:28:40 +0000 (13:28 -0400)
If we proxy the read, we cannot return false, even if we fail to also
trigger a promotion.

Fixes: #15171
Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/ReplicatedPG.cc

index 3c6511f66bb2af116cdf66134ff085c3331e8333..6fa35d542b5af1506e699d83fe35026f3a1baef6 100644 (file)
@@ -1805,6 +1805,7 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op,
   bool can_proxy_read = get_osdmap()->get_up_osd_features() &
     CEPH_FEATURE_OSD_PROXY_FEATURES;
   OpRequestRef promote_op;
+  bool did_proxy_read = false;
 
   switch (pool.info.cache_mode) {
   case pg_pool_t::CACHEMODE_WRITEBACK:
@@ -1832,10 +1833,12 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op,
       return true;
     }
 
-    if (can_proxy_read)
+    if (can_proxy_read) {
       do_proxy_read(op);
-    else
+      did_proxy_read = true;
+    } else {
       promote_op = op;   // for non-proxy case promote_object needs this
+    }
 
     // Avoid duplicate promotion
     if (obc.get() && obc->is_blocked()) {
@@ -1877,7 +1880,7 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op,
        promote_object(obc, missing_oid, oloc, promote_op);
       } else {
        // not promoting
-       return false;
+       return did_proxy_read;
       }
       break;
     }