in ratis-logservice/src/main/java/org/apache/ratis/logservice/server/MetaStateMachine.java [131:183]
public TransactionContext applyTransactionSerial(TransactionContext trx) throws InvalidProtocolBufferException {
RaftProtos.LogEntryProto x = trx.getLogEntry();
MetaSMRequestProto req = null;
try {
req = MetaSMRequestProto.parseFrom(x.getStateMachineLogEntry().getLogData());
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
throw e;
}
switch (req.getTypeCase()) {
case REGISTERREQUEST:
LogServiceRegisterLogRequestProto r = req.getRegisterRequest();
LogName logname = LogServiceProtoUtil.toLogName(r.getLogname());
RaftGroup rg = MetaServiceProtoUtil.toRaftGroup(r.getRaftGroup());
rg.getPeers().stream().forEach(raftPeer -> {
Set<LogName> logNames;
if(!peerLogs.containsKey(raftPeer)) {
logNames = new HashSet<>();
peerLogs.put(raftPeer, logNames);
} else {
logNames = peerLogs.get(raftPeer);
}
logNames.add(logname);
});
map.put(logname, rg);
LOG.info("Log {} registered at {} with group {} ", logname, getId(), rg );
break;
case UNREGISTERREQUEST:
LogServiceUnregisterLogRequestProto unregReq = req.getUnregisterRequest();
logname = LogServiceProtoUtil.toLogName(unregReq.getLogname());
map.remove(logname);
break;
case PINGREQUEST:
LogServicePingRequestProto pingRequest = req.getPingRequest();
RaftPeer peer = MetaServiceProtoUtil.toRaftPeer(pingRequest.getPeer());
//If Set<RaftPeer> contains peer then do nothing as that's just heartbeat else add the peer to the set.
if (!peers.contains(peer)) {
peers.add(peer);
avail.add(new PeerGroups(peer));
heartbeatInfo.put(peer, System.currentTimeMillis());
}
break;
case HEARTBEATREQUEST:
MetaServiceProtos.LogServiceHeartbeatRequestProto heartbeatRequest = req.getHeartbeatRequest();
RaftPeer heartbeatPeer = MetaServiceProtoUtil.toRaftPeer(heartbeatRequest.getPeer());
heartbeatInfo.put(heartbeatPeer, System.currentTimeMillis());
break;
default:
}
return super.applyTransactionSerial(trx);
}