]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: return EIO for existing ops and linger ops
authorSage Weil <sage@newdream.net>
Wed, 15 Sep 2021 23:06:02 +0000 (19:06 -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

index 04acefb335b5b7f3dd06dbb47c61ef5512032e1c..a9f87b5bdff80f0f19b4e4d3e388df58bca2edeb 100644 (file)
@@ -1066,6 +1066,13 @@ void Objecter::_scan_requests(
        unregister_lingers.push_back(op);
       }
       break;
+    case RECALC_OP_TARGET_POOL_EIO:
+      _check_linger_pool_eio(op);
+      ldout(cct, 10) << " need to unregister linger op "
+                    << op->linger_id << dendl;
+      op->get();
+      unregister_lingers.push_back(op);
+      break;
     }
   }
 
@@ -1095,6 +1102,9 @@ void Objecter::_scan_requests(
     case RECALC_OP_TARGET_POOL_DNE:
       _check_op_pool_dne(op, &sl);
       break;
+    case RECALC_OP_TARGET_POOL_EIO:
+      _check_op_pool_eio(op, &sl);
+      break;
     }
   }
 
@@ -1565,6 +1575,37 @@ void Objecter::_check_op_pool_dne(Op *op, std::unique_lock<std::shared_mutex> *s
   }
 }
 
+// sl may be unlocked.
+void Objecter::_check_op_pool_eio(Op *op, std::unique_lock<std::shared_mutex> *sl)
+{
+  // rwlock is locked unique
+
+  // we had a new enough map
+  ldout(cct, 10) << "check_op_pool_eio tid " << op->tid
+                << " concluding pool " << op->target.base_pgid.pool()
+                << " has eio" << dendl;
+  if (op->has_completion()) {
+    num_in_flight--;
+    op->complete(osdc_errc::pool_eio, -EIO);
+  }
+
+  OSDSession *s = op->session;
+  if (s) {
+    ceph_assert(s != NULL);
+    ceph_assert(sl->mutex() == &s->lock);
+    bool session_locked = sl->owns_lock();
+    if (!session_locked) {
+      sl->lock();
+    }
+    _finish_op(op, 0);
+    if (!session_locked) {
+      sl->unlock();
+    }
+  } else {
+    _finish_op(op, 0); // no session
+  }
+}
+
 void Objecter::_send_op_map_check(Op *op)
 {
   // rwlock is locked unique
@@ -1659,6 +1700,23 @@ void Objecter::_check_linger_pool_dne(LingerOp *op, bool *need_unregister)
   }
 }
 
+void Objecter::_check_linger_pool_eio(LingerOp *op)
+{
+  // rwlock is locked unique
+
+  std::unique_lock wl{op->watch_lock};
+  if (op->on_reg_commit) {
+    op->on_reg_commit->defer(std::move(op->on_reg_commit),
+                            osdc_errc::pool_dne, cb::list{});
+    op->on_reg_commit = nullptr;
+  }
+  if (op->on_notify_finish) {
+    op->on_notify_finish->defer(std::move(op->on_notify_finish),
+                               osdc_errc::pool_dne, cb::list{});
+    op->on_notify_finish = nullptr;
+  }
+}
+
 void Objecter::_send_linger_map_check(LingerOp *op)
 {
   // ask the monitor