]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: log misdirected ops; reply with -ENXIO
authorSage Weil <sage@newdream.net>
Mon, 9 Nov 2009 21:17:29 +0000 (13:17 -0800)
committerSage Weil <sage@newdream.net>
Mon, 9 Nov 2009 21:17:29 +0000 (13:17 -0800)
This is more helpful than assert(0).  It's still bad (it means the client
and osd calculated different pg mappings) though, but this makes it easier
to identify and fix.

src/osd/OSD.cc
src/osd/OSD.h

index 8520eb038f176b71443576a4961fa438b9602a84..28b5c0c77928566ccd1846632e639e8173187b59 100644 (file)
@@ -3628,6 +3628,22 @@ void OSD::reply_op_error(MOSDOp *op, int err)
   delete op;
 }
 
+void OSD::handle_misdirected_op(PG *pg, MOSDOp *op)
+{
+  if (op->get_map_epoch() < pg->info.history.same_primary_since) {
+    dout(7) << *pg << " changed after " << op->get_map_epoch() << ", dropping" << dendl;
+    delete op;
+  } else {
+    dout(7) << *pg << " misdirected op in " << op->get_map_epoch() << dendl;
+    stringstream ss;
+    ss << op->get_source_inst() << " misdirected " << op->get_reqid()
+       << " " << pg->info.pgid << " to osd" << whoami
+       << " not " << pg->acting;
+    logclient.log(LOG_WARN, ss);
+    reply_op_error(op, -ENXIO);
+  }
+}
+
 void OSD::handle_op(MOSDOp *op)
 {
   // require same or newer map
@@ -3722,10 +3738,8 @@ void OSD::handle_op(MOSDOp *op)
     // modify
     if (!pg->is_primary() ||
        !pg->same_for_modify_since(op->get_map_epoch())) {
-      dout(7) << *pg << " changed for write after " << op->get_map_epoch() << ", dropping" << dendl;
-      assert(op->get_map_epoch() < osdmap->get_epoch());
+      handle_misdirected_op(pg, op);
       pg->unlock();
-      delete op;
       return;
     }
     
@@ -3739,10 +3753,8 @@ void OSD::handle_op(MOSDOp *op)
   } else {
     // read
     if (!pg->same_for_read_since(op->get_map_epoch())) {
-      dout(7) << *pg << " changed for read after " << op->get_map_epoch() << ", dropping" << dendl;
-      assert(op->get_map_epoch() < osdmap->get_epoch());
+      handle_misdirected_op(pg, op);
       pg->unlock();
-      delete op;
       return;
     }
 
index cfff8e7fed2d03b8863fee08e296faa0056d071f..9ab63f9534868e6f890aee6449d0968e61b605cd 100644 (file)
@@ -834,6 +834,7 @@ protected:
   int shutdown();
 
   void reply_op_error(MOSDOp *op, int r);
+  void handle_misdirected_op(PG *pg, MOSDOp *op);
 
   void handle_scrub(class MOSDScrub *m);
   void handle_osd_ping(class MOSDPing *m);