From 148d196ef154c420c450f8dcaa5b7d506115421a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Tue, 20 Mar 2012 10:24:59 +0100 Subject: Broadcast masterDown() event. --- same/src/main/java/com/orbekk/same/Client.java | 32 ++++++++++++++++++---- .../main/java/com/orbekk/same/ClientService.java | 3 ++ same/src/test/java/com/orbekk/same/MasterTest.java | 4 +++ 3 files changed, 34 insertions(+), 5 deletions(-) (limited to 'same') diff --git a/same/src/main/java/com/orbekk/same/Client.java b/same/src/main/java/com/orbekk/same/Client.java index 7079016..fc4a6af 100644 --- a/same/src/main/java/com/orbekk/same/Client.java +++ b/same/src/main/java/com/orbekk/same/Client.java @@ -123,6 +123,13 @@ public class Client implements DiscoveryListener { Client.this.masterUrl = masterUrl; connectionState = ConnectionState.STABLE; } + + @Override + public void masterDown() throws Exception { + logger.info("Master is down."); + connectionState = ConnectionState.UNSTABLE; + tryBecomeMaster(); + } }; private WorkQueue discoveryThread = new WorkQueue() { @@ -240,15 +247,30 @@ public class Client implements DiscoveryListener { return paxosUrls; } - public void startMasterElection() { - if (masterController == null) { - logger.warn("Could not become master: No master controller."); - return; - } + private void tryBecomeMaster() { List paxosUrls = getPaxosUrls(); MasterProposer proposer = new MasterProposer(getUrl(), paxosUrls, connections); // TODO: Run election. + if (masterController == null) { + logger.warn("Could not become master: No master controller."); + return; + } masterController.enableMaster(state); } + + public void startMasterElection() { + List participants = state.getList(".participants"); + broadcaster.broadcast(participants, new ServiceOperation() { + @Override public void run(String url) { + ClientService client = connections.getClient(url); + try { + client.masterDown(); + } catch (Exception e) { + logger.info("{}.masterDown() did not respond (ignored): " + + url, e); + } + } + }); + } } diff --git a/same/src/main/java/com/orbekk/same/ClientService.java b/same/src/main/java/com/orbekk/same/ClientService.java index 453dfef..dfca2cc 100644 --- a/same/src/main/java/com/orbekk/same/ClientService.java +++ b/same/src/main/java/com/orbekk/same/ClientService.java @@ -16,4 +16,7 @@ public interface ClientService { */ void masterTakeover(String masterUrl, String networkName, int masterId) throws Exception; + + /** The master is down, so start a new master election. */ + void masterDown() throws Exception; } diff --git a/same/src/test/java/com/orbekk/same/MasterTest.java b/same/src/test/java/com/orbekk/same/MasterTest.java index fb5a45c..927b504 100644 --- a/same/src/test/java/com/orbekk/same/MasterTest.java +++ b/same/src/test/java/com/orbekk/same/MasterTest.java @@ -38,6 +38,10 @@ public class MasterTest { public void masterTakeover(String masterUrl, String networkName, int masterId) throws Exception { } + + @Override + public void masterDown() throws Exception { + } } @Before -- cgit v1.2.3