diff options
author | Sage Weil <sage@inktank.com> | 2013-08-04 09:37:11 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-04 09:38:49 -0700 |
commit | b7ad89b7a0d1a640bc4f5207746268ec2a26a085 (patch) | |
tree | 554842d67f5a08eac79951ed0d0d3652e3ea2556 | |
parent | 429f0b82523645401e707f59500aef087a54d35a (diff) | |
download | ceph-b7ad89b7a0d1a640bc4f5207746268ec2a26a085.tar.gz |
mon: make max_global_id increase a bit more robustwip-mon-skip-auth-cuttlefish
- Increase it in one go, not with lots of additions
- Deal with weird edge cases where max_global_id is not a sane value
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/mon/AuthMonitor.cc | 16 | ||||
-rw-r--r-- | src/mon/AuthMonitor.h | 2 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/mon/AuthMonitor.cc b/src/mon/AuthMonitor.cc index 6c6aab86f9a..2acc0a78591 100644 --- a/src/mon/AuthMonitor.cc +++ b/src/mon/AuthMonitor.cc @@ -215,11 +215,13 @@ void AuthMonitor::update_from_paxos(bool *need_bootstrap) */ } -void AuthMonitor::increase_max_global_id() +void AuthMonitor::increase_max_global_id(uint64_t min) { assert(mon->is_leader()); - - max_global_id += g_conf->mon_globalid_prealloc; + assert(g_conf->mon_globalid_prealloc > (int)mon->monmap->size()); + if (min < max_global_id) + min = max_global_id; + max_global_id = min + g_conf->mon_globalid_prealloc; dout(10) << "increasing max_global_id to " << max_global_id << dendl; Incremental inc; inc.inc_type = GLOBAL_ID; @@ -352,9 +354,9 @@ uint64_t AuthMonitor::assign_global_id(MAuth *m, bool should_increase_max) bool return_next = (next_global_id <= max_global_id); // bump the max? - while (mon->is_leader() && - next_global_id >= max_global_id - g_conf->mon_globalid_prealloc / 2) { - increase_max_global_id(); + if (mon->is_leader() && + next_global_id + (g_conf->mon_globalid_prealloc / 2) >= max_global_id) { + increase_max_global_id(next_global_id); } if (return_next) { @@ -878,7 +880,7 @@ done: bool AuthMonitor::prepare_global_id(MMonGlobalID *m) { dout(10) << "AuthMonitor::prepare_global_id" << dendl; - increase_max_global_id(); + increase_max_global_id(0); m->put(); return true; diff --git a/src/mon/AuthMonitor.h b/src/mon/AuthMonitor.h index ddd68cf3317..75243431e39 100644 --- a/src/mon/AuthMonitor.h +++ b/src/mon/AuthMonitor.h @@ -130,7 +130,7 @@ private: void update_from_paxos(bool *need_bootstrap); void create_pending(); // prepare a new pending bool prepare_global_id(MMonGlobalID *m); - void increase_max_global_id(); + void increase_max_global_id(uint64_t next); uint64_t assign_global_id(MAuth *m, bool should_increase_max); // propose pending update to peers void encode_pending(MonitorDBStore::Transaction *t); |