]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: kick requests when we detect a remote session reset
authorSage Weil <sage@newdream.net>
Mon, 13 Oct 2008 19:51:11 +0000 (12:51 -0700)
committerSage Weil <sage@newdream.net>
Mon, 13 Oct 2008 19:51:11 +0000 (12:51 -0700)
src/client/Client.cc
src/mds/MDS.cc
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 4dce066c5036f7f0cfb9cb908cea39d84559b4f8..d5d20e27c12dbe84f841be968ecfd1707e9ccc03 100644 (file)
@@ -5036,9 +5036,6 @@ void Client::ms_handle_failure(Message *m, const entity_inst_t& inst)
             << dendl;
     messenger->send_message(m, monmap->get_inst(mon));
   }
-  else if (dest.is_osd()) {
-    objecter->ms_handle_failure(m, dest, inst);
-  } 
   else {
     dout(0) << "ms_handle_failure " << *m << " to " << inst << ", dropping" << dendl;
     delete m;
@@ -5077,4 +5074,7 @@ void Client::ms_handle_remote_reset(const entity_addr_t& addr, entity_name_t las
     // or requests
     kick_requests(mds);
   }
+  else 
+    objecter->ms_handle_remote_reset(addr, last);
+
 }
index 81f59bf5e1cd5f12f196e7772faaea1ceace72af..5b38c17bf3b8c58db901ca908616537d660400e1 100644 (file)
@@ -1309,4 +1309,5 @@ void MDS::ms_handle_reset(const entity_addr_t& addr, entity_name_t last)
 void MDS::ms_handle_remote_reset(const entity_addr_t& addr, entity_name_t last) 
 {
   dout(0) << "ms_handle_remote_reset on " << addr << dendl;
+  objecter->ms_handle_remote_reset(addr, last);
 }
index a715d3dc2f64950c375da917b39020cba0bf5d82..4d4ab4b18cdca2cc26a349ba8ad19109c039a71d 100644 (file)
@@ -161,6 +161,20 @@ Objecter::PG &Objecter::get_pg(pg_t pgid)
 }
 
 
+void Objecter::scan_pgs_for(set<pg_t>& pgs, int osd)
+{
+  dout(10) << "scan_pgs_for osd" << osd << dendl;
+
+  for (hash_map<pg_t,PG>::iterator i = pg_map.begin();
+       i != pg_map.end();
+       i++) {
+    pg_t pgid = i->first;
+    PG& pg = i->second;
+    if (pg.acting.size() && pg.acting[0] == osd)
+      pgs.insert(pgid);
+  }
+}
+
 void Objecter::scan_pgs(set<pg_t>& changed_pgs)
 {
   dout(10) << "scan_pgs" << dendl;
@@ -1038,34 +1052,27 @@ void Objecter::handle_osd_modify_reply(MOSDOpReply *m)
 
 
 
-void Objecter::ms_handle_failure(Message *m, entity_name_t dest, const entity_inst_t& inst)
+void Objecter::ms_handle_remote_reset(const entity_addr_t& addr, entity_name_t dest)
 {
-  if (dest.is_mon()) {
-    // try a new mon
-    int mon = monmap->pick_mon(true);
-    dout(0) << "ms_handle_failure " << dest << " inst " << inst 
-            << ", resending to mon" << mon 
-            << dendl;
-    messenger->send_message(m, monmap->get_inst(mon));
-  } 
-  else if (dest.is_osd()) {
+  entity_inst_t inst;
+  inst.name = dest;
+  inst.addr = addr;
+
+  if (dest.is_osd()) {
     if (!osdmap->have_inst(dest.num()) ||
        (osdmap->get_inst(dest.num()) != inst)) {
-      dout(0) << "ms_handle_failure " << dest << " inst " << inst 
-             << ", dropping, already have newer osdmap" << dendl;
+      dout(0) << "ms_handle_remote_reset " << dest << " inst " << inst
+             << ", ignoring, already have newer osdmap" << dendl;
     } else {
-      int mon = monmap->pick_mon();
-      dout(0) << "ms_handle_failure " << dest << " inst " << inst 
-             << ", dropping, reporting to mon" << mon 
-             << dendl;
-      messenger->send_message(new MOSDFailure(monmap->fsid, inst, osdmap->get_epoch()), 
-                             monmap->get_inst(mon));
+      // kick requests
+      set<pg_t> changed_pgs;
+      dout(0) << "ms_handle_remote_reset " << dest << dendl;
+      scan_pgs_for(changed_pgs, dest.num());
+      if (!changed_pgs.empty()) {
+       dout(0) << "ms_handle_remote_reset " << dest << " kicking " << changed_pgs << dendl;
+       kick_requests(changed_pgs);
+      }
     }
-    delete m;
-  } else {
-    dout(0) << "ms_handle_failure " << dest << " inst " << inst 
-            << ", dropping" << dendl;
-    delete m;
   }
 }
 
index e11a6de48d43d5fb3f117e701b3096cba6e0827d..ab8a49e9ca4181979dc9e0148d8bb8818b1a801f 100644 (file)
@@ -185,7 +185,8 @@ class Objecter {
     assert(pg_map[pgid].active_tids.empty());
     pg_map.erase(pgid);
   }
-  void scan_pgs(set<pg_t>& chnaged_pgs);
+  void scan_pgs(set<pg_t>& changed_pgs);
+  void scan_pgs_for(set<pg_t>& changed_pgs, int osd);
   void kick_requests(set<pg_t>& changed_pgs);
     
 
@@ -251,7 +252,7 @@ class Objecter {
   tid_t lock(int op, object_t oid, int flags, ceph_object_layout ol, Context *onack, Context *oncommit);
 
 
-  void ms_handle_failure(Message *m, entity_name_t dest, const entity_inst_t& inst);
+  void ms_handle_remote_reset(const entity_addr_t& addr, entity_name_t dest);
 
 };