summaryrefslogtreecommitdiff
path: root/same/src/main/java/com/orbekk/paxos/MasterProposer.java
diff options
context:
space:
mode:
authorKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-01-24 11:27:57 +0100
committerKjetil Ørbekk <kjetil.orbekk@gmail.com>2012-01-24 11:27:57 +0100
commit5f36d81e47fd142ee7b7c172012917b11411db8d (patch)
tree74c85ea119184dd17dce7ce7f649433f04b6efb6 /same/src/main/java/com/orbekk/paxos/MasterProposer.java
parent263f3a0b4425287ef234d0dbf039e0027c4ad6c1 (diff)
Refactor Paxos: Return proposal values.
Diffstat (limited to 'same/src/main/java/com/orbekk/paxos/MasterProposer.java')
-rw-r--r--same/src/main/java/com/orbekk/paxos/MasterProposer.java37
1 files changed, 24 insertions, 13 deletions
diff --git a/same/src/main/java/com/orbekk/paxos/MasterProposer.java b/same/src/main/java/com/orbekk/paxos/MasterProposer.java
index 912de7e..7bc4350 100644
--- a/same/src/main/java/com/orbekk/paxos/MasterProposer.java
+++ b/same/src/main/java/com/orbekk/paxos/MasterProposer.java
@@ -17,37 +17,48 @@ public class MasterProposer {
this.connections = connections;
}
- private boolean internalPropose(int proposalNumber) {
+ private int internalPropose(int proposalNumber) {
+ int bestPromise = proposalNumber;
int promises = 0;
for (String url : paxosUrls) {
PaxosService paxos = connections.getPaxos(url);
- boolean success = paxos.propose(myUrl, proposalNumber);
- if (success) {
+ int result = paxos.propose(myUrl, proposalNumber);
+ if (result == proposalNumber) {
promises += 1;
}
+ bestPromise = Math.min(bestPromise, result);
+ }
+ if (promises > paxosUrls.size() / 2) {
+ return proposalNumber;
+ } else {
+ return bestPromise;
}
- return promises > paxosUrls.size() / 2;
}
- private boolean internalAcceptRequest(int proposalNumber) {
+ private int internalAcceptRequest(int proposalNumber) {
+ int bestAccepted = proposalNumber;
int accepts = 0;
for (String url : paxosUrls) {
PaxosService paxos = connections.getPaxos(url);
- boolean success = paxos.acceptRequest(myUrl, proposalNumber);
- if (success) {
+ int result = paxos.acceptRequest(myUrl, proposalNumber);
+ if (result == proposalNumber) {
accepts += 1;
}
+ bestAccepted = Math.min(bestAccepted, result);
+ }
+ if (accepts > paxosUrls.size() / 2) {
+ return proposalNumber;
+ } else {
+ return bestAccepted;
}
- return accepts > paxosUrls.size() / 2;
}
public boolean propose(int proposalNumber) {
- boolean success = false;
- success = internalPropose(proposalNumber);
- if (success) {
- success = internalAcceptRequest(proposalNumber);
+ int result = internalPropose(proposalNumber);
+ if (result == proposalNumber) {
+ result = internalAcceptRequest(proposalNumber);
}
- if (success) {
+ if (result == proposalNumber) {
return true;
} else {
return false;