feat(batch34): implement and verify group B cluster consumer features
This commit is contained in:
@@ -1,7 +1,22 @@
|
||||
using System.Text;
|
||||
|
||||
namespace ZB.MOM.NatsNet.Server;
|
||||
|
||||
public sealed partial class NatsServer
|
||||
{
|
||||
internal void SendDomainLeaderElectAdvisory()
|
||||
{
|
||||
var (_, cluster) = GetJetStreamCluster();
|
||||
var meta = cluster?.Meta;
|
||||
if (meta == null)
|
||||
return;
|
||||
|
||||
Noticef(
|
||||
"JetStream domain leader elected advisory for leader {0} in cluster {1}",
|
||||
meta.GroupLeader(),
|
||||
CachedClusterName());
|
||||
}
|
||||
|
||||
internal void SendConsumerLostQuorumAdvisory(NatsConsumer? consumer)
|
||||
{
|
||||
if (consumer == null || !consumer.ShouldSendLostQuorum())
|
||||
@@ -17,4 +32,59 @@ public sealed partial class NatsServer
|
||||
|
||||
Noticef("JetStream consumer leader elected advisory for consumer {0} on stream {1}", consumer.Name, consumer.Stream);
|
||||
}
|
||||
|
||||
internal void JsClusteredStreamRequest(
|
||||
ClientInfo clientInfo,
|
||||
Account account,
|
||||
string subject,
|
||||
string reply,
|
||||
byte[] rawMessage,
|
||||
StreamConfigRequest configRequest)
|
||||
{
|
||||
var (js, cluster) = GetJetStreamCluster();
|
||||
if (js == null || cluster == null)
|
||||
return;
|
||||
|
||||
var cfg = configRequest.Config;
|
||||
var engine = new JetStreamEngine(js);
|
||||
var limitsError = engine.JsClusteredStreamLimitsCheck(account, cfg);
|
||||
if (limitsError != null)
|
||||
{
|
||||
var response = new ApiResponse
|
||||
{
|
||||
Type = JsApiSubjects.JsApiStreamCreateResponseType,
|
||||
Error = limitsError,
|
||||
};
|
||||
SendAPIErrResponse(clientInfo, account, subject, reply, string.Empty, JsonResponse(response));
|
||||
return;
|
||||
}
|
||||
|
||||
var (group, createError) = engine.CreateGroupForStream(clientInfo, cfg);
|
||||
if (group == null || createError != null)
|
||||
{
|
||||
var response = new ApiResponse
|
||||
{
|
||||
Type = JsApiSubjects.JsApiStreamCreateResponseType,
|
||||
Error = JsApiErrors.NewJSClusterNoPeersError(createError ?? new SelectPeerError { Misc = true }),
|
||||
};
|
||||
SendAPIErrResponse(clientInfo, account, subject, reply, string.Empty, JsonResponse(response));
|
||||
return;
|
||||
}
|
||||
|
||||
var assignment = new StreamAssignment
|
||||
{
|
||||
Group = group,
|
||||
Config = cfg,
|
||||
Subject = subject,
|
||||
Reply = reply,
|
||||
Client = clientInfo,
|
||||
Created = DateTime.UtcNow,
|
||||
};
|
||||
|
||||
if (cluster.Meta != null)
|
||||
{
|
||||
cluster.Meta.Propose(Encoding.UTF8.GetBytes($"create-stream:{account.Name}:{cfg.Name}"));
|
||||
cluster.TrackInflightStreamProposal(account.Name, assignment, deleted: false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user