Fix issue with message Listenter added too late and wrong handling of PreliminaryDataRequest vs. UpdateDataRequest

This commit is contained in:
Manfred Karrer 2016-09-04 11:57:04 -05:00
parent 48e6cc34a8
commit fd1efe7353
2 changed files with 78 additions and 71 deletions

View File

@ -37,6 +37,7 @@ public class RequestDataHandler implements MessageListener {
private static final Logger log = LoggerFactory.getLogger(RequestDataHandler.class);
private static final long TIME_OUT_SEC = 20;
private NodeAddress peersNodeAddress;
///////////////////////////////////////////////////////////////////////////////////////////
@ -85,8 +86,9 @@ public class RequestDataHandler implements MessageListener {
// API
///////////////////////////////////////////////////////////////////////////////////////////
public void requestData(NodeAddress nodeAddress) {
public void requestData(NodeAddress nodeAddress, boolean isPreliminaryDataRequest) {
Log.traceCall("nodeAddress=" + nodeAddress);
peersNodeAddress = nodeAddress;
if (!stopped) {
GetDataRequest getDataRequest;
@ -99,7 +101,7 @@ public class RequestDataHandler implements MessageListener {
.map(e -> e.getKey().bytes)
.collect(Collectors.toSet());
if (networkNode.getNodeAddress() == null)
if (isPreliminaryDataRequest)
getDataRequest = new PreliminaryGetDataRequest(nonce, excludedKeys);
else
getDataRequest = new GetUpdatedDataRequest(networkNode.getNodeAddress(), nonce, excludedKeys);
@ -120,13 +122,13 @@ public class RequestDataHandler implements MessageListener {
}
log.debug("We send a {} to peer {}. ", getDataRequest.getClass().getSimpleName(), nodeAddress);
networkNode.addMessageListener(this);
SettableFuture<Connection> future = networkNode.sendMessage(nodeAddress, getDataRequest);
Futures.addCallback(future, new FutureCallback<Connection>() {
@Override
public void onSuccess(Connection connection) {
if (!stopped) {
RequestDataHandler.this.connection = connection;
connection.addMessageListener(RequestDataHandler.this);
log.trace("Send " + getDataRequest + " to " + nodeAddress + " succeeded.");
} else {
log.trace("We have stopped already. We ignore that networkNode.sendMessage.onSuccess call." +
@ -161,6 +163,7 @@ public class RequestDataHandler implements MessageListener {
@Override
public void onMessage(Message message, Connection connection) {
if (connection.getPeersNodeAddressOptional().isPresent() && connection.getPeersNodeAddressOptional().get().equals(peersNodeAddress)) {
if (message instanceof GetDataResponse) {
Log.traceCall(message.toString() + "\n\tconnection=" + connection);
if (!stopped) {
@ -236,8 +239,10 @@ public class RequestDataHandler implements MessageListener {
log.warn("We have stopped already. We ignore that onDataRequest call.");
}
}
} else {
log.trace("We got a message from another connection and ignore it.");
}
}
public void stop() {
cleanup();
@ -258,8 +263,7 @@ public class RequestDataHandler implements MessageListener {
private void cleanup() {
Log.traceCall();
stopped = true;
if (connection != null)
connection.removeMessageListener(this);
networkNode.removeMessageListener(this);
stopTimeoutTimer();
}

View File

@ -24,6 +24,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
private static final long RETRY_DELAY_SEC = 10;
private static final long CLEANUP_TIMER = 120;
private boolean isPreliminaryDataRequest = true;
///////////////////////////////////////////////////////////////////////////////////////////
@ -101,6 +102,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
Collections.shuffle(nodeAddresses);
NodeAddress nextCandidate = nodeAddresses.get(0);
nodeAddresses.remove(nextCandidate);
isPreliminaryDataRequest = true;
requestData(nextCandidate, nodeAddresses);
}
}
@ -114,6 +116,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
Collections.shuffle(remainingNodeAddresses);
NodeAddress candidate = nodeAddressOfPreliminaryDataRequest.get();
remainingNodeAddresses.remove(candidate);
isPreliminaryDataRequest = false;
requestData(candidate, remainingNodeAddresses);
}
}
@ -301,7 +304,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
}
});
handlerMap.put(nodeAddress, requestDataHandler);
requestDataHandler.requestData(nodeAddress);
requestDataHandler.requestData(nodeAddress, isPreliminaryDataRequest);
} else {
log.warn("We have started already a requestDataHandshake to peer. nodeAddress=" + nodeAddress + "\n" +
"We start a cleanup timer if the handler has not closed by itself in between 2 minutes.");