-
Michael Eischer authoredMichael Eischer authored
REFITMenciusSplitter.java 2.01 KiB
package refit.replica.order;
import refit.config.REFITLogger;
import refit.message.REFITAckReply;
import refit.message.REFITInstruction;
import refit.message.REFITInstruction.REFITConfigurationNotification;
import refit.message.REFITMessage;
import refit.replica.REFITBaseReplica;
import refit.replica.REFITObserver;
import refit.replica.REFITStage;
import refit.scheduler.REFITSchedulerTaskType;
public class REFITMenciusSplitter extends REFITStage {
public final REFITObserver<REFITConfigurationNotification>[] viewChangeSenders;
public final REFITObserver<REFITAckReply>[] ackSenders;
@SuppressWarnings("unchecked")
public REFITMenciusSplitter(REFITBaseReplica replica) {
super(REFITSchedulerTaskType.ORDER_STAGE, replica);
viewChangeSenders = (REFITObserver<REFITConfigurationNotification>[]) new REFITObserver[REFITOrderGroups.COUNT];
ackSenders = (REFITObserver<REFITAckReply>[]) new REFITObserver[REFITOrderGroups.COUNT];
for (int i = 0; i < viewChangeSenders.length; i++) viewChangeSenders[i] = new REFITObserver<>();
for (int i = 0; i < ackSenders.length; i++) ackSenders[i] = new REFITObserver<>();
}
@Override
protected void handleMessage(REFITMessage message) {
switch (message.type) {
case ACK_REPLY:
REFITAckReply ack = (REFITAckReply) message;
if (ack.groupID >= 0) {
ackSenders[ack.groupID].broadcast(ack);
} else {
for (int i = 0; i < ackSenders.length; i++) {
ackSenders[i].broadcast(ack);
}
}
break;
case INSTRUCTION:
handleInstruction((REFITInstruction) message);
break;
default:
REFITLogger.logError(this, "drop message of unexpected type " + message.type);
}
}
private void handleInstruction(REFITInstruction message) {
switch (message.instructionType) {
case CONFIGURATION_NOTIFICATION:
REFITConfigurationNotification config = (REFITConfigurationNotification) message;
viewChangeSenders[config.groupID].broadcast(config);
break;
default:
REFITLogger.logError(this, "drop instruction of unexpected type " + message.instructionType);
}
}
}