Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions Libraries/Opc.Ua.Client/Subscription/Subscription.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,13 @@ public class Subscription : ISnapshotRestore<SubscriptionState>, IDisposable, IC
{
private const int kMinKeepAliveTimerInterval = 1000;
private const int kKeepAliveTimerMargin = 1000;
private const int kRepublishMessageTimeout = 2500;
private const int kRepublishMessageExpiredTimeout = 10000;

/// <summary>
/// Duration to wait before republishing missed notification
/// </summary>
public const int REPUBLISH_MESSAGE_TIMEOUT = 2500;
Comment thread
AnatolyKochnev marked this conversation as resolved.
Outdated

/// <summary>
/// Create subscription
/// </summary>
Expand Down Expand Up @@ -1619,9 +1623,33 @@ public void SaveMessageInCache(

// fill in any gaps in the queue
LinkedListNode<IncomingMessage>? node = m_incomingMessages.First;
if (node is not null)
{
//gaps between m_lastSequenceNumberProcessed and starting node
LinkedListNode<IncomingMessage> currentNode = node;
for (uint i = node.Value.SequenceNumber; i > (m_lastSequenceNumberProcessed + 1); i--)
{
var placeholder = new IncomingMessage
{
SequenceNumber = i - 1,
Timestamp = now,
TickCount = tickCount
};
currentNode = m_incomingMessages.AddBefore(currentNode, placeholder);

m_logger.LogInformation(
"Session {SessionId}, subscription {SubscriptionName} ({SubscriptionId}): " +
"added placeholder for missing incoming message with sequence number {MissingSequenceNumber}",
Session?.SessionId,
DisplayName,
Id,
placeholder.SequenceNumber);
}
}

while (node != null)
{
//gaps between neighbouring nodes
entry = node.Value;
LinkedListNode<IncomingMessage>? next = node.Next;

Expand Down Expand Up @@ -1969,8 +1997,8 @@ private void ProcessTransferredSequenceNumbers(UInt32Collection availableSequenc
// only republish consecutive sequence numbers
// triggers the republish mechanism immediately,
// if event is in the past
DateTime now = DateTime.UtcNow.AddMilliseconds(-kRepublishMessageTimeout * 2);
int tickCount = HiResClock.TickCount - (kRepublishMessageTimeout * 2);
DateTime now = DateTime.UtcNow.AddMilliseconds(-REPUBLISH_MESSAGE_TIMEOUT * 2);
int tickCount = HiResClock.TickCount - (REPUBLISH_MESSAGE_TIMEOUT * 2);
uint lastSequenceNumberToRepublish = m_lastSequenceNumberProcessed - 1;
int availableNumbers = availableSequenceNumbers.Count;
int republishMessages = 0;
Expand Down Expand Up @@ -2505,7 +2533,7 @@ private async Task OnMessageReceivedAsync(CancellationToken ct)
// tolerate if a single request was received out of order
if (ii.Next.Next != null &&
(HiResClock.TickCount -
ii.Value.TickCount) > kRepublishMessageTimeout)
ii.Value.TickCount) > REPUBLISH_MESSAGE_TIMEOUT)
{
ii.Value.Republished = true;
publishStateChangedMask |= PublishStateChangedMask.Republish;
Expand Down
Loading