]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/PaxosService: prevent reads until initial service commit is done
authorSage Weil <sage@inktank.com>
Mon, 8 Jul 2013 17:49:28 +0000 (10:49 -0700)
committerSage Weil <sage@inktank.com>
Sat, 13 Jul 2013 21:31:50 +0000 (14:31 -0700)
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 <sage@inktank.com>
Reviewed-by: Joao Eduardo Luis <joao.luis@inktank.com>
(cherry picked from commit d08b6d6df7dba06dad73bdec2c945f24afc02717)

src/mon/PaxosService.h

index 1b994dcbe84cf3b28de00cffb1f528e099eeb675..9d2812f86b97f7381897d79a7a5ca13537e2c33b 100644 (file)
@@ -536,6 +536,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
@@ -543,7 +544,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;
   }
@@ -615,7 +617,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);