@Override public void start() throws Exception { deliverManager = new DeliveryManagerImpl(); senderManager = new SenderManager(); if(deliverThread == null) { deliverThread=new DeliveryThread(this); deliverThread.setLocalAddress(localAddress.toString()); } deliverThread.start(deliverManager); statsCollector.setStatsEnabled(statsEnabled()); }
@Override public void stop() { deliverThread.interrupt(); deliverThread=null; }
/** * marks the message as ready to deliver and set the final sequence number (to be ordered) * * @param messageID the message ID * @param finalSequenceNumber the final sequence number */ void markReadyToDeliver(MessageID messageID, long finalSequenceNumber) { markReadyToDeliverV2(messageID, finalSequenceNumber); }
private void handleFinalSequenceNumber(ToaHeader header) { long startTime = statsCollector.now(); long duration = -1; try { MessageID messageID = header.getMessageID(); if (log.isTraceEnabled()) { log.trace("Received the final sequence number message with %s", header); } deliverManager.markReadyToDeliver(messageID, header.getSequencerNumber()); duration = statsCollector.now() - startTime; } catch (Exception e) { logException("Exception caught while processing the final sequence number for " + header.getMessageID(), e); } finally { statsCollector.addFinalSequenceNumberDuration(duration); } }
public static ToaHeader newProposeMessageHeader(MessageID messageID, long sequencerNumber) { assertMessageIDNotNull(messageID); return new ToaHeader(messageID, PROPOSE_MESSAGE).setSequencerNumber(sequencerNumber); }
public static ToaHeader newDataMessageHeader(MessageID messageID, long viewId) { assertMessageIDNotNull(messageID); return new ToaHeader(messageID, DATA_MESSAGE).setViewId(viewId); }
/** * delivers a message that has only as destination member this node * * @param msg the message */ void deliverSingleDestinationMessage(Message msg, MessageID messageID) { synchronized (deliverySet) { long sequenceNumber = sequenceNumberManager.get(); MessageInfo messageInfo = new MessageInfo(messageID, msg, sequenceNumber); messageInfo.updateAndMarkReadyToDeliver(sequenceNumber); deliverySet.add(messageInfo); notifyIfNeeded(); } }
long addLocalMessageToDeliver(MessageID messageID, Message message, ToaHeader header) { MessageInfo messageInfo; long sequenceNumber; synchronized (deliverySet) { sequenceNumber = sequenceNumberManager.getAndIncrement(); messageInfo = new MessageInfo(messageID, message, sequenceNumber); deliverySet.add(messageInfo); } header.setSequencerNumber(sequenceNumber); messageCache.put(messageID, messageInfo); return sequenceNumber; }
/** * Add a new message sent * @param messageID the message ID * @param destinations the destination set * @param initialSequenceNumber the initial sequence number * @param deliverToMyself true if *this* member is in destination sent, false otherwise */ public void addNewMessageToSend(MessageID messageID, Collection<Address> destinations, long initialSequenceNumber, boolean deliverToMyself) { MessageInfo messageInfo = new MessageInfo(destinations, initialSequenceNumber, deliverToMyself); if (deliverToMyself) { messageInfo.setProposeReceived(messageID.getAddress()); } sentMessages.put(messageID, messageInfo); }
@Override public void run() { while (running) { try { List<Message> messages = deliveryManager.getNextMessagesToDeliver(); for (Message msg : messages) { try { deliveryProtocol.deliver(msg); } catch(Throwable t) { log.warn("Exception caught while delivering message " + msg, t); } } } catch (InterruptedException e) { //interrupted } } }
/** * @return the current view id or {@code -1} if no view is installed yet. */ public long getViewId() { synchronized (deliverySet) { return internalGetViewId(); } }
private synchronized long getAndMarkFinalSent() { if (checkAllProposesReceived() && !finalMessageSent) { finalMessageSent = true; return highestSequenceNumberReceived; } return NOT_READY; }
@Override public String toString() { return "ToaHeader{" + "type=" + type2String(type) + ", message_id=" + messageID + ", sequence_number=" + sequencerNumber + ", view_id=" + viewId + '}'; }
void updateSequenceNumber(long sequenceNumber) { synchronized (deliverySet) { sequenceNumberManager.update(sequenceNumber); } }
public void start(DeliveryManager deliveryManager) { this.deliveryManager = deliveryManager; start(); }
@Override public int hashCode() { return messageID.hashCode(); }
public static ToaHeader createSingleDestinationHeader(MessageID messageID) { return new ToaHeader(messageID, SINGLE_DESTINATION_MESSAGE); }
public void setLocalAddress(String localAddress) { setName("TOA-Delivery-Thread-" + localAddress); }
@ManagedAttribute(description = "The average duration (in milliseconds) in processing the last propose message " + "received. This last propose message will originate the sending of the final message") public double getAvgLastProposeMessageReceivedDuration() { return statsCollector.getAvgLastProposeMessageReceivedDuration(); }
public static ToaHeader newFinalMessageHeader(MessageID messageID, long sequenceNumber) { assertMessageIDNotNull(messageID); return new ToaHeader(messageID, FINAL_MESSAGE).setSequencerNumber(sequenceNumber); }