Fix null pointer

This commit is contained in:
Manfred Karrer 2016-02-20 12:17:31 +01:00
parent ae6b95eed8
commit 447849900f
3 changed files with 49 additions and 42 deletions

View File

@ -52,7 +52,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
private final Collection<NodeAddress> seedNodeAddresses;
private final Listener listener;
private final Map<NodeAddress, RequestDataHandler> requestDataHandlerMap = new HashMap<>();
private final Map<NodeAddress, RequestDataHandler> handlerMap = new HashMap<>();
private Optional<NodeAddress> nodeAddressOfPreliminaryDataRequest = Optional.empty();
private Timer retryTimer;
private boolean dataUpdateRequested;
@ -82,7 +82,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
stopRetryTimer();
networkNode.removeMessageListener(this);
peerManager.removeListener(this);
requestDataHandlerMap.values().stream().forEach(RequestDataHandler::cleanup);
handlerMap.values().stream().forEach(RequestDataHandler::cleanup);
}
@ -210,7 +210,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
private void requestData(NodeAddress nodeAddress, List<NodeAddress> remainingNodeAddresses) {
Log.traceCall("nodeAddress=" + nodeAddress + " / remainingNodeAddresses=" + remainingNodeAddresses);
if (!stopped) {
if (!requestDataHandlerMap.containsKey(nodeAddress)) {
if (!handlerMap.containsKey(nodeAddress)) {
RequestDataHandler requestDataHandler = new RequestDataHandler(networkNode, dataStorage, peerManager,
new RequestDataHandler.Listener() {
@Override
@ -220,7 +220,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
stopRetryTimer();
// need to remove before listeners are notified as they cause the update call
requestDataHandlerMap.remove(nodeAddress);
handlerMap.remove(nodeAddress);
// 1. We get a response from requestPreliminaryData
if (!nodeAddressOfPreliminaryDataRequest.isPresent()) {
@ -242,7 +242,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
log.trace("requestDataHandshake of outbound connection failed.\n\tnodeAddress={}\n\t" +
"ErrorMessage={}", nodeAddress, errorMessage);
requestDataHandlerMap.remove(nodeAddress);
handlerMap.remove(nodeAddress);
peerManager.handleConnectionFault(nodeAddress, connection);
if (!stopped) {
@ -273,7 +273,7 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
}
}
});
requestDataHandlerMap.put(nodeAddress, requestDataHandler);
handlerMap.put(nodeAddress, requestDataHandler);
requestDataHandler.requestData(nodeAddress);
} else {
log.warn("We have started already a requestDataHandshake to peer. nodeAddress=" + nodeAddress);
@ -346,16 +346,19 @@ public class RequestDataManager implements MessageListener, ConnectionListener,
}
private void closeRequestDataHandler(Connection connection) {
if (connection.getPeersNodeAddressOptional().isPresent()) {
NodeAddress nodeAddress = connection.getPeersNodeAddressOptional().get();
requestDataHandlerMap.get(nodeAddress).cleanup();
requestDataHandlerMap.remove(nodeAddress);
Optional<NodeAddress> peersNodeAddressOptional = connection.getPeersNodeAddressOptional();
if (peersNodeAddressOptional.isPresent()) {
NodeAddress nodeAddress = peersNodeAddressOptional.get();
if (handlerMap.containsKey(nodeAddress)) {
handlerMap.get(nodeAddress).cleanup();
handlerMap.remove(nodeAddress);
}
}
}
private void closeAllRequestDataHandlers() {
requestDataHandlerMap.values().stream().forEach(RequestDataHandler::cleanup);
requestDataHandlerMap.clear();
handlerMap.values().stream().forEach(RequestDataHandler::cleanup);
handlerMap.clear();
}
}

View File

@ -27,7 +27,7 @@ public class KeepAliveManager implements MessageListener, ConnectionListener, Pe
private final NetworkNode networkNode;
private final PeerManager peerManager;
private final Map<String, KeepAliveHandler> maintenanceHandlerMap = new HashMap<>();
private final Map<String, KeepAliveHandler> handlerMap = new HashMap<>();
private boolean stopped;
private Timer keepAliveTimer;
@ -165,19 +165,19 @@ public class KeepAliveManager implements MessageListener, ConnectionListener, Pe
.filter(connection -> connection instanceof OutboundConnection)
.forEach(connection -> {
final String uid = connection.getUid();
if (!maintenanceHandlerMap.containsKey(uid)) {
if (!handlerMap.containsKey(uid)) {
KeepAliveHandler keepAliveHandler = new KeepAliveHandler(networkNode, peerManager, new KeepAliveHandler.Listener() {
@Override
public void onComplete() {
maintenanceHandlerMap.remove(uid);
handlerMap.remove(uid);
}
@Override
public void onFault(String errorMessage) {
maintenanceHandlerMap.remove(uid);
handlerMap.remove(uid);
}
});
maintenanceHandlerMap.put(uid, keepAliveHandler);
handlerMap.put(uid, keepAliveHandler);
keepAliveHandler.sendPing(connection);
} else {
log.warn("Connection with id {} has not completed and is still in our map. " +
@ -185,7 +185,7 @@ public class KeepAliveManager implements MessageListener, ConnectionListener, Pe
}
});
int size = maintenanceHandlerMap.size();
int size = handlerMap.size();
log.info("maintenanceHandlerMap size=" + size);
if (size > peerManager.getMaxConnections())
log.warn("Seems we didn't clean up out map correctly.\n" +
@ -195,19 +195,6 @@ public class KeepAliveManager implements MessageListener, ConnectionListener, Pe
}
}
private void closeMaintenanceHandler(Connection connection) {
if (connection.getPeersNodeAddressOptional().isPresent()) {
String uid = connection.getUid();
maintenanceHandlerMap.get(uid).cleanup();
maintenanceHandlerMap.remove(uid);
}
}
private void closeAllMaintenanceHandlers() {
maintenanceHandlerMap.values().stream().forEach(KeepAliveHandler::cleanup);
maintenanceHandlerMap.clear();
}
private void stopKeepAliveTimer() {
stopped = true;
if (keepAliveTimer != null) {
@ -215,4 +202,18 @@ public class KeepAliveManager implements MessageListener, ConnectionListener, Pe
keepAliveTimer = null;
}
}
private void closeMaintenanceHandler(Connection connection) {
String uid = connection.getUid();
if (handlerMap.containsKey(uid)) {
handlerMap.get(uid).cleanup();
handlerMap.remove(uid);
}
}
private void closeAllMaintenanceHandlers() {
handlerMap.values().stream().forEach(KeepAliveHandler::cleanup);
handlerMap.clear();
}
}

View File

@ -29,7 +29,7 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener,
private final NetworkNode networkNode;
private final PeerManager peerManager;
private final Set<NodeAddress> seedNodeAddresses;
private final Map<NodeAddress, PeerExchangeHandler> peerExchangeHandlerMap = new HashMap<>();
private final Map<NodeAddress, PeerExchangeHandler> handlerMap = new HashMap<>();
private Timer retryTimer, periodicTimer;
private boolean stopped;
@ -180,14 +180,14 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener,
private void requestReportedPeers(NodeAddress nodeAddress, List<NodeAddress> remainingNodeAddresses) {
Log.traceCall("nodeAddress=" + nodeAddress);
if (!stopped) {
if (!peerExchangeHandlerMap.containsKey(nodeAddress)) {
if (!handlerMap.containsKey(nodeAddress)) {
PeerExchangeHandler peerExchangeHandler = new PeerExchangeHandler(networkNode,
peerManager,
new PeerExchangeHandler.Listener() {
@Override
public void onComplete() {
log.trace("PeerExchangeHandshake of outbound connection complete. nodeAddress={}", nodeAddress);
peerExchangeHandlerMap.remove(nodeAddress);
handlerMap.remove(nodeAddress);
requestWithAvailablePeers();
}
@ -196,7 +196,7 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener,
log.trace("PeerExchangeHandshake of outbound connection failed.\n\terrorMessage={}\n\t" +
"nodeAddress={}", errorMessage, nodeAddress);
peerExchangeHandlerMap.remove(nodeAddress);
handlerMap.remove(nodeAddress);
peerManager.handleConnectionFault(nodeAddress, connection);
if (!stopped) {
if (!remainingNodeAddresses.isEmpty()) {
@ -224,7 +224,7 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener,
}
}
});
peerExchangeHandlerMap.put(nodeAddress, peerExchangeHandler);
handlerMap.put(nodeAddress, peerExchangeHandler);
peerExchangeHandler.sendGetPeersRequest(nodeAddress);
} else {
//TODO check when that happens
@ -339,15 +339,18 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener,
}
private void closePeerExchangeHandler(Connection connection) {
if (connection.getPeersNodeAddressOptional().isPresent()) {
NodeAddress nodeAddress = connection.getPeersNodeAddressOptional().get();
peerExchangeHandlerMap.get(nodeAddress).cleanup();
peerExchangeHandlerMap.remove(nodeAddress);
Optional<NodeAddress> peersNodeAddressOptional = connection.getPeersNodeAddressOptional();
if (peersNodeAddressOptional.isPresent()) {
NodeAddress nodeAddress = peersNodeAddressOptional.get();
if (handlerMap.containsKey(nodeAddress)) {
handlerMap.get(nodeAddress).cleanup();
handlerMap.remove(nodeAddress);
}
}
}
private void closeAllPeerExchangeHandlers() {
peerExchangeHandlerMap.values().stream().forEach(PeerExchangeHandler::cleanup);
peerExchangeHandlerMap.clear();
handlerMap.values().stream().forEach(PeerExchangeHandler::cleanup);
handlerMap.clear();
}
}