diff options
author | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-03-20 12:28:50 +0100 |
---|---|---|
committer | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-03-20 12:28:55 +0100 |
commit | 6299172d3b9ba0b98b77583c0c3c5fc90d1b7db5 (patch) | |
tree | 9cb382dd5b2cdcd4e3508a9caf9d0fbb21a17e75 /same/src/main/java/com/orbekk/same/Client.java | |
parent | 9b4a756388aef165b892ae478cf1b0cbf1d7130b (diff) |
Master has to advertise its ID when taking over.
Diffstat (limited to 'same/src/main/java/com/orbekk/same/Client.java')
-rw-r--r-- | same/src/main/java/com/orbekk/same/Client.java | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/same/src/main/java/com/orbekk/same/Client.java b/same/src/main/java/com/orbekk/same/Client.java index 4f42c4e..18fecd2 100644 --- a/same/src/main/java/com/orbekk/same/Client.java +++ b/same/src/main/java/com/orbekk/same/Client.java @@ -26,7 +26,7 @@ public class Client implements DiscoveryListener { State state; private String myUrl; String masterUrl; - private int masterId = -1; + private int masterId = 0; private MasterController masterController = null; private Broadcaster broadcaster; private Future<Integer> currentMasterProposal = null; @@ -125,6 +125,12 @@ public class Client implements DiscoveryListener { @Override public void masterTakeover(String masterUrl, String networkName, int masterId) throws Exception { + if (masterId <= Client.this.masterId) { + logger.warn("{}:{} tried to take over, but current master is " + + "{}:{}. Ignoring", new Object[]{masterUrl, masterId, + state.getDataOf(".masterUrl"), + Client.this.masterId}); + } logger.info("MasterTakeover({}, {}, {})", new Object[]{masterUrl, networkName, masterId}); abortMasterElection(); @@ -133,8 +139,13 @@ public class Client implements DiscoveryListener { } @Override - public void masterDown() throws Exception { - logger.info("Master is down."); + public void masterDown(int masterId) throws Exception { + if (masterId < Client.this.masterId) { + logger.info("Master {} is down, but current master is {}. Ignoring.", + masterId, Client.this.masterId); + return; + } + logger.warn("Master down."); connectionState = ConnectionState.UNSTABLE; tryBecomeMaster(); } @@ -282,7 +293,7 @@ public class Client implements DiscoveryListener { } catch (CancellationException e) { } if (!currentMasterProposal.isCancelled() && result != null) { - masterController.enableMaster(state); + masterController.enableMaster(state, result); } } @@ -293,13 +304,17 @@ public class Client implements DiscoveryListener { } } + private int getMasterIdEstimate() { + return masterId; + } + public void startMasterElection() { List<String> participants = state.getList(".participants"); broadcaster.broadcast(participants, new ServiceOperation() { @Override public void run(String url) { ClientService client = connections.getClient(url); try { - client.masterDown(); + client.masterDown(getMasterIdEstimate()); } catch (Exception e) { logger.info("{}.masterDown() did not respond (ignored): " + url, e); |