diff options
author | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-01-24 11:48:19 +0100 |
---|---|---|
committer | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-01-24 11:48:19 +0100 |
commit | 55beb6df753604996ae61f8a099db40f0906804e (patch) | |
tree | 4f1424195a0b5d47e9b39e76b427b27926cab8dd | |
parent | 5f36d81e47fd142ee7b7c172012917b11411db8d (diff) |
Basic Paxos working.
3 files changed, 27 insertions, 7 deletions
diff --git a/same/src/main/java/com/orbekk/paxos/MasterProposer.java b/same/src/main/java/com/orbekk/paxos/MasterProposer.java index 7bc4350..f216ff5 100644 --- a/same/src/main/java/com/orbekk/paxos/MasterProposer.java +++ b/same/src/main/java/com/orbekk/paxos/MasterProposer.java @@ -1,11 +1,13 @@ package com.orbekk.paxos; +import com.orbekk.same.ConnectionManager; import java.util.ArrayList; import java.util.List; - -import com.orbekk.same.ConnectionManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class MasterProposer { + private Logger logger = LoggerFactory.getLogger(getClass()); private String myUrl; private List<String> paxosUrls = new ArrayList<String>(); private ConnectionManager connections; @@ -64,4 +66,22 @@ public class MasterProposer { return false; } } + + public boolean proposeRetry(int proposalNumber) { + int nextProposal = proposalNumber; + int result = 0; + + while (result != nextProposal) { + result = internalPropose(nextProposal); + if (result == nextProposal) { + result = internalAcceptRequest(nextProposal); + } + logger.info("Proposed value {}, result {}", nextProposal, result); + if (result < 0) { + nextProposal = -result + 1; + } + } + + return true; + } } diff --git a/same/src/test/java/com/orbekk/paxos/MasterProposerTest.java b/same/src/test/java/com/orbekk/paxos/MasterProposerTest.java index dfc0b19..601a357 100644 --- a/same/src/test/java/com/orbekk/paxos/MasterProposerTest.java +++ b/same/src/test/java/com/orbekk/paxos/MasterProposerTest.java @@ -42,8 +42,8 @@ public class MasterProposerTest { @Test public void unsucessfulProposal() { connections.paxosMap.put("p1", p1); - when(p1.propose("client1", 1)).thenReturn(1); - when(p1.acceptRequest("client1", 1)).thenReturn(1); + when(p1.propose("client1", 1)).thenReturn(-1); + when(p1.acceptRequest("client1", 1)).thenReturn(-1); MasterProposer c1 = new MasterProposer( "client1", diff --git a/same/src/test/java/com/orbekk/paxos/PaxosServiceFunctionalTest.java b/same/src/test/java/com/orbekk/paxos/PaxosServiceFunctionalTest.java index 45d6624..4fe3e27 100644 --- a/same/src/test/java/com/orbekk/paxos/PaxosServiceFunctionalTest.java +++ b/same/src/test/java/com/orbekk/paxos/PaxosServiceFunctionalTest.java @@ -25,7 +25,7 @@ public class PaxosServiceFunctionalTest { public void setUp() throws Exception { server = TestServer.create(handler); myUrl = "http://localhost:" + server.port; - setupPaxos(5); + setupPaxos(10); } public void setupPaxos(int instances) { @@ -56,7 +56,7 @@ public class PaxosServiceFunctionalTest { MasterProposer client = new MasterProposer("http:/client" + j, paxosUrls, connections); - if (client.propose(1)) { + if (client.proposeRetry(1)) { incrementSuccessfulProposals(); } } @@ -72,7 +72,7 @@ public class PaxosServiceFunctionalTest { // Ignore. } } - assertEquals(1, successfulProposals); + assertEquals(5, successfulProposals); } public synchronized void incrementSuccessfulProposals() { |