bookkeeper-tlaplus icon indicating copy to clipboard operation
bookkeeper-tlaplus copied to clipboard

Different Implementation of ChangeEnsemble between BookKeeperProtocol and BookKeeperProtocolWithLimbo.

Open thetumbled opened this issue 1 year ago • 0 comments

Hi, I have a question about the different Implementation of ChangeEnsemble between BookKeeperProtocol and BookKeeperProtocolWithLimbo. The ChangeEnsemble operator in BookKeeperProtocolWithLimbo is defined as follows, which only select one faied bookie and add a seemingly unnecessary check ValidNextFragment. I wonder whether it is a bug or a different implementation due to the new feature limbo? I will appreciate it if you could help to answer this question, thanks.

ChangeEnsemble(c, recovery) ==
    /\ NoPendingResends(c)
    /\ \/ recovery
       \/ ~recovery /\ c.meta_version = meta_version
    /\ \E bookie \in c.curr_fragment.ensemble :
        /\ WriteTimeoutForBookie(messages, bookie, recovery)
        /\ EnsembleAvailable(c.curr_fragment.ensemble \ {bookie}, {bookie})
        /\ ValidNextFragment(c.lac + 1)
        /\ LET new_ensemble   == SelectEnsemble(c.curr_fragment.ensemble \ {bookie}, {bookie})
               first_entry_id == c.lac + 1
           IN LET updated_fragments == UpdatedFragments(c, first_entry_id, new_ensemble)
              IN
                \* only update the metadata if not in ledger recovery
                /\ IF recovery 
                   THEN UNCHANGED << meta_version, meta_fragments >>
                   ELSE /\ meta_fragments' = updated_fragments
                        /\ meta_version' = meta_version + 1
                /\ clients' = [clients EXCEPT ![c.id] =  
                                    [c EXCEPT !.meta_version  = IF recovery THEN @ ELSE meta_version + 1,
                                              !.confirmed     = [id \in DOMAIN c.confirmed |->
                                                                   IF id >= first_entry_id
                                                                   THEN c.confirmed[id] \ {bookie}
                                                                   ELSE c.confirmed[id]],
                                              !.fragments     = updated_fragments,
                                              !.curr_fragment = Last(updated_fragments)]]
                /\ ClearWriteTimeout(bookie, recovery)

thetumbled avatar Mar 13 '24 12:03 thetumbled