public InstanceSkipper(RingManager ring, CoordinatorRole coordinator) { this.coordinator = coordinator; this.ring = ring; if (ring.getConfiguration().containsKey(ConfigKey.multi_ring_start_time)) { this.boot_time = Long.parseLong(ring.getConfiguration().get(ConfigKey.multi_ring_start_time)); } else { this.boot_time = 0; } logger.info("InstanceSkipper use boot time: " + boot_time); }
@Override public void run() { if (coordinator.multi_ring_lambda > 0) { while (ring.isNodeCoordinator()) { try { long time = System.currentTimeMillis(); int latency_compensation = coordinator.latency_compensation; long valueSent = coordinator.value_count.get(); float executionTime = ((float) (time - boot_time - latency_compensation)) / 1000.0f; long expectedValues = (long) ((coordinator.multi_ring_lambda) * executionTime); long skip = expectedValues - valueSent; if (skip > 0) { if (logger.isTraceEnabled()) { logger.trace(String.format("InstanceSkipper sent skip %d values", skip)); } Promise p = null; try { p = coordinator.getPromiseQueue().take(); // wait for a promise } catch (InterruptedException e) { } // send Phase2 with skip value if (p != null) { Value v = new Value(Value.getSkipID(), Long.toString(skip).getBytes()); coordinator.value_count.addAndGet(skip); Message m = new Message( p.getInstance(), ring.getNodeID(), PaxosRole.Acceptor, MessageType.Phase2, p.getBallot(), 0, v); if (ring.getNetwork().getLearner() != null) { ring.getNetwork().getLearner().deliver(ring, m); } if (ring.getNetwork().getAcceptor() != null) { ring.getNetwork().getAcceptor().deliver(ring, m); } else { // else should never happen, since there is no coordinator without acceptor! ring.getNetwork().send(m); } } } Thread.sleep(coordinator.multi_ring_delta_t); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } logger.debug("InstanceSkipper stopped."); } }