feat: make inter-server interest propagation idempotent

This commit is contained in:
Joseph Doherty
2026-02-23 14:38:23 -05:00
parent 6a05308143
commit d83b37fec1
4 changed files with 284 additions and 13 deletions

View File

@@ -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
{