diff --git a/src/Proto.Cluster/Gossip/GossipActor.cs b/src/Proto.Cluster/Gossip/GossipActor.cs index 63a42a525c..0d17a29896 100644 --- a/src/Proto.Cluster/Gossip/GossipActor.cs +++ b/src/Proto.Cluster/Gossip/GossipActor.cs @@ -15,7 +15,9 @@ namespace Proto.Cluster.Gossip; public class GossipActor : IActor { +#pragma warning disable CS0618 // Type or member is obsolete private static readonly ILogger Logger = Log.CreateLogger(); +#pragma warning restore CS0618 // Type or member is obsolete private readonly TimeSpan _gossipRequestTimeout; private readonly IGossip _internal; @@ -105,9 +107,26 @@ private Task OnGossipRequest(IContext context, GossipRequest gossipRequest) if (context.Remote().BlockList.BlockedMembers.Contains(gossipRequest.MemberId)) { Logger.LogInformation("Blocked gossip request from {MemberId}", gossipRequest.MemberId); + context.Respond(new GossipResponse() + { + Rejected = true, + }); return Task.CompletedTask; } + if (!context.Cluster().MemberList.ContainsMemberId(gossipRequest.MemberId)) + { + Logger.LogInformation("Ignoring gossip request from {MemberId} as it is not a member", gossipRequest.MemberId); + context.Respond(new GossipResponse() + { + Rejected = true, + }); + return Task.CompletedTask; + } + + + + if (Logger.IsEnabled(LogLevel.Debug)) { Logger.LogDebug("Gossip Request {Sender}", context.Sender!); @@ -186,7 +205,13 @@ private void SendGossipForMember(IContext context, Member targetMember, try { - await task.ConfigureAwait(false); + var res = await task.ConfigureAwait(false); + if (res.Rejected) + { + //we could be smarter here. rejected because of block? then init shutdown + return; + } + memberStateDelta.CommitOffsets(); } catch (TimeoutException) diff --git a/src/Proto.Cluster/GossipContracts.proto b/src/Proto.Cluster/GossipContracts.proto index 92957005e9..432c7a7aae 100644 --- a/src/Proto.Cluster/GossipContracts.proto +++ b/src/Proto.Cluster/GossipContracts.proto @@ -12,6 +12,7 @@ message GossipRequest { //Ack a gossip request message GossipResponse { GossipState state = 1; + bool rejected = 2; } //two GossipState objects can be merged