]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mon/PaxosService.cc
update sources to v12.1.0
[ceph.git] / ceph / src / mon / PaxosService.cc
index a1c9df895a89b52933951dc3cb392854e2f34f48..621f942149252d7866f91e9f23bfc5fb5d460915 100644 (file)
@@ -88,37 +88,51 @@ bool PaxosService::dispatch(MonOpRequestRef op)
   }
 
   // update
-  if (prepare_update(op)) {
-    double delay = 0.0;
-    if (should_propose(delay)) {
-      if (delay == 0.0) {
-       propose_pending();
-      } else {
-       // delay a bit
-       if (!proposal_timer) {
-         /**
-          * Callback class used to propose the pending value once the proposal_timer
-          * fires up.
-          */
-         proposal_timer = new C_MonContext(mon, [this](int r) {
-             proposal_timer = 0;
-             if (r >= 0)
-               propose_pending();
-             else if (r == -ECANCELED || r == -EAGAIN)
-               return;
-             else
-               assert(0 == "bad return value for proposal_timer");
-           });
-         dout(10) << " setting proposal_timer " << proposal_timer << " with delay of " << delay << dendl;
-         mon->timer.add_event_after(delay, proposal_timer);
-       } else { 
-         dout(10) << " proposal_timer already set" << dendl;
-       }
-      }
-    } else {
-      dout(10) << " not proposing" << dendl;
-    }
-  }     
+  if (!prepare_update(op)) {
+    // no changes made.
+    return true;
+  }
+
+  if (need_immediate_propose) {
+    dout(10) << __func__ << " forced immediate propose" << dendl;
+    need_immediate_propose = false;
+    propose_pending();
+    return true;
+  }
+
+  double delay = 0.0;
+  if (!should_propose(delay)) {
+    dout(10) << " not proposing" << dendl;
+    return true;
+  }
+
+  if (delay == 0.0) {
+    propose_pending();
+    return true;
+  }
+
+  // delay a bit
+  if (!proposal_timer) {
+    /**
+       * Callback class used to propose the pending value once the proposal_timer
+       * fires up.
+       */
+    proposal_timer = new C_MonContext(mon, [this](int r) {
+        proposal_timer = 0;
+        if (r >= 0) {
+          propose_pending();
+        } else if (r == -ECANCELED || r == -EAGAIN) {
+          return;
+        } else {
+          assert(0 == "bad return value for proposal_timer");
+        }
+    });
+    dout(10) << " setting proposal_timer " << proposal_timer
+             << " with delay of " << delay << dendl;
+    mon->timer.add_event_after(delay, proposal_timer);
+  } else {
+    dout(10) << " proposal_timer already set" << dendl;
+  }
   return true;
 }
 
@@ -154,9 +168,9 @@ void PaxosService::post_refresh()
 bool PaxosService::should_propose(double& delay)
 {
   // simple default policy: quick startup, then some damping.
-  if (get_last_committed() <= 1)
+  if (get_last_committed() <= 1) {
     delay = 0.0;
-  else {
+  else {
     utime_t now = ceph_clock_now();
     if ((now - paxos->last_commit_time) > g_conf->paxos_propose_interval)
       delay = (double)g_conf->paxos_min_wait;