batch36 task2 implement group-a lifecycle primitives

This commit is contained in:
Joseph Doherty
2026-02-28 22:52:06 -05:00
parent 0860afc886
commit 82c2f4ed1c
8 changed files with 424 additions and 1 deletions

View File

@@ -0,0 +1,160 @@
using System.Threading.Channels;
namespace ZB.MOM.NatsNet.Server;
internal sealed partial class NatsStream
{
internal StreamAssignment? StreamAssignment()
{
_mu.EnterReadLock();
try
{
return _assignment;
}
finally
{
_mu.ExitReadLock();
}
}
internal void SetStreamAssignment(StreamAssignment? assignment)
{
_mu.EnterWriteLock();
try
{
_assignment = assignment;
if (assignment?.Group?.Node != null)
{
_node = assignment.Group.Node;
assignment.Group.Node.UpdateKnownPeers(assignment.Group.Peers);
}
_updateChannel.Writer.TryWrite(true);
}
finally
{
_mu.ExitWriteLock();
}
}
internal ChannelReader<bool>? MonitorQuitC()
{
_mu.EnterWriteLock();
try
{
_monitorQuitChannel ??= Channel.CreateBounded<bool>(1);
return _monitorQuitChannel.Reader;
}
finally
{
_mu.ExitWriteLock();
}
}
internal void SignalMonitorQuit()
{
_mu.EnterWriteLock();
try
{
if (_monitorQuitChannel != null)
{
_monitorQuitChannel.Writer.TryComplete();
_monitorQuitChannel = null;
}
}
finally
{
_mu.ExitWriteLock();
}
}
internal ChannelReader<bool> UpdateC() => _updateChannel.Reader;
internal bool IsLeaderNodeState()
{
_mu.EnterReadLock();
try
{
if (_node is IRaftNode raftNode)
return raftNode.State() == RaftState.Leader;
return true;
}
finally
{
_mu.ExitReadLock();
}
}
internal bool IsLeaderInternal()
{
_mu.EnterReadLock();
try
{
if (_assignment?.Group?.Node is IRaftNode node)
return node.Leader();
return true;
}
finally
{
_mu.ExitReadLock();
}
}
internal void StartClusterSubs()
{
_mu.EnterWriteLock();
try
{
_clusterSubsActive = true;
}
finally
{
_mu.ExitWriteLock();
}
}
internal void StopClusterSubs()
{
_mu.EnterWriteLock();
try
{
_clusterSubsActive = false;
}
finally
{
_mu.ExitWriteLock();
}
}
internal bool ClusterSubsActive()
{
_mu.EnterReadLock();
try
{
return _clusterSubsActive;
}
finally
{
_mu.ExitReadLock();
}
}
internal Account? AccountLocked(bool needLock)
{
if (needLock)
_mu.EnterReadLock();
try
{
return Account;
}
finally
{
if (needLock)
_mu.ExitReadLock();
}
}
}