forked from cocagne/paxos
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
tcocagne
committed
Apr 3, 2013
1 parent
0b8f0c5
commit dc853c6
Showing
3 changed files
with
84 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package tom.cocagne.paxos; | ||
|
||
public interface HeartbeatCallback { | ||
|
||
public void execute(); | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package tom.cocagne.paxos; | ||
|
||
public interface HeartbeatMessenger extends PracticalMessenger { | ||
|
||
public void sendHeartbeat( ProposalID leaderProposalID); | ||
|
||
public void schedule(int millisecondDelay, HeartbeatCallback callback); | ||
|
||
public void onLeadershipLost(); | ||
|
||
public void onLeadershipChange(String previousLeaderUID, String newLeaderUID); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package tom.cocagne.paxos; | ||
|
||
import java.util.HashSet; | ||
|
||
public class HeartbeatNode extends PracticalNode { | ||
|
||
protected String leaderUID; | ||
protected ProposalID leaderProposalID; | ||
protected long lastHeartbeatTimestamp; | ||
protected long lastPrepareTimestamp; | ||
protected long heartbeatPeriod = 1000; // Milliseconds | ||
protected long livenessWindow = 5000; // Milliseconds | ||
protected boolean acquiringLeadership = false; | ||
protected HashSet<String> acceptNACKs = new HashSet<String>(); | ||
|
||
|
||
public HeartbeatNode(PracticalMessenger messenger, String proposerUID, | ||
int quorumSize, String leaderUID, int heartbeatPeriod, int livenessWindow) { | ||
super(messenger, proposerUID, quorumSize); | ||
|
||
this.leaderUID = leaderUID; | ||
this.heartbeatPeriod = heartbeatPeriod; | ||
this.livenessWindow = livenessWindow; | ||
|
||
leaderProposalID = new ProposalID(1, leaderUID); | ||
lastHeartbeatTimestamp = timestamp(); | ||
lastPrepareTimestamp = timestamp(); | ||
|
||
if (leaderUID != null && proposerUID.equals(leaderUID)) | ||
setLeader(true); | ||
} | ||
|
||
public long timestamp() { | ||
return System.currentTimeMillis(); | ||
} | ||
|
||
@Override | ||
public void prepare(boolean incrementProposalNumber) { | ||
if (incrementProposalNumber) | ||
acceptNACKs.clear(); | ||
super.prepare(incrementProposalNumber); | ||
} | ||
|
||
public boolean leaderIsAlive() { | ||
return timestamp() - lastHeartbeatTimestamp <= livenessWindow; | ||
} | ||
|
||
public boolean observedRecentPrepare() { | ||
return timestamp() - lastPrepareTimestamp <= livenessWindow * 1.5; | ||
} | ||
|
||
public void pollLiveness() { | ||
if (!leaderIsAlive() && !observedRecentPrepare()) { | ||
if (acquiringLeadership) | ||
prepare(); | ||
else | ||
acquireLeadership(); | ||
} | ||
} | ||
|
||
private void acquireLeadership() { | ||
|
||
|
||
} | ||
} |