]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librados: add a RETURNVEC flag
authorSage Weil <sage@redhat.com>
Mon, 23 Sep 2019 22:22:03 +0000 (17:22 -0500)
committerSage Weil <sage@redhat.com>
Wed, 25 Sep 2019 16:06:10 +0000 (11:06 -0500)
This signals that the client is soliciting and expecting return codes
that are >0 and/or return buffers on update ops.

This should be used with caution, since it means that compound requests
that include read and write requests will *also* persist the read ops in
order to be idempotent, which means that those ops' results may get
truncated.

Signed-off-by: Sage Weil <sage@redhat.com>
src/include/rados.h
src/include/rados/librados.h
src/include/rados/librados.hpp
src/librados/librados_util.cc
src/osd/OSD.cc
src/osd/OpRequest.cc
src/osd/OpRequest.h
src/osd/osd_types.cc
src/osd/osd_types.h

index 8e35994daed2a986cf59b639a5453cf20f39b0d1..95ef95c1dbf3b09b9d61ab7ac629c0872101cf3f 100644 (file)
@@ -469,6 +469,7 @@ enum {
        CEPH_OSD_FLAG_FULL_TRY =    0x800000,  /* try op despite full flag */
        CEPH_OSD_FLAG_FULL_FORCE = 0x1000000,  /* force op despite full flag */
        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 */
 };
 
 enum {
index 5b1e6c7dccceefb1015b6a2dc9b0b36593a35024..11d5d991d1053cde72d464fd4d1f12b8ce3eafe6 100644 (file)
@@ -130,6 +130,8 @@ enum {
   LIBRADOS_OPERATION_FULL_FORCE                = 128,
   LIBRADOS_OPERATION_IGNORE_REDIRECT   = 256,
   LIBRADOS_OPERATION_ORDERSNAP          = 512,
+  /* enable/allow >0 return values and payloads on write/update */
+  LIBRADOS_OPERATION_RETURNVEC          = 1024,
 };
 /** @} */
 
index 00c180633820ad65ddfc938350af87ec5d695f75..aa72e3804d458762f0fba9150a8bb6e5bbe0a613 100644 (file)
@@ -270,10 +270,12 @@ inline namespace v14_2_0 {
     // marked full; ops will either succeed (e.g., delete) or return
     // EDQUOT or ENOSPC
     OPERATION_FULL_TRY           = LIBRADOS_OPERATION_FULL_TRY,
-    //mainly for delete
+    // mainly for delete
     OPERATION_FULL_FORCE        = LIBRADOS_OPERATION_FULL_FORCE,
     OPERATION_IGNORE_REDIRECT   = LIBRADOS_OPERATION_IGNORE_REDIRECT,
     OPERATION_ORDERSNAP          = LIBRADOS_OPERATION_ORDERSNAP,
+    // enable/allow return value and per-op return code/buffers
+    OPERATION_RETURNVEC          = LIBRADOS_OPERATION_RETURNVEC,
   };
 
   /*
index 109bf9ab680d30cc34d5bc64c1fe91dd3b2c3e7c..72cd96947f471387664459caa151695206c8a128 100644 (file)
@@ -56,6 +56,8 @@ int translate_flags(int flags)
     op_flags |= CEPH_OSD_FLAG_IGNORE_REDIRECT;
   if (flags & librados::OPERATION_ORDERSNAP)
     op_flags |= CEPH_OSD_FLAG_ORDERSNAP;
+  if (flags & librados::OPERATION_RETURNVEC)
+    op_flags |= CEPH_OSD_FLAG_RETURNVEC;
 
   return op_flags;
 }
index 96aed0b706e308d3a9e8776f0f7538f3abed4786..fcdf69f225f9015beaa5f3fe94b7c9039044dbb1 100644 (file)
@@ -10087,6 +10087,9 @@ int OSD::init_op_flags(OpRequestRef& op)
   if (m->has_flag(CEPH_OSD_FLAG_RWORDERED)) {
     op->set_force_rwordered();
   }
+  if (m->has_flag(CEPH_OSD_FLAG_RETURNVEC)) {
+    op->set_returnvec();
+  }
 
   // set bits based on op codes, called methods.
   for (iter = m->ops.begin(); iter != m->ops.end(); ++iter) {
index 661cbf6d82a1fc1534e676b2d25a0c67418477b4..f37e1d7839c056a91351ff8eb2200ba31a5c6149 100644 (file)
@@ -135,6 +135,9 @@ bool OpRequest::need_skip_handle_cache() {
 bool OpRequest::need_skip_promote() {
   return check_rmw(CEPH_OSD_RMW_FLAG_SKIP_PROMOTE);
 }
+bool OpRequest::allows_returnvec() const {
+  return check_rmw(CEPH_OSD_RMW_FLAG_RETURNVEC);
+}
 
 void OpRequest::set_rmw_flags(int flags) {
 #ifdef WITH_LTTNG
@@ -156,6 +159,7 @@ void OpRequest::set_promote() { set_rmw_flags(CEPH_OSD_RMW_FLAG_FORCE_PROMOTE);
 void OpRequest::set_skip_handle_cache() { set_rmw_flags(CEPH_OSD_RMW_FLAG_SKIP_HANDLE_CACHE); }
 void OpRequest::set_skip_promote() { set_rmw_flags(CEPH_OSD_RMW_FLAG_SKIP_PROMOTE); }
 void OpRequest::set_force_rwordered() { set_rmw_flags(CEPH_OSD_RMW_FLAG_RWORDERED); }
+void OpRequest::set_returnvec() { set_rmw_flags(CEPH_OSD_RMW_FLAG_RETURNVEC); }
 
 void OpRequest::mark_flag_point(uint8_t flag, const char *s) {
 #ifdef WITH_LTTNG
index 4f1fa5411286a6ea4f6bfcf55c0fea001a69cae5..565ecb8969b2c79c89ebfb045319161225ea7125 100644 (file)
@@ -39,6 +39,7 @@ struct OpRequest : public TrackedOp {
   bool need_promote();
   bool need_skip_handle_cache();
   bool need_skip_promote();
+  bool allows_returnvec() const;
   void set_read();
   void set_write();
   void set_cache();
@@ -49,6 +50,7 @@ struct OpRequest : public TrackedOp {
   void set_skip_handle_cache();
   void set_skip_promote();
   void set_force_rwordered();
+  void set_returnvec();
 
   struct ClassInfo {
     ClassInfo(std::string&& class_name, std::string&& method_name,
index d83991fc20ae594eadf764e6c2ac897b3f5f3774..86c98fc53b7106304a8d95d4958924fca17176c8 100644 (file)
@@ -88,6 +88,7 @@ const char *ceph_osd_flag_name(unsigned flag)
   case CEPH_OSD_FLAG_FULL_TRY: return "full_try";
   case CEPH_OSD_FLAG_FULL_FORCE: return "full_force";
   case CEPH_OSD_FLAG_IGNORE_REDIRECT: return "ignore_redirect";
+  case CEPH_OSD_FLAG_RETURNVEC: return "returnvec";
   default: return "???";
   }
 }
index cc4546f441b5879633c521f85971bd55ce0981b8..3e3a7cdfd31f1feef0abcc66a2bc767d09885b00 100644 (file)
@@ -365,6 +365,7 @@ enum {
   CEPH_OSD_RMW_FLAG_SKIP_HANDLE_CACHE = (1 << 8),
   CEPH_OSD_RMW_FLAG_SKIP_PROMOTE      = (1 << 9),
   CEPH_OSD_RMW_FLAG_RWORDERED         = (1 << 10),
+  CEPH_OSD_RMW_FLAG_RETURNVEC = (1 << 11),
 };