package lsr.leader; import java.util.logging.Logger; import lsr.common.Configuration; import lsr.common.ProcessDescriptor; import lsr.common.SingleThreadDispatcher; import lsr.leader.latency.LatencyDetector; import lsr.leader.latency.LatencyDetectorListener; import lsr.leader.latency.SimpleLatencyDetector; import lsr.paxos.network.UdpNetwork; /** * Simple demo for a leader election oracle * * @author Donz� Benjamin * @author Nuno Santos (LSR) */ public class LeaderOracleDemo implements LeaderOracleListener, LatencyDetectorListener { public LatencyLeaderOracle llo; public LatencyDetector latencyDetector; public double[] localRTT; public Object lock = new Object(); public LeaderOracleDemo(Configuration config, int localId) throws Exception { // Start by reading the list of nodes from a file. By default: "nodes.conf" SingleThreadDispatcher executor = new SingleThreadDispatcher("leader"); ProcessDescriptor p = new ProcessDescriptor(config, localId); // Use UDP to send the leader election messages UdpNetwork network = new UdpNetwork(p); latencyDetector = new SimpleLatencyDetector(p, network, executor); latencyDetector.registerLatencyDetectorListener(this); // Create the leader oracle llo = new LatencyLeaderOracle(p, network, executor, latencyDetector); llo.registerLeaderOracleListener(this); // Start the oracle llo.start(); } /** * Called whenever a new leader is elected. This implementation simply * prints a notification on the screen, but a real protocol would perform * some action in reaction to the change on leader. */ @Override public void onNewLeaderElected(int leader) { } public static void main(String[] args) throws Exception { if (args.length < 1) { usage(); System.exit(1); } int localID = Integer.parseInt(args[0]); Configuration p = args.length == 2 ? new Configuration(args[1]) : new Configuration(); LeaderOracleDemo lod = new LeaderOracleDemo(p, localID); } private static void usage() { System.out.println( "Invalid arguments. Usage:\n" + " java lsr.leader.LeaderOracleDemo <replicaID> [conf directory]"); } @Override public void onNewRTTVector(double[] rttVector) { synchronized (lock) { localRTT = rttVector; } } private final static Logger _logger = Logger.getLogger( LeaderOracleSimulation.class.getCanonicalName()); }