]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: use RecoveryContext transaction, finishers on recovery completion
authorSage Weil <sage.weil@dreamhost.com>
Tue, 31 Jan 2012 15:23:10 +0000 (07:23 -0800)
committerSage Weil <sage@newdream.net>
Tue, 31 Jan 2012 19:44:08 +0000 (11:44 -0800)
We should use the enclosing transaction and finisher list here.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/osd/OSD.cc
src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 64b6e59f248bf269bdbd6ea2fbec02772d660c0f..42de018907ecb2b66d8359b4872938ad25d3f3cf 100644 (file)
@@ -5005,7 +5005,14 @@ void OSD::do_recovery(PG *pg)
     dout(20) << "  active was " << recovery_oids[pg->info.pgid] << dendl;
 #endif
     
-    int started = pg->start_recovery_ops(max);
+    ObjectStore::Transaction *t = new ObjectStore::Transaction;
+    C_Contexts *fin = new C_Contexts(g_ceph_context);
+    map< int, vector<PG::Info> >  notify_list;  // primary -> list
+    map< int, map<pg_t,PG::Query> > query_map;    // peer -> PG -> get_summary_since
+    map<int,MOSDPGInfo*> info_map;  // peer -> message
+    PG::RecoveryCtx rctx(&query_map, &info_map, 0, &fin->contexts, t);
+
+    int started = pg->start_recovery_ops(max, &rctx);
     
     dout(10) << "do_recovery started " << started
             << " (" << recovery_ops_active << "/" << g_conf->osd_recovery_max_active << " rops) on "
@@ -5018,11 +5025,8 @@ void OSD::do_recovery(PG *pg)
      * out while trying to pull.
      */
     if (!started && pg->have_unfound()) {
-      map< int, map<pg_t,PG::Query> > query_map;
       pg->discover_all_missing(query_map);
-      if (query_map.size())
-       do_queries(query_map);
-      else {
+      if (!query_map.size()) {
        dout(10) << "do_recovery  no luck, giving up on this pg for now" << dendl;
        recovery_wq.lock();
        pg->recovery_item.remove_myself();      // sigh...
@@ -5036,6 +5040,18 @@ void OSD::do_recovery(PG *pg)
       recovery_wq.unlock();
     }
     
+    do_notifies(notify_list, pg->get_osdmap()->get_epoch());  // notify? (residual|replica)
+    do_queries(query_map);
+    do_infos(info_map);
+
+    if (!t->empty()) {
+      int tr = store->queue_transaction(&pg->osr, t, new ObjectStore::C_DeleteTransaction(t), fin);
+      assert(tr == 0);
+    } else {
+      delete t;
+      delete fin;
+    }
+
     pg->unlock();
   }
   pg->put();
index c35c14685c203829057c9ababea4f9984747a718..df11a3aa74523dcb9fe56708a70dfdbc0f93f5cb 100644 (file)
@@ -4058,12 +4058,8 @@ boost::statechart::result PG::RecoveryState::Active::react(const RecoveryComplet
   if (pg->is_all_uptodate()) {
     dout(10) << "recovery complete" << dendl;
     pg->log.reset_recovery_pointers();
-    ObjectStore::Transaction *t = new ObjectStore::Transaction;
-    C_Contexts *fin = new C_Contexts(g_ceph_context);
-    pg->finish_recovery(*t, fin->contexts);
-    int tr = pg->osd->store->queue_transaction(&pg->osr, t,
-                                              new ObjectStore::C_DeleteTransaction(t), fin);
-    assert(tr == 0);
+    pg->finish_recovery(*context< RecoveryMachine >().get_cur_transaction(),
+                       *context< RecoveryMachine >().get_context_list());
   } else {
     dout(10) << "recovery not yet complete: some osds not up to date" << dendl;
   }
index 526f0aae0696887ede61e668dfd7f687d11af8aa..4908904b7cee3487d7b45e8069caa74b5c446828 100644 (file)
@@ -1589,7 +1589,7 @@ public:
 
   virtual void clean_up_local(ObjectStore::Transaction& t) = 0;
 
-  virtual int start_recovery_ops(int max) = 0;
+  virtual int start_recovery_ops(int max, RecoveryCtx *prctx) = 0;
 
   void purge_strays();
 
index ddab37feb24bb1dbd89d984e25a7c1638f4237a6..c8d11186c2ab2a9111118e442896fb796e331b8c 100644 (file)
@@ -5127,7 +5127,7 @@ void ReplicatedPG::check_recovery_op_pulls(const OSDMapRef osdmap)
 }
   
 
-int ReplicatedPG::start_recovery_ops(int max)
+int ReplicatedPG::start_recovery_ops(int max, RecoveryCtx *prctx)
 {
   int started = 0;
   assert(is_primary());
@@ -5166,8 +5166,8 @@ int ReplicatedPG::start_recovery_ops(int max)
 
   assert(recovery_ops_active == 0);
 
-  PG::RecoveryCtx rctx(0, 0, 0, 0, 0);
-  handle_recovery_complete(&rctx);
+  handle_recovery_complete(prctx);
+
   return 0;
 }
 
index 830fae1706838d8dca58fb03a5531bf96a3d92f7..dc93168185f4ab5f2e56c9463f78e54e1ba7d140 100644 (file)
@@ -638,7 +638,7 @@ protected:
   void _clear_recovery_state();
 
   void queue_for_recovery();
-  int start_recovery_ops(int max);
+  int start_recovery_ops(int max, RecoveryCtx *prctx);
   int recover_primary(int max);
   int recover_replicas(int max);
   int recover_backfill(int max);