Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2011-09-30 19:50:56 +0000
committerEugene Tarassov2011-09-30 19:50:56 +0000
commit1dd53a1605bb7b6d614b939875ade7ce89e7d068 (patch)
tree138d6e27dc583a6b2d80d75a0b97bc26a4fc4ef3
parent8badbe8ce794e548d14f3a0cb039d91edc72b534 (diff)
downloadorg.eclipse.tcf-1dd53a1605bb7b6d614b939875ade7ce89e7d068.tar.gz
org.eclipse.tcf-1dd53a1605bb7b6d614b939875ade7ce89e7d068.tar.xz
org.eclipse.tcf-1dd53a1605bb7b6d614b939875ade7ce89e7d068.zip
TCF Core: added code in Locator service for faster recover when local master exits.
-rw-r--r--plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/local/LocatorService.java82
1 files changed, 56 insertions, 26 deletions
diff --git a/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/local/LocatorService.java b/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/local/LocatorService.java
index b40363bd1..c77566315 100644
--- a/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/local/LocatorService.java
+++ b/plugins/org.eclipse.tm.tcf.core/src/org/eclipse/tm/internal/tcf/services/local/LocatorService.java
@@ -324,6 +324,20 @@ public class LocatorService implements ILocator {
});
}
+ private static DatagramSocket createSocket(boolean slave) throws SocketException {
+ DatagramSocket socket = null;
+ if (slave) {
+ socket = new DatagramSocket();
+ }
+ else {
+ socket = new DatagramSocket(null);
+ socket.setReuseAddress(false);
+ socket.bind(new InetSocketAddress(DISCOVERY_PORT));
+ }
+ socket.setBroadcast(true);
+ return socket;
+ }
+
public LocatorService() {
locator = this;
local_peer = new LocalPeer();
@@ -338,20 +352,17 @@ public class LocatorService implements ILocator {
out_buf[6] = 0;
out_buf[7] = 0;
try {
- socket = new DatagramSocket(null);
- socket.setReuseAddress(false);
- socket.bind(new InetSocketAddress(DISCOVERY_PORT));
+ socket = createSocket(false);
if (TRACE_DISCOVERY) {
LoggingUtil.trace("Became the master agent (bound to port " + socket.getLocalPort() + ")");
}
}
catch (SocketException x) {
- socket = new DatagramSocket();
+ socket = createSocket(true);
if (TRACE_DISCOVERY) {
LoggingUtil.trace("Became a slave agent (bound to port " + socket.getLocalPort() + ")");
}
}
- socket.setBroadcast(true);
input_thread.setName("TCF Locator Receiver");
timer_thread.setName("TCF Locator Timer");
dns_lookup_thread.setName("TCF Locator DNS Lookup");
@@ -505,14 +516,12 @@ public class LocatorService implements ILocator {
}
/* Try to become a master */
if (socket.getLocalPort() != DISCOVERY_PORT && last_master_packet_time + DATA_RETENTION_PERIOD / 2 <= time) {
- DatagramSocket s0 = socket;
- DatagramSocket s1 = null;
try {
- s1 = new DatagramSocket(null);
- s1.setReuseAddress(false);
- s1.bind(new InetSocketAddress(DISCOVERY_PORT));
- s1.setBroadcast(true);
- socket = s1;
+ DatagramSocket s0 = socket;
+ socket = createSocket(false);
+ if (TRACE_DISCOVERY) {
+ LoggingUtil.trace("Became the master agent (bound to port " + socket.getLocalPort() + ")");
+ }
s0.close();
}
catch (Throwable x) {
@@ -521,25 +530,30 @@ public class LocatorService implements ILocator {
refreshSubNetList();
if (socket.getLocalPort() != DISCOVERY_PORT) {
for (SubNet subnet : subnets) {
- addSlave(subnet.address, socket.getLocalPort(), time, time);
+ addSlave(subnet.address, socket.getLocalPort(), time);
}
}
sendAll(null, 0, null, time);
}
- private Slave addSlave(InetAddress addr, int port, long timestamp, long time_now) {
+ private Slave addSlave(InetAddress addr, int port, long timestamp) {
for (Slave s : slaves) {
if (s.port == port && s.address.equals(addr)) {
if (s.last_packet_time < timestamp) s.last_packet_time = timestamp;
return s;
}
}
- Slave s = new Slave(addr, port);
+ final Slave s = new Slave(addr, port);
s.last_packet_time = timestamp;
slaves.add(s);
- sendPeersRequest(addr, port);
- sendAll(addr, port, s, time_now);
- sendSlaveInfo(s, time_now);
+ Protocol.invokeLater(new Runnable() {
+ public void run() {
+ long time_now = System.currentTimeMillis();
+ sendPeersRequest(s.address, s.port);
+ sendAll(s.address, s.port, s, time_now);
+ sendSlaveInfo(s, time_now);
+ }
+ });
return s;
}
@@ -972,12 +986,12 @@ public class LocatorService implements ILocator {
InetAddress remote_address = p.getAddress();
if (isRemote(remote_address, remote_port)) {
if (buf[4] == CONF_PEERS_REMOVED) {
- handlePeerRemovedPacket(p);
+ handlePeerRemovedPacket(p, remote_port == DISCOVERY_PORT && remote_address.isLoopbackAddress());
}
else {
Slave sl = null;
if (remote_port != DISCOVERY_PORT) {
- sl = addSlave(remote_address, remote_port, time, time);
+ sl = addSlave(remote_address, remote_port, time);
}
switch (buf[4]) {
case CONF_PEER_INFO:
@@ -1002,7 +1016,7 @@ public class LocatorService implements ILocator {
sendSlavesRequest(subnet, remote_address, remote_port);
subnet.last_slaves_req_time = time;
}
- if (subnet.address.equals(remote_address) && remote_port == DISCOVERY_PORT) {
+ if (remote_port == DISCOVERY_PORT && subnet.address.equals(remote_address)) {
last_master_packet_time = time;
}
}
@@ -1050,9 +1064,7 @@ public class LocatorService implements ILocator {
}
private void handleReqInfoPacket(InputPacket p, Slave sl, long time) {
- if (TRACE_DISCOVERY) {
- traceDiscoveryPacket(true, "CONF_REQ_INFO", null, p);
- }
+ if (TRACE_DISCOVERY) traceDiscoveryPacket(true, "CONF_REQ_INFO", null, p);
sendAll(p.getAddress(), p.getPort(), sl, time);
}
@@ -1103,7 +1115,7 @@ public class LocatorService implements ILocator {
new Exception(msg));
time_val = time_now - DATA_RETENTION_PERIOD / 2;
}
- addSlave(addr, port, time_val, time_now);
+ addSlave(addr, port, time_val);
}
}
}
@@ -1119,7 +1131,7 @@ public class LocatorService implements ILocator {
sendSlavesInfo(p.getAddress(), p.getPort(), time);
}
- private void handlePeerRemovedPacket(InputPacket p) {
+ private void handlePeerRemovedPacket(InputPacket p, boolean master_exited) {
try {
Map<String,String> map = parseIDs(p.getData(), p.getLength());
if (TRACE_DISCOVERY) traceDiscoveryPacket(true, "CONF_PEERS_REMOVED", map, p);
@@ -1127,6 +1139,24 @@ public class LocatorService implements ILocator {
IPeer peer = peers.get(id);
if (peer instanceof RemotePeer) ((RemotePeer)peer).dispose();
}
+ if (master_exited) {
+ // Master locator has exited, let's try to get master port.
+ Protocol.invokeLater(500, new Runnable() {
+ public void run() {
+ if (socket.getLocalPort() == DISCOVERY_PORT) return;
+ try {
+ DatagramSocket s0 = socket;
+ socket = createSocket(false);
+ if (TRACE_DISCOVERY) {
+ LoggingUtil.trace("Became the master agent (bound to port " + socket.getLocalPort() + ")");
+ }
+ s0.close();
+ }
+ catch (Throwable x) {
+ }
+ }
+ });
+ }
}
catch (Exception x) {
log("Invalid datagram packet received from " + p.getAddress() + "/" + p.getPort(), x);

Back to the top