]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: AuthMonitor: don't return global_id right away if we're increasing it
authorJoao Eduardo Luis <joao.luis@inktank.com>
Mon, 11 Mar 2013 23:06:19 +0000 (23:06 +0000)
committerSage Weil <sage@inktank.com>
Wed, 13 Mar 2013 22:38:43 +0000 (15:38 -0700)
This only happens on the Leader and leads to duplicate global_ids.

Fixes: #4285
Signed-off-by: Joao Luis <joao.luis@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
src/mon/AuthMonitor.cc

index da4fe92fb9a6cf8fd9afd52718836f25e6e25eb6..421024fd0458461479f0495d6a2f81f6ee4ff9e3 100644 (file)
@@ -328,7 +328,7 @@ uint64_t AuthMonitor::assign_global_id(MAuth *m, bool should_increase_max)
 
   uint64_t next_global_id = last_allocated_id + 1;
 
-  if (next_global_id < max_global_id) {
+  {
     int remainder = next_global_id % total_mon;
     if (remainder)
       remainder = total_mon - remainder;
@@ -340,9 +340,12 @@ uint64_t AuthMonitor::assign_global_id(MAuth *m, bool should_increase_max)
     if (!mon->is_leader() || !should_increase_max) {
       return 0;
     }
+    bool return_next = (next_global_id == max_global_id);
     while (next_global_id >= max_global_id) {
       increase_max_global_id();
     }
+    if (!return_next)
+      return 0;
   }
 
   last_allocated_id = next_global_id;
@@ -433,6 +436,12 @@ bool AuthMonitor::prep_auth(MAuth *m, bool paxos_writable)
   if (!s->global_id) {
     s->global_id = assign_global_id(m, paxos_writable);
     if (!s->global_id) {
+      if (mon->is_leader() && paxos_writable) {
+        dout(10) << "increasing global id, waitlisting message" << dendl;
+        wait_for_active(new C_RetryMessage(this, m));
+        goto done;
+      }
+
       delete s->auth_handler;
       s->auth_handler = NULL;
       s->put();