feat: add stream replica groups and leader stepdown
This commit is contained in:
@@ -14,6 +14,8 @@ public sealed class StreamManager
|
||||
private readonly JetStreamMetaGroup? _metaGroup;
|
||||
private readonly ConcurrentDictionary<string, StreamHandle> _streams =
|
||||
new(StringComparer.Ordinal);
|
||||
private readonly ConcurrentDictionary<string, StreamReplicaGroup> _replicaGroups =
|
||||
new(StringComparer.Ordinal);
|
||||
private readonly ConcurrentDictionary<string, List<MirrorCoordinator>> _mirrorsByOrigin =
|
||||
new(StringComparer.Ordinal);
|
||||
private readonly ConcurrentDictionary<string, List<SourceCoordinator>> _sourcesByOrigin =
|
||||
@@ -36,6 +38,12 @@ public sealed class StreamManager
|
||||
normalized.Name,
|
||||
_ => new StreamHandle(normalized, new MemStore()),
|
||||
(_, existing) => existing with { Config = normalized });
|
||||
_replicaGroups.AddOrUpdate(
|
||||
normalized.Name,
|
||||
_ => new StreamReplicaGroup(normalized.Name, normalized.Replicas),
|
||||
(_, existing) => existing.Nodes.Count == Math.Max(normalized.Replicas, 1)
|
||||
? existing
|
||||
: new StreamReplicaGroup(normalized.Name, normalized.Replicas));
|
||||
RebuildReplicationCoordinators();
|
||||
_metaGroup?.ProposeCreateStreamAsync(normalized, default).GetAwaiter().GetResult();
|
||||
|
||||
@@ -77,6 +85,9 @@ public sealed class StreamManager
|
||||
if (stream == null)
|
||||
return null;
|
||||
|
||||
if (_replicaGroups.TryGetValue(stream.Config.Name, out var replicaGroup))
|
||||
_ = replicaGroup.ProposeAsync($"PUB {subject}", default).GetAwaiter().GetResult();
|
||||
|
||||
var seq = stream.Store.AppendAsync(subject, payload, default).GetAwaiter().GetResult();
|
||||
EnforceLimits(stream);
|
||||
var stored = stream.Store.LoadAsync(seq, default).GetAwaiter().GetResult();
|
||||
@@ -90,6 +101,14 @@ public sealed class StreamManager
|
||||
};
|
||||
}
|
||||
|
||||
public Task StepDownStreamLeaderAsync(string stream, CancellationToken ct)
|
||||
{
|
||||
if (_replicaGroups.TryGetValue(stream, out var replicaGroup))
|
||||
return replicaGroup.StepDownAsync(ct);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private static StreamConfig NormalizeConfig(StreamConfig config)
|
||||
{
|
||||
var copy = new StreamConfig
|
||||
|
||||
Reference in New Issue
Block a user