]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: Create EC Direct Read flag and pass through to EC.
authorAlex Ainscow <aainscow@uk.ibm.com>
Fri, 3 Oct 2025 13:00:10 +0000 (14:00 +0100)
committerAlex Ainscow <aainscow@uk.ibm.com>
Tue, 14 Oct 2025 10:42:13 +0000 (11:42 +0100)
This is in preperation for supporting sparse and sync reads in EC.
Such ops will only be supported for "balance reads".

Signed-off-by: Alex Ainscow <aainscow@uk.ibm.com>
src/crimson/osd/pg.cc
src/include/rados.h
src/osd/OpRequest.h
src/osd/PG.cc
src/osd/PrimaryLogPG.cc
src/osd/osd_op_util.cc
src/osd/osd_op_util.h
src/osd/osd_types.cc
src/osd/osd_types.h

index 5154749bcaae311102358187c7bde9df65743106..09ad5f1946d73d5385117eb17da35cedca089d36 100644 (file)
@@ -1604,8 +1604,7 @@ bool PG::can_discard_op(const MOSDOp& m) const {
     return true;
   }
 
-  if ((m.get_flags() & (CEPH_OSD_FLAG_BALANCE_READS |
-                        CEPH_OSD_FLAG_LOCALIZE_READS))
+  if ((m.get_flags() & CEPH_OSD_FLAG_DIRECT_READ)
     && !is_primary()
     && (m.get_map_epoch() <
         peering_state.get_info().history.same_interval_since))
index e4c58faf59c886983e8fa3b7484c702392404d1a..7680fbdcb1d9b41334b739d6f7d8364d5a667308 100644 (file)
@@ -481,8 +481,12 @@ enum {
        CEPH_OSD_FLAG_IGNORE_REDIRECT = 0x2000000,  /* ignore redirection */
        CEPH_OSD_FLAG_RETURNVEC = 0x4000000, /* allow overall result >= 0, and return >= 0 and buffer for each op in opvec */
        CEPH_OSD_FLAG_SUPPORTSPOOLEIO = 0x8000000,   /* client understands pool EIO flag */
+        CEPH_OSD_FLAG_EC_DIRECT_READ = 0x10000000,  /* Erasure code doing a partial read direct to OSD. */
 };
 
+// Indicates an IO which is direct-to-OSD and may not be on the primary.
+#define CEPH_OSD_FLAG_DIRECT_READ (CEPH_OSD_FLAG_BALANCE_READS | CEPH_OSD_FLAG_LOCALIZE_READS | CEPH_OSD_FLAG_EC_DIRECT_READ)
+
 enum {
        CEPH_OSD_OP_FLAG_EXCL = 0x1,      /* EXCL object create */
        CEPH_OSD_OP_FLAG_FAILOK = 0x2,    /* continue despite failure */
index 2766a7aded5e28bc43cb80eaea612f884354c4bc..255aa59d5307be6b097600a236092285152c6769 100644 (file)
@@ -48,6 +48,8 @@ public:
   bool need_skip_handle_cache() const { return op_info.need_skip_handle_cache(); }
   bool need_skip_promote() const { return op_info.need_skip_promote(); }
   bool allows_returnvec() const { return op_info.allows_returnvec(); }
+  bool ec_direct_read() const { return op_info.ec_direct_read(); }
+  void set_ec_direct_read() { return op_info.set_ec_direct_read(); }
 
   std::vector<OpInfo::ClassInfo> classes() const {
     return op_info.get_classes();
index fe1c51e7595b1aa92ee5ed0274cafd43413bc646..1c57e4cddd82851a742e2aae3d51c438bff6ca2b 100644 (file)
@@ -1938,8 +1938,7 @@ bool PG::can_discard_op(OpRequestRef& op)
     return true;
   }
 
-  if ((m->get_flags() & (CEPH_OSD_FLAG_BALANCE_READS |
-                        CEPH_OSD_FLAG_LOCALIZE_READS)) &&
+  if ((m->get_flags() & (CEPH_OSD_FLAG_DIRECT_READ)) &&
       !is_primary() &&
       m->get_map_epoch() < info.history.same_interval_since) {
     // Note: the Objecter will resend on interval change without the primary
index 4f28cbbc6e15bf29b94ecb225fe10f88f3a81ee1..f5e7273ed3ab5cdaff09a3a8ea24b0ea5e26c0ec 100644 (file)
@@ -2047,16 +2047,22 @@ void PrimaryLogPG::do_op(OpRequestRef& op)
   }
 
   // check for op with rwordered and rebalance or localize reads
-  if ((m->has_flag(CEPH_OSD_FLAG_BALANCE_READS) || m->has_flag(CEPH_OSD_FLAG_LOCALIZE_READS)) &&
-      op->rwordered()) {
+  if (m->has_flag(CEPH_OSD_FLAG_DIRECT_READ) && op->rwordered()) {
     dout(4) << __func__ << ": rebelance or localized reads with rwordered not allowed "
        << *m << dendl;
     osd->reply_op_error(op, -EINVAL);
     return;
   }
 
-  if ((m->get_flags() & (CEPH_OSD_FLAG_BALANCE_READS |
-                        CEPH_OSD_FLAG_LOCALIZE_READS)) &&
+  if (m->get_flags() & CEPH_OSD_FLAG_EC_DIRECT_READ) {
+    if (is_primary() || is_nonprimary()) {
+      op->set_ec_direct_read();
+    } else {
+      osd->handle_misdirected_op(this, op);
+      return;
+    }
+  } else if ((m->get_flags() & (CEPH_OSD_FLAG_BALANCE_READS |
+                                CEPH_OSD_FLAG_LOCALIZE_READS)) &&
       op->may_read() &&
       !(op->may_write() || op->may_cache())) {
     // balanced reads; any replica will do
index b0fbe8f370a5cfb26a39e40153c5ed8739b29a4e..2c2ad8e3ec900bfe0c6983e828ed0187180856be 100644 (file)
@@ -52,6 +52,9 @@ bool OpInfo::need_skip_promote() const {
 bool OpInfo::allows_returnvec() const {
   return check_rmw(CEPH_OSD_RMW_FLAG_RETURNVEC);
 }
+bool OpInfo::ec_direct_read() const {
+  return check_rmw(CEPH_OSD_RMW_FLAG_EC_DIRECT_READ);
+}
 /**
  * may_read_data()
  * 
@@ -79,6 +82,7 @@ void OpInfo::set_skip_promote() { set_rmw_flags(CEPH_OSD_RMW_FLAG_SKIP_PROMOTE);
 void OpInfo::set_force_rwordered() { set_rmw_flags(CEPH_OSD_RMW_FLAG_RWORDERED); }
 void OpInfo::set_returnvec() { set_rmw_flags(CEPH_OSD_RMW_FLAG_RETURNVEC); }
 void OpInfo::set_read_data() { set_rmw_flags(CEPH_OSD_RMW_FLAG_READ_DATA); }
+void OpInfo::set_ec_direct_read() { set_rmw_flags(CEPH_OSD_RMW_FLAG_EC_DIRECT_READ); }
 
 
 int OpInfo::set_from_op(
index 118934206d8cfe3b045678229de2575495dadf75..ba1acae4c9e42c9e3ce438f0942602e8c9213705 100644 (file)
@@ -59,6 +59,7 @@ public:
   bool need_skip_handle_cache() const;
   bool need_skip_promote() const;
   bool allows_returnvec() const;
+  bool ec_direct_read() const;
 
   void set_read();
   void set_write();
@@ -72,6 +73,7 @@ public:
   void set_force_rwordered();
   void set_returnvec();
   void set_read_data();
+  void set_ec_direct_read();
 
   int set_from_op(
     const MOSDOp *m,
index 3e51bed17be59efaacf9e11a4f592bfbe14b0bcd..d3b39355d87f287c55b03092d06bed3a4b942700 100644 (file)
@@ -103,6 +103,7 @@ const char *ceph_osd_flag_name(unsigned flag)
   case CEPH_OSD_FLAG_IGNORE_REDIRECT: return "ignore_redirect";
   case CEPH_OSD_FLAG_RETURNVEC: return "returnvec";
   case CEPH_OSD_FLAG_SUPPORTSPOOLEIO: return "supports_pool_eio";
+  case CEPH_OSD_FLAG_EC_DIRECT_READ: return "ec_direct_read";
   default: return "???";
   }
 }
index f0495c6e2771ecd4a7233581991633c703e289bc..af58a9cb5e00f0d8103d20b394636f8a3cb38625 100644 (file)
@@ -383,6 +383,7 @@ enum {
   CEPH_OSD_RMW_FLAG_RWORDERED         = (1 << 10),
   CEPH_OSD_RMW_FLAG_RETURNVEC = (1 << 11),
   CEPH_OSD_RMW_FLAG_READ_DATA  = (1 << 12),
+  CEPH_OSD_RMW_FLAG_EC_DIRECT_READ  = (1 << 13),
 };