]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Break apart rebalance function into prepwork and offload
authorGreg Farnum <gregf@hq.newdream.net>
Thu, 1 Oct 2009 00:00:58 +0000 (17:00 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Fri, 2 Oct 2009 22:22:09 +0000 (15:22 -0700)
src/mds/MDBalancer.cc
src/mds/MDBalancer.h

index 9ff02a058b77f5ab34e8300ab3b58ba89cc68370..e1a2a570e8f7718f646d622eb555b8e4616825d9 100644 (file)
@@ -331,7 +331,7 @@ void MDBalancer::do_rebalance(int beat)
 {
   int cluster_size = mds->get_mds_map()->get_num_mds();
   int whoami = mds->get_nodeid();
-  utime_t now = g_clock.now();
+  rebalance_time = g_clock.now();
 
   dump_pop_map();
 
@@ -347,7 +347,7 @@ void MDBalancer::do_rebalance(int beat)
   // rescale!  turn my mds_load back into meta_load units
   double load_fac = 1.0;
   if (mds_load[whoami].mds_load() > 0) {
-    double metald = mds_load[whoami].auth.meta_load(now);
+    double metald = mds_load[whoami].auth.meta_load(rebalance_time);
     double mdsld = mds_load[whoami].mds_load();
     load_fac = metald / mdsld;
     dout(7) << " load_fac is " << load_fac 
@@ -484,9 +484,13 @@ void MDBalancer::do_rebalance(int beat)
       }
     }
   }
+  try_rebalance();
+}
 
 
 
+void MDBalancer::try_rebalance()
+{
   // make a sorted list of my imports
   map<double,CDir*>    import_pop_map;
   multimap<int,CDir*>  import_from_map;
@@ -499,7 +503,7 @@ void MDBalancer::do_rebalance(int beat)
     CDir *im = *it;
     if (im->get_inode()->is_stray()) continue;
 
-    double pop = im->pop_auth_subtree.meta_load(now);
+    double pop = im->pop_auth_subtree.meta_load(rebalance_time);
     if (g_conf.mds_bal_idle_threshold > 0 &&
        pop < g_conf.mds_bal_idle_threshold &&
         im->inode != mds->mdcache->get_root() &&
@@ -566,7 +570,7 @@ void MDBalancer::do_rebalance(int beat)
         
         if (dir->inode->is_root()) continue;
         if (dir->is_freezing() || dir->is_frozen()) continue;  // export pbly already in progress
-        double pop = dir->pop_auth_subtree.meta_load(now);
+        double pop = dir->pop_auth_subtree.meta_load(rebalance_time);
         assert(dir->inode->authority().first == target);  // cuz that's how i put it in the map, dummy
         
         if (pop <= amount-have) {
@@ -623,7 +627,7 @@ void MDBalancer::do_rebalance(int beat)
          pot != candidates.end();
          pot++) {
       if ((*pot)->get_inode()->is_stray()) continue;
-      find_exports(*pot, amount, exports, have, already_exporting, now);
+      find_exports(*pot, amount, exports, have, already_exporting);
       if (have > amount-MIN_OFFLOAD) 
         break;
     }
@@ -634,7 +638,7 @@ void MDBalancer::do_rebalance(int beat)
       dout(-5) << "   - exporting " 
               << (*it)->pop_auth_subtree
               << " "
-              << (*it)->pop_auth_subtree.meta_load(now
+              << (*it)->pop_auth_subtree.meta_load(rebalance_time
               << " to mds" << target 
                << " " << **it 
                << dendl;
@@ -653,8 +657,7 @@ void MDBalancer::find_exports(CDir *dir,
                               double amount, 
                               list<CDir*>& exports, 
                               double& have,
-                              set<CDir*>& already_exporting,
-                             utime_t now)
+                              set<CDir*>& already_exporting)
 {
   double need = amount - have;
   if (need < amount * g_conf.mds_bal_min_start)
@@ -667,7 +670,7 @@ void MDBalancer::find_exports(CDir *dir,
   list<CDir*> bigger_rep, bigger_unrep;
   multimap<double, CDir*> smaller;
 
-  double dir_pop = dir->pop_auth_subtree.meta_load(now);
+  double dir_pop = dir->pop_auth_subtree.meta_load(rebalance_time);
   dout(7) << " find_exports in " << dir_pop << " " << *dir << " need " << need << " (" << needmin << " - " << needmax << ")" << dendl;
 
   double subdir_sum = 0;
@@ -690,7 +693,7 @@ void MDBalancer::find_exports(CDir *dir,
       if (subdir->is_frozen()) continue;  // can't export this right now!
       
       // how popular?
-      double pop = subdir->pop_auth_subtree.meta_load(now);
+      double pop = subdir->pop_auth_subtree.meta_load(rebalance_time);
       subdir_sum += pop;
       dout(15) << "   subdir pop " << pop << " " << *subdir << dendl;
 
@@ -738,7 +741,7 @@ void MDBalancer::find_exports(CDir *dir,
        it != bigger_unrep.end();
        it++) {
     dout(15) << "   descending into " << **it << dendl;
-    find_exports(*it, amount, exports, have, already_exporting, now);
+    find_exports(*it, amount, exports, have, already_exporting);
     if (have > needmin)
       return;
   }
@@ -761,7 +764,7 @@ void MDBalancer::find_exports(CDir *dir,
        it != bigger_rep.end();
        it++) {
     dout(7) << "   descending into replicated " << **it << dendl;
-    find_exports(*it, amount, exports, have, already_exporting, now);
+    find_exports(*it, amount, exports, have, already_exporting);
     if (have > needmin)
       return;
   }
index ba639d234c88756557426ac1a48c17ea934f2db4..8919dbc92b1eafa5196d5e0dfa564591b9791712 100644 (file)
@@ -45,7 +45,7 @@ class MDBalancer {
   utime_t last_heartbeat;
   utime_t last_fragment;
   utime_t last_sample;    
-
+  utime_t rebalance_time; //ensure a consistent view of load for rebalance
 
   // todo
   set<dirfrag_t>   split_queue;
@@ -88,13 +88,17 @@ class MDBalancer {
   void do_fragmenting();
 
   void export_empties();
+  //set up the rebalancing targets for export; maybe time for a name change?
   void do_rebalance(int beat);
+  /*check if the monitor has recorded the current export targets;
+    if it has then do the actual export. Otherwise send off our
+    export targets message again*/
+  void try_rebalance();
   void find_exports(CDir *dir, 
                     double amount, 
                     list<CDir*>& exports, 
                     double& have,
-                    set<CDir*>& already_exporting,
-                   utime_t now);
+                    set<CDir*>& already_exporting);
 
 
   void subtract_export(class CDir *ex);