/** * 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; }
void updateSequenceNumber(long sequenceNumber) { synchronized (deliverySet) { sequenceNumberManager.update(sequenceNumber); } }
long addRemoteMessageToDeliver(MessageID messageID, Message message, long remoteSequenceNumber, long viewId) { MessageInfo messageInfo; long sequenceNumber; synchronized (deliverySet) { long currentViewId = internalGetViewId(); if (currentViewId != -1 //we have a view, check the view id && viewId <= currentViewId //message from the current or previous view, check the members && !currentView.containsMember(message.getSrc())) { //node no longer in view. discard it return -1; } sequenceNumber = sequenceNumberManager.updateAndGet(remoteSequenceNumber); messageInfo = new MessageInfo(messageID, message, sequenceNumber); deliverySet.add(messageInfo); } messageCache.put(messageID, messageInfo); return sequenceNumber; }
long addRemoteMessageToDeliver(MessageID messageID, Message message, long remoteSequenceNumber, long viewId) { MessageInfo messageInfo; long sequenceNumber; synchronized (deliverySet) { long currentViewId = internalGetViewId(); if (currentViewId != -1 //we have a view, check the view id && viewId <= currentViewId //message from the current or previous view, check the members && !currentView.containsMember(message.getSrc())) { //node no longer in view. discard it return -1; } sequenceNumber = sequenceNumberManager.updateAndGet(remoteSequenceNumber); messageInfo = new MessageInfo(messageID, message, sequenceNumber); deliverySet.add(messageInfo); } messageCache.put(messageID, messageInfo); return sequenceNumber; }
private void markReadyToDeliverV2(MessageID messageID, long finalSequenceNumber) { MessageInfo messageInfo = messageCache.remove(messageID); if (messageInfo == null) { throw new IllegalStateException("Message ID not found in to deliver list. this can't happen. " + "Message ID is " + messageID); } boolean needsUpdatePosition = messageInfo.isUpdatePositionNeeded(finalSequenceNumber); synchronized (deliverySet) { sequenceNumberManager.update(finalSequenceNumber); if (needsUpdatePosition) { deliverySet.remove(messageInfo); messageInfo.updateAndMarkReadyToDeliver(finalSequenceNumber); deliverySet.add(messageInfo); } else { messageInfo.updateAndMarkReadyToDeliver(finalSequenceNumber); } 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; }
/** * 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(); } }
void updateSequenceNumber(long sequenceNumber) { synchronized (deliverySet) { sequenceNumberManager.update(sequenceNumber); } }
private void markReadyToDeliverV2(MessageID messageID, long finalSequenceNumber) { MessageInfo messageInfo = messageCache.remove(messageID); if (messageInfo == null) { throw new IllegalStateException("Message ID not found in to deliver list. this can't happen. " + "Message ID is " + messageID); } boolean needsUpdatePosition = messageInfo.isUpdatePositionNeeded(finalSequenceNumber); synchronized (deliverySet) { sequenceNumberManager.update(finalSequenceNumber); if (needsUpdatePosition) { deliverySet.remove(messageInfo); messageInfo.updateAndMarkReadyToDeliver(finalSequenceNumber); deliverySet.add(messageInfo); } else { messageInfo.updateAndMarkReadyToDeliver(finalSequenceNumber); } notifyIfNeeded(); } }