Hello guys,

AckSet is introduced recently to resolve slow bookie issue. But the
semantic of 'writeQuorumSize' is not so clearly. What kind of goal we
should achieve for 'writeQuorumSize':

a) an entry is written to all 'writeQuorumSize' bookies eventually
b) just guarantee issuing 'writeQuorumSize' bookies and at least
'ackQuorumSize' bookies acked. other bookies we don't care about it.

semantic a):

if we want a), currently it doesn't work. for example, writing ensemble (A,
B, C, D), writeQuorumSize is 3, ackQuorumSize is 2 and C is a slow bookie.

1. client adding entries 0. and entry 0 is acked.
2. at time T, C is timeout (due to it is slow of failed). so the adding
entry 0  at C would failed with BookieHandleNotAvailable. It would try to
pickup a new bookie and unsetSuccessAndSentWriteRequest to new bookie. But
nothing would be executed since pendingAddOps queue is empty. so nothing
would be added in the new bookie.

*    private void unsetSuccessAndSendWriteRequest(final int bookieIndex) {*
*        for (PendingAddOp pendingAddOp : pendingAddOps) {*
*            pendingAddOp.unsetSuccessAndSendWriteRequest(bookieIndex);*
*        }*
*    }*

If we want to achieve semantic a), it would be difficult to handle client
failure case.

semantic b):

if we just want achieve b), so do we need to pickup a new bookie replace
the slow bookie? Also even a new bookie is replaced, no entry would be
added again to it, since pendingAddOps is empty.

I raised this question, is because if we pickup a new bookie replace the
slow bookie, it might cause closing ledger due to
NotEnoughBookiesException. It is easy to produce the case using existing
test case. Please see the attached file.

if we allow b), so maybe we don't need handleBookieFailure when a late
response arrived at the client after its entry has been acked.

-Sijie

Reply via email to