Was doing a callback while holding a lock, which was causing deadlock
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
index d9b4725..c16ead6 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -41,6 +41,7 @@
import com.google.common.collect.SetMultimap;
//TODO have L2 and also L3 mode, where it takes into account interface addresses
+//TODO REST API to inspect ARP table
public class ProxyArpManager implements IProxyArpService, IOFMessageListener {
private static Logger log = LoggerFactory.getLogger(ProxyArpManager.class);
@@ -306,14 +307,21 @@
Set<ArpRequest> requests = arpRequests.get(addr);
//Synchronize on the Multimap while using an iterator for one of the sets
+ List<ArpRequest> requestsToSend = new ArrayList<ArpRequest>(requests.size());
synchronized (arpRequests) {
Iterator<ArpRequest> it = requests.iterator();
while (it.hasNext()) {
ArpRequest request = it.next();
it.remove();
- request.dispatchReply(addr, arp.getSenderHardwareAddress());
+ //request.dispatchReply(addr, arp.getSenderHardwareAddress());
+ requestsToSend.add(request);
}
}
+
+ //Don't hold an ARP lock while dispatching requests
+ for (ArpRequest request : requestsToSend) {
+ request.dispatchReply(addr, arp.getSenderHardwareAddress());
+ }
}
private synchronized byte[] lookupArpTable(byte[] ipAddress){