public void repairSurvivors ( ) { // cancel() and repair() must be synchronized by the caller (the deliver lock, // currently). If cancelled and the last repair message arrives, don't send // out corrections! if ( this . m_promotionResult . isCancelled ( ) ) { repairLogger . debug ( m_whoami + "Skipping repair message creation for cancelled Term." ) ; return ; } int queued = 0 ; if ( repairLogger . isDebugEnabled ( ) ) { repairLogger . debug ( m_whoami + "received all repair logs and is repairing surviving replicas." ) ; } for ( Iv2RepairLogResponseMessage li : m_repairLogUnion ) { if ( repairLogger . isDebugEnabled ( ) ) { repairLogger . debug ( m_whoami + "RepairResponse:\n" + li ) ; } List < Long > needsRepair = new ArrayList < Long > ( 5 ) ; for ( Entry < Long , ReplicaRepairStruct > entry : m_replicaRepairStructs . entrySet ( ) ) { if ( entry . getValue ( ) . needs ( li . getHandle ( ) ) ) { ++ queued ; if ( repairLogger . isDebugEnabled ( ) ) { repairLogger . debug ( m_whoami + "repairing " + CoreUtils . hsIdToString ( entry . getKey ( ) ) + ". Max seen " + TxnEgo . txnIdToString ( entry . getValue ( ) . m_maxSpHandleSeen ) + ". Repairing with " + TxnEgo . txnIdToString ( li . getHandle ( ) ) ) ; } needsRepair . add ( entry . getKey ( ) ) ; } } if ( ! needsRepair . isEmpty ( ) ) { if ( repairLogger . isDebugEnabled ( ) ) { repairLogger . debug ( m_whoami + "repairing: " + CoreUtils . hsIdCollectionToString ( needsRepair ) + " with message: " + li . getPayload ( ) ) ; } m_mailbox . repairReplicasWith ( needsRepair , li . getPayload ( ) ) ; } } if ( repairLogger . isDebugEnabled ( ) ) { repairLogger . debug ( m_whoami + "finished queuing " + queued + " replica repair messages." ) ; } m_promotionResult . set ( new RepairResult ( m_maxSeenTxnId ) ) ; }
Send missed - messages to survivors .