feat: make inter-server interest propagation idempotent
This commit is contained in:
@@ -113,25 +113,35 @@ public sealed class SubList : IDisposable
|
||||
try
|
||||
{
|
||||
var key = $"{sub.RouteId}|{sub.Account}|{sub.Subject}|{sub.Queue}";
|
||||
var changed = false;
|
||||
if (sub.IsRemoval)
|
||||
{
|
||||
_remoteSubs.Remove(key);
|
||||
InterestChanged?.Invoke(new InterestChange(
|
||||
InterestChangeKind.RemoteRemoved,
|
||||
sub.Subject,
|
||||
sub.Queue,
|
||||
sub.Account));
|
||||
changed = _remoteSubs.Remove(key);
|
||||
if (changed)
|
||||
{
|
||||
InterestChanged?.Invoke(new InterestChange(
|
||||
InterestChangeKind.RemoteRemoved,
|
||||
sub.Subject,
|
||||
sub.Queue,
|
||||
sub.Account));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_remoteSubs[key] = sub;
|
||||
InterestChanged?.Invoke(new InterestChange(
|
||||
InterestChangeKind.RemoteAdded,
|
||||
sub.Subject,
|
||||
sub.Queue,
|
||||
sub.Account));
|
||||
if (!_remoteSubs.TryGetValue(key, out var existing) || existing != sub)
|
||||
{
|
||||
_remoteSubs[key] = sub;
|
||||
changed = true;
|
||||
InterestChanged?.Invoke(new InterestChange(
|
||||
InterestChangeKind.RemoteAdded,
|
||||
sub.Subject,
|
||||
sub.Queue,
|
||||
sub.Account));
|
||||
}
|
||||
}
|
||||
Interlocked.Increment(ref _generation);
|
||||
|
||||
if (changed)
|
||||
Interlocked.Increment(ref _generation);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user