diff options
author | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-05-08 13:58:47 +0200 |
---|---|---|
committer | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-05-08 13:58:47 +0200 |
commit | 904aacc87e71b60a039f7c8332f0866f472c9aa0 (patch) | |
tree | ccfbeb83e8a1048c4da0d192056cdf7f2051f997 /same/src/main/java/com/orbekk/same/Client.java | |
parent | acacdc5a43a7b7c268a425122cd0830e13d96ac9 (diff) |
Master takeover protocol.
Implement the takeover protocol that guarantees correct after master
takeover.
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, 19 insertions, 6 deletions
diff --git a/same/src/main/java/com/orbekk/same/Client.java b/same/src/main/java/com/orbekk/same/Client.java index c0bf708..cafa9d8 100644 --- a/same/src/main/java/com/orbekk/same/Client.java +++ b/same/src/main/java/com/orbekk/same/Client.java @@ -174,17 +174,15 @@ public class Client { request.getMasterId() <= masterInfo.getMasterId()) { logger.warn("{} tried to take over, but current master is " + "{}. Ignoring", masterInfo); + done.run(MasterTakeoverResponse.newBuilder().setSuccess(false).build()); return; } abortMasterElection(); - long highestRevision = 0; - if (masterInfo != null && request.getNetworkName().equals(masterInfo.getNetworkName())) { - highestRevision = revision.get(); - } masterInfo = request; - setConnectionState(ConnectionState.STABLE); + setConnectionState(ConnectionState.UNSTABLE); done.run(MasterTakeoverResponse.newBuilder() - .setHighestKnownRevision(highestRevision) + .setSuccess(true) + .setClientState(getClientState()) .build()); } @@ -210,6 +208,21 @@ public class Client { ServicesPbConversion.componentsToPb(state.getComponents())); done.run(response.build()); } + + @Override + public void masterTakeoverFinished(RpcController controller, + MasterState request, RpcCallback<Empty> done) { + if (masterInfo != null && request.getMasterId() < masterInfo.getMasterId()) { + logger.warn("MasterTakeoverFinished({}) failed. Current master: {}", request, masterInfo); + } + if (revision.get() < masterInfo.getRevision()) { + logger.error("My revision ({}) < master revision ({}). Possible inconsistency.", + revision.get(), masterInfo.getRevision()); + } + masterInfo = request; + setConnectionState(ConnectionState.STABLE); + done.run(Empty.getDefaultInstance()); + } }; private class MasterStarter implements Runnable { |