]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osdc/Objecter: return EIO for new ops
authorSage Weil <sage@newdream.net>
Wed, 15 Sep 2021 23:05:35 +0000 (19:05 -0400)
committerSage Weil <sage@newdream.net>
Fri, 24 Sep 2021 16:25:13 +0000 (12:25 -0400)
Signed-off-by: Sage Weil <sage@newdream.net>
src/osdc/Objecter.cc
src/osdc/Objecter.h
src/osdc/error_code.cc
src/osdc/error_code.h

index 9565f4326cac930e8cbeaf757c96550c451f02a8..04acefb335b5b7f3dd06dbb47c61ef5512032e1c 100644 (file)
@@ -2316,11 +2316,21 @@ void Objecter::_op_submit(Op *op, shunique_lock<ceph::shared_mutex>& sul, ceph_t
   ceph_assert(op->session == NULL);
   OSDSession *s = NULL;
 
-  bool check_for_latest_map = _calc_target(&op->target, nullptr)
-    == RECALC_OP_TARGET_POOL_DNE;
+  bool check_for_latest_map = false;
+  int r = _calc_target(&op->target, nullptr);
+  switch(r) {
+  case RECALC_OP_TARGET_POOL_DNE:
+    check_for_latest_map = true;
+    break;
+  case RECALC_OP_TARGET_POOL_EIO:
+    if (op->has_completion()) {
+      op->complete(osdc_errc::pool_eio, -EIO);
+    }
+    return;
+  }
 
   // Try to get a session, including a retry if we need to take write lock
-  int r = _get_session(op->target.osd, &s, sul);
+  r = _get_session(op->target.osd, &s, sul);
   if (r == -EAGAIN ||
       (check_for_latest_map && sul.owns_lock_shared()) ||
       cct->_conf->objecter_debug_inject_relock_delay) {
@@ -2707,6 +2717,11 @@ int Objecter::_calc_target(op_target_t *t, Connection *con, bool any_change)
     t->osd = -1;
     return RECALC_OP_TARGET_POOL_DNE;
   }
+
+  if (pi->has_flag(pg_pool_t::FLAG_EIO)) {
+    return RECALC_OP_TARGET_POOL_EIO;
+  }
+
   ldout(cct,30) << __func__ << "  base pi " << pi
                << " pg_num " << pi->get_pg_num() << dendl;
 
index cd7bd2ab59d5b626bbef539f88bda899176ee5e8..582ce8c197898d89800d344a82344f096f29166d 100644 (file)
@@ -2467,6 +2467,7 @@ public:
     RECALC_OP_TARGET_POOL_DNE,
     RECALC_OP_TARGET_OSD_DNE,
     RECALC_OP_TARGET_OSD_DOWN,
+    RECALC_OP_TARGET_POOL_EIO,
   };
   bool _osdmap_full_flag() const;
   bool _osdmap_has_pool_full() const;
@@ -2517,9 +2518,11 @@ public:
 
 private:
   void _check_op_pool_dne(Op *op, std::unique_lock<std::shared_mutex> *sl);
+  void _check_op_pool_eio(Op *op, std::unique_lock<std::shared_mutex> *sl);
   void _send_op_map_check(Op *op);
   void _op_cancel_map_check(Op *op);
   void _check_linger_pool_dne(LingerOp *op, bool *need_unregister);
+  void _check_linger_pool_eio(LingerOp *op);
   void _send_linger_map_check(LingerOp *op);
   void _linger_cancel_map_check(LingerOp *op);
   void _check_command_map_dne(CommandOp *op);
index 5dc548385e8d031ffb1d9281dc056464c15597c2..7823e8b088c4eab2e13584a99cfec209d5c664ea 100644 (file)
@@ -70,6 +70,9 @@ const char* osdc_error_category::message(int ev, char*,
 
   case osdc_errc::timed_out:
     return "Operation timed out";
+
+  case osdc_errc::pool_eio:
+    return "Pool EIO flag set";
   }
 
   return "Unknown error";
@@ -96,6 +99,8 @@ osdc_error_category::default_error_condition(int ev) const noexcept {
     return ceph::errc::does_not_exist;
   case osdc_errc::timed_out:
     return bs::errc::timed_out;
+  case osdc_errc::pool_eio:
+    return bs::errc::io_error;
   }
 
   return { ev, *this };
@@ -149,6 +154,8 @@ int osdc_error_category::from_code(int ev) const noexcept {
     return -ENOENT;
   case osdc_errc::timed_out:
     return -ETIMEDOUT;
+  case osdc_errc::pool_eio:
+    return -EIO;
   }
   return -EDOM;
 }
index 53c9e3c3a2a8207b8a870db86aabc4c602fdeeb3..eb78a5110b014528a94c678e35baa8de7763b259 100644 (file)
@@ -29,7 +29,8 @@ enum class osdc_errc {
   not_supported,
   snapshot_exists,
   snapshot_dne,
-  timed_out
+  timed_out,
+  pool_eio
 };
 
 namespace boost::system {