]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: do not send ENXIO on misdirected op by default 13255/head
authorSage Weil <sage@redhat.com>
Fri, 3 Feb 2017 22:40:29 +0000 (17:40 -0500)
committerSage Weil <sage@redhat.com>
Fri, 3 Feb 2017 22:40:29 +0000 (17:40 -0500)
In practice this tends to get bubbled up the stack as an error on
the caller, and they usually do not handle it properly.  For example,
with librbd, this turns into EIO and break the VM.

Instead, this will manifest as a hung op on the client.  That is
also not ideal, but given that the root cause here is generally a
bug, it's not clear what else would be better.

We already log an error in the cluster log, so teuthology runs will
continue to fail.

Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 923e7f5ce5ed437af15e178299a61029ff48e4a2)

# Conflicts:
# PendingReleaseNotes
# src/common/config_opts.h

PendingReleaseNotes
src/common/config_opts.h
src/osd/OSD.cc

index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6743d6fed455d7c6a28970eebe8b71d5f3dd2606 100644 (file)
@@ -0,0 +1,7 @@
+* In previous versions, if a client sent an op to the wrong OSD, the OSD
+  would reply with ENXIO.  The rationale here is that the client or OSD is
+  clearly buggy and we want to surface the error as clearly as possible.
+  We now only send the ENXIO reply if the osd_enxio_on_misdirected_op option
+  is enabled (it's off by default).  This means that a VM using librbd that
+  previously would have gotten an EIO and gone read-only will now see a
+  blocked/hung IO instead.
index c7433e26e4c65f8bff0eaaf999b7212f0517630a..e505a76e69cd207b6b36222a7186d42a8895c3bc 100644 (file)
@@ -802,6 +802,7 @@ OPTION(osd_debug_skip_full_check_in_backfill_reservation, OPT_BOOL, false)
 OPTION(osd_debug_reject_backfill_probability, OPT_DOUBLE, 0)
 OPTION(osd_debug_inject_copyfrom_error, OPT_BOOL, false)  // inject failure during copyfrom completion
 OPTION(osd_debug_randomize_hobject_sort_order, OPT_BOOL, false)
+OPTION(osd_enxio_on_misdirected_op, OPT_BOOL, false)
 OPTION(osd_debug_verify_cached_snaps, OPT_BOOL, false)
 OPTION(osd_enable_op_tracker, OPT_BOOL, true) // enable/disable OSD op tracking
 OPTION(osd_num_op_tracker_shard, OPT_U32, 32) // The number of shards for holding the ops
index a5c92fb4811366aa2af31d547a646e5785988a9d..8a480b657627d9317d05f029fbe3e6ceaab07875 100644 (file)
@@ -1422,11 +1422,14 @@ void OSDService::handle_misdirected_op(PG *pg, OpRequestRef op)
 
   dout(7) << *pg << " misdirected op in " << m->get_map_epoch() << dendl;
   clog->warn() << m->get_source_inst() << " misdirected " << m->get_reqid()
-             << " pg " << m->get_pg()
-             << " to osd." << whoami
-             << " not " << pg->acting
-             << " in e" << m->get_map_epoch() << "/" << osdmap->get_epoch() << "\n";
-  reply_op_error(op, -ENXIO);
+              << " pg " << m->get_pg()
+              << " to osd." << whoami
+              << " not " << pg->acting
+              << " in e" << m->get_map_epoch() << "/" << osdmap->get_epoch()
+              << "\n";
+  if (g_conf->osd_enxio_on_misdirected_op) {
+    reply_op_error(op, -ENXIO);
+  }
 }
 
 
@@ -8551,14 +8554,16 @@ void OSD::handle_op(OpRequestRef& op, OSDMapRef& osdmap)
   if (!send_map->osd_is_valid_op_target(pgid.pgid, whoami)) {
     dout(7) << "we are invalid target" << dendl;
     clog->warn() << m->get_source_inst() << " misdirected " << m->get_reqid()
-                     << " pg " << m->get_pg()
-                     << " to osd." << whoami
-                     << " in e" << osdmap->get_epoch()
-                     << ", client e" << m->get_map_epoch()
-                     << " pg " << pgid
-                     << " features " << m->get_connection()->get_features()
-                     << "\n";
-    service.reply_op_error(op, -ENXIO);
+                << " pg " << m->get_pg()
+                << " to osd." << whoami
+                << " in e" << osdmap->get_epoch()
+                << ", client e" << m->get_map_epoch()
+                << " pg " << pgid
+                << " features " << m->get_connection()->get_features()
+                << "\n";
+    if (g_conf->osd_enxio_on_misdirected_op) {
+      service.reply_op_error(op, -ENXIO);
+    }
     return;
   }