]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: return EAGAIN if !can_serve_replica_read() 36892/head
authorKefu Chai <kchai@redhat.com>
Sun, 30 Aug 2020 15:11:40 +0000 (23:11 +0800)
committerKefu Chai <kchai@redhat.com>
Sun, 30 Aug 2020 15:15:25 +0000 (23:15 +0800)
it's necessary for serving balanced read.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/osd_operations/client_request.cc

index 0ead1626873a925e247a596eb68e17ccaa353b03..0bdc6da05d0c4d3c28a05c5051e2f458688950af 100644 (file)
@@ -142,6 +142,12 @@ seastar::future<> ClientRequest::process_op(
     } else if (is_misdirected(pg)) {
       logger().trace("process_op: dropping misdirected op");
       return seastar::now();
+    } else if (!pg.get_peering_state().can_serve_replica_read(m->get_hobj())) {
+      auto reply = make_message<MOSDOpReply>(
+        m.get(), -EAGAIN, pg.get_osdmap_epoch(),
+        m->get_flags() & (CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK),
+        !m->has_flag(CEPH_OSD_FLAG_RETURNVEC));
+      return conn->send(reply);
     }
     return pg.with_locked_obc(
       m,