public void notifyNewLeaderOfTxnDoneIfNeeded() {
        //return quickly to avoid performance hit
        if (m_newLeaderHSID == Long.MIN_VALUE ) {
            return;
        }

        SpScheduler scheduler = (SpScheduler)m_scheduler;
        if (!scheduler.txnDoneBeforeCheckPoint()) {
            return;
        }

        MigratePartitionLeaderMessage message = new MigratePartitionLeaderMessage(m_hsId, m_newLeaderHSID);
        send(message.getNewLeaderHSID(), message);

        //reset status on the old partition leader
        m_migratePartitionLeaderStatus = MigratePartitionLeaderStatus.NONE;
        m_repairLog.setLeaderState(false);
        tmLog.info("MigratePartitionLeader previous leader " + CoreUtils.hsIdToString(m_hsId) + " notifies new leader " +
                CoreUtils.hsIdToString(m_newLeaderHSID) + " transactions are drained." + " status:" + m_migratePartitionLeaderStatus);
        m_newLeaderHSID = Long.MIN_VALUE;
    }
public void notifyNewLeaderOfTxnDoneIfNeeded ( ) { if ( m_newLeaderHSID == Long . MIN_VALUE ) { return ; } SpScheduler scheduler = ( SpScheduler ) m_scheduler ; if ( ! scheduler . txnDoneBeforeCheckPoint ( ) ) { return ; } MigratePartitionLeaderMessage message = new MigratePartitionLeaderMessage ( m_hsId , m_newLeaderHSID ) ; send ( message . getNewLeaderHSID ( ) , message ) ; m_migratePartitionLeaderStatus = MigratePartitionLeaderStatus . NONE ; m_repairLog . setLeaderState ( false ) ; tmLog . info ( "MigratePartitionLeader previous leader " + CoreUtils . hsIdToString ( m_hsId ) + " notifies new leader " + CoreUtils . hsIdToString ( m_newLeaderHSID ) + " transactions are drained." + " status:" + m_migratePartitionLeaderStatus ) ; m_newLeaderHSID = Long . MIN_VALUE ; }
Then new master can proceed to process transactions.