summaryrefslogtreecommitdiff
path: root/same/src/main/java/com/orbekk/same/Client.java
diff options
context:
space:
mode:
authorKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-05-08 13:58:47 +0200
committerKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-05-08 13:58:47 +0200
commit904aacc87e71b60a039f7c8332f0866f472c9aa0 (patch)
treeccfbeb83e8a1048c4da0d192056cdf7f2051f997 /same/src/main/java/com/orbekk/same/Client.java
parentacacdc5a43a7b7c268a425122cd0830e13d96ac9 (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.java25
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 {