From: Sage Weil Date: Mon, 8 Jul 2013 17:49:28 +0000 (-0700) Subject: mon/PaxosService: prevent reads until initial service commit is done X-Git-Tag: v0.67-rc1~137 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d08b6d6df7dba06dad73bdec2c945f24afc02717;p=ceph.git mon/PaxosService: prevent reads until initial service commit is done Do not process reads (or, by PaxosService::dispatch() implication, writes) until we have committed the initial service state. This avoids things like EPERM due to missing keys when we race with mon creation, triggered by teuthology tests doing their health check after startup. Fixes: #5515 Backport: cuttlefish Signed-off-by: Sage Weil Reviewed-by: Joao Eduardo Luis --- diff --git a/src/mon/PaxosService.h b/src/mon/PaxosService.h index 3e5c69fb22fe..3b4c3acca13f 100644 --- a/src/mon/PaxosService.h +++ b/src/mon/PaxosService.h @@ -548,6 +548,7 @@ public: * * - the client hasn't seen the future relative to this PaxosService * - this service isn't proposing. + * - we have committed our initial state (last_committed > 0) * * @param ver The version we want to check if is readable * @returns true if it is readable; false otherwise @@ -555,7 +556,8 @@ public: bool is_readable(version_t ver = 0) { if (ver > get_last_committed() || is_proposing() || - !paxos->is_readable(0)) + !paxos->is_readable(0) || + get_last_committed() == 0) return false; return true; } @@ -627,7 +629,8 @@ public: * happens to be readable at that specific point in time. */ if (is_proposing() || - ver > get_last_committed()) + ver > get_last_committed() || + get_last_committed() == 0) wait_for_finished_proposal(c); else paxos->wait_for_readable(c);