diff --git a/src/Nacos/V2/Naming/Remote/Grpc/Redo/NamingGrpcRedoService.cs b/src/Nacos/V2/Naming/Remote/Grpc/Redo/NamingGrpcRedoService.cs index 580b718..f6d6b25 100644 --- a/src/Nacos/V2/Naming/Remote/Grpc/Redo/NamingGrpcRedoService.cs +++ b/src/Nacos/V2/Naming/Remote/Grpc/Redo/NamingGrpcRedoService.cs @@ -100,6 +100,7 @@ public void InstanceDeregister(string serviceName, string groupName) if (_registeredInstances.TryGetValue(key, out var data)) { data.Unregistering = true; + data.ExpectedRegistered = false; } } @@ -125,7 +126,10 @@ public void RemoveInstanceForRedo(string serviceName, string groupName) { string key = NamingUtils.GetGroupedName(serviceName, groupName); - _registeredInstances.TryRemove(key, out _); + if (_registeredInstances.TryGetValue(key, out var data) && data != null && !data.ExpectedRegistered) + { + _registeredInstances.TryRemove(key, out _); + } } /// @@ -190,6 +194,7 @@ public void SubscriberDeregister(string serviceName, string groupName, string cl if (_subscribes.TryGetValue(key, out var data)) { data.Unregistering = true; + data.ExpectedRegistered = false; } } @@ -203,7 +208,10 @@ public void RemoveSubscriberForRedo(string serviceName, string groupName, string { string key = ServiceInfo.GetKey(NamingUtils.GetGroupedName(serviceName, groupName), cluster); - _subscribes.TryRemove(key, out _); + if (_subscribes.TryGetValue(key, out var data) && data != null && !data.ExpectedRegistered) + { + _subscribes.TryRemove(key, out _); + } } /// diff --git a/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoData{T}.cs b/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoData{T}.cs index ad6d28c..2af6743 100644 --- a/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoData{T}.cs +++ b/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoData{T}.cs @@ -7,12 +7,15 @@ protected RedoData(string serviceName, string groupName) { this.ServiceName = serviceName; this.GroupName = groupName; + this.ExpectedRegistered = true; } public string ServiceName { get; private set; } public string GroupName { get; private set; } + public bool ExpectedRegistered { get; set; } + public T Data { get; set; } public bool Registered { get; set; } diff --git a/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoScheduledTask.cs b/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoScheduledTask.cs index ef7f528..d7a17fd 100644 --- a/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoScheduledTask.cs +++ b/src/Nacos/V2/Naming/Remote/Grpc/Redo/RedoScheduledTask.cs @@ -66,6 +66,11 @@ private async Task RedoForInstance(InstanceRedoData redoData) case RedoType.REGISTER: if (IsClientDisabled()) return; + if (redoData is BatchInstanceRedoData batchInstanceRedoData) + { + await _clientProxy.BatchRegisterServiceAsync(serviceName, groupName, batchInstanceRedoData.Instances).ConfigureAwait(false); + } + await _clientProxy.DoRegisterService(serviceName, groupName, redoData.Data).ConfigureAwait(false); break; case RedoType.UNREGISTER: