package lsr.paxos.replica;
import static lsr.common.ProcessDescriptor.processDescriptor;
import java.util.BitSet;
import lsr.common.ClientRequest;
import lsr.paxos.core.Paxos;
import lsr.paxos.messages.ForwardClientRequests;
import lsr.paxos.messages.Message;
import lsr.paxos.messages.MessageType;
import lsr.paxos.network.MessageHandler;
import lsr.paxos.network.Network;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ClientRequestForwarder {
private final Paxos paxos;
private final Network network;
private ClientRequestManager clientRequestManager = null;
public ClientRequestForwarder(Paxos paxos) {
this.paxos = paxos;
this.network = paxos.getNetwork();
}
public void setClientRequestManager(ClientRequestManager clientRequestManager) {
this.clientRequestManager = clientRequestManager;
}
void forward(ClientRequest[] requests) {
// The object that will be sent.
ForwardClientRequests fReqMsg = new ForwardClientRequests(requests);
logger.debug("Forwarding requests: {}", fReqMsg);
int leaderId = paxos.getLeaderId();
if (processDescriptor.localId == leaderId) {
// wtfu?
if (clientRequestManager != null)
clientRequestManager.dispatchOnClientRequest(requests, null);
} else
network.sendMessage(fReqMsg, leaderId);
}
public void start() {
Network.addMessageListener(MessageType.ForwardedClientRequests, new MessageHandler() {
public void onMessageSent(Message message, BitSet destinations) {
assert false;
}
public void onMessageReceived(Message msg, int sender) {
assert msg instanceof ForwardClientRequests;
ForwardClientRequests fcr = (ForwardClientRequests) msg;
ClientRequest[] requests = fcr.getRequests();
if (clientRequestManager != null)
clientRequestManager.dispatchOnClientRequest(requests, null);
}
});
}
static final Logger logger = LoggerFactory.getLogger(ClientRequestForwarder.class);
}