dledger icon indicating copy to clipboard operation
dledger copied to clipboard

Optimize DLedgerLeaderElector.maintainAsCandidate Lock

Open supervate opened this issue 2 years ago • 0 comments

This is the original code

synchronized (knownMaxTermInGroup) {
    switch (x.getVoteResult()) {
        case ACCEPT:
            acceptedNum.incrementAndGet();
            break;
        case REJECT_ALREADY_HAS_LEADER:
            alreadyHasLeader.compareAndSet(false, true);
            break;
        case REJECT_TERM_SMALL_THAN_LEDGER:
        case REJECT_EXPIRED_VOTE_TERM:
            if (x.getTerm() > knownMaxTermInGroup.get()) {
                knownMaxTermInGroup.set(x.getTerm());
            }
            break;
        case REJECT_EXPIRED_LEDGER_TERM:
        case REJECT_SMALL_LEDGER_END_INDEX:
            biggerLedgerNum.incrementAndGet();
            break;
        case REJECT_TERM_NOT_READY:
            notReadyTermNum.incrementAndGet();
            break;
        case REJECT_ALREADY_VOTED:
        case REJECT_TAKING_LEADERSHIP:
        default:
            break;
    }
}

We can delete the synchronized by use CAS. code as following

switch (x.getVoteResult()) {
    case ACCEPT:
        acceptedNum.incrementAndGet();
        break;
    case REJECT_ALREADY_HAS_LEADER:
        alreadyHasLeader.compareAndSet(false, true);
        break;
    case REJECT_TERM_SMALL_THAN_LEDGER:
    case REJECT_EXPIRED_VOTE_TERM:
        // cas update
        for (;;) {
            long maxTermInGroup = knownMaxTermInGroup.get();
            if (x.getTerm() <= maxTermInGroup) {
                break;
            }
            if (knownMaxTermInGroup.compareAndSet(maxTermInGroup, x.getTerm())) {
                break;
            }
        }
        break;
    case REJECT_EXPIRED_LEDGER_TERM:
    case REJECT_SMALL_LEDGER_END_INDEX:
        biggerLedgerNum.incrementAndGet();
        break;
    case REJECT_TERM_NOT_READY:
        notReadyTermNum.incrementAndGet();
        break;
    case REJECT_ALREADY_VOTED:
    case REJECT_TAKING_LEADERSHIP:
    default:
        break;
}

supervate avatar Oct 08 '23 03:10 supervate