This is an automated email from the ASF dual-hosted git repository.
alexstocks pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/3.0 by this push:
new c2bb0b3a5 Fix: service discovery registry notify before return (#2168)
c2bb0b3a5 is described below
commit c2bb0b3a51d5c74d3c46eb130913422b1a746884
Author: Leo Shen <[email protected]>
AuthorDate: Fri Jan 6 23:00:53 2023 +0800
Fix: service discovery registry notify before return (#2168)
* Fix: service discovery registry notify before return
* format import
* modify notify url
* add judge about the existence of instance's metadata revision
---
.../service_instances_changed_listener_impl.go | 62 +++++++++++-----------
.../servicediscovery/service_discovery_registry.go | 28 +++++++++-
2 files changed, 58 insertions(+), 32 deletions(-)
diff --git a/registry/event/service_instances_changed_listener_impl.go
b/registry/event/service_instances_changed_listener_impl.go
index a65913aac..b8de36e77 100644
--- a/registry/event/service_instances_changed_listener_impl.go
+++ b/registry/event/service_instances_changed_listener_impl.go
@@ -86,7 +86,7 @@ func (lstn *ServiceInstancesChangedListenerImpl) OnEvent(e
observer.Event) error
revisionToInstances[revision] = append(subInstances,
instance)
metadataInfo := lstn.revisionToMetadata[revision]
if metadataInfo == nil {
- metadataInfo, err =
lstn.getMetadataInfo(instance, revision)
+ metadataInfo, err = GetMetadataInfo(instance,
revision)
if err != nil {
return err
}
@@ -143,36 +143,6 @@ func (lstn *ServiceInstancesChangedListenerImpl) OnEvent(e
observer.Event) error
return nil
}
-// getMetadataInfo get metadata info when MetadataStorageTypePropertyName is
null
-func (lstn *ServiceInstancesChangedListenerImpl) getMetadataInfo(instance
registry.ServiceInstance, revision string) (*common.MetadataInfo, error) {
- var metadataStorageType string
- var metadataInfo *common.MetadataInfo
- if instance.GetMetadata() == nil {
- metadataStorageType = constant.DefaultMetadataStorageType
- } else {
- metadataStorageType =
instance.GetMetadata()[constant.MetadataStorageTypePropertyName]
- }
- if metadataStorageType == constant.RemoteMetadataStorageType {
- remoteMetadataServiceImpl, err :=
extension.GetRemoteMetadataService()
- if err != nil {
- return nil, err
- }
- metadataInfo, err =
remoteMetadataServiceImpl.GetMetadata(instance)
- if err != nil {
- return nil, err
- }
- } else {
- var err error
- proxyFactory :=
extension.GetMetadataServiceProxyFactory(constant.DefaultKey)
- metadataService := proxyFactory.GetProxy(instance)
- metadataInfo, err = metadataService.GetMetadataInfo(revision)
- if err != nil {
- return nil, err
- }
- }
- return metadataInfo, nil
-}
-
// AddListenerAndNotify add notify listener and notify to listen service event
func (lstn *ServiceInstancesChangedListenerImpl)
AddListenerAndNotify(serviceKey string, notify registry.NotifyListener) {
lstn.listeners[serviceKey] = notify
@@ -212,3 +182,33 @@ func (lstn *ServiceInstancesChangedListenerImpl)
GetPriority() int {
func (lstn *ServiceInstancesChangedListenerImpl) GetEventType() reflect.Type {
return reflect.TypeOf(®istry.ServiceInstancesChangedEvent{})
}
+
+// GetMetadataInfo get metadata info when MetadataStorageTypePropertyName is
null
+func GetMetadataInfo(instance registry.ServiceInstance, revision string)
(*common.MetadataInfo, error) {
+ var metadataStorageType string
+ var metadataInfo *common.MetadataInfo
+ if instance.GetMetadata() == nil {
+ metadataStorageType = constant.DefaultMetadataStorageType
+ } else {
+ metadataStorageType =
instance.GetMetadata()[constant.MetadataStorageTypePropertyName]
+ }
+ if metadataStorageType == constant.RemoteMetadataStorageType {
+ remoteMetadataServiceImpl, err :=
extension.GetRemoteMetadataService()
+ if err != nil {
+ return nil, err
+ }
+ metadataInfo, err =
remoteMetadataServiceImpl.GetMetadata(instance)
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ var err error
+ proxyFactory :=
extension.GetMetadataServiceProxyFactory(constant.DefaultKey)
+ metadataService := proxyFactory.GetProxy(instance)
+ metadataInfo, err = metadataService.GetMetadataInfo(revision)
+ if err != nil {
+ return nil, err
+ }
+ }
+ return metadataInfo, nil
+}
diff --git a/registry/servicediscovery/service_discovery_registry.go
b/registry/servicediscovery/service_discovery_registry.go
index a967118bb..4bb4cf84b 100644
--- a/registry/servicediscovery/service_discovery_registry.go
+++ b/registry/servicediscovery/service_discovery_registry.go
@@ -42,6 +42,7 @@ import (
"dubbo.apache.org/dubbo-go/v3/registry"
"dubbo.apache.org/dubbo-go/v3/registry/event"
"dubbo.apache.org/dubbo-go/v3/registry/servicediscovery/synthesizer"
+ "dubbo.apache.org/dubbo-go/v3/remoting"
)
func init() {
@@ -230,7 +231,32 @@ func (s *serviceDiscoveryRegistry) Subscribe(url
*common.URL, notify registry.No
}
// LoadSubscribeInstances load subscribe instance
-func (s *serviceDiscoveryRegistry) LoadSubscribeInstances(_ *common.URL, _
registry.NotifyListener) error {
+func (s *serviceDiscoveryRegistry) LoadSubscribeInstances(url *common.URL,
notify registry.NotifyListener) error {
+ appName := url.GetParam(constant.ApplicationKey, url.Username)
+ instances := s.serviceDiscovery.GetInstances(appName)
+ for _, instance := range instances {
+ if instance.GetMetadata() == nil {
+ logger.Warnf("Instance metadata is nil: %s",
instance.GetHost())
+ continue
+ }
+ revision, ok :=
instance.GetMetadata()[constant.ExportedServicesRevisionPropertyName]
+ if !ok {
+ logger.Warnf("Instance metadata revision is nil: %s",
instance.GetHost())
+ continue
+ }
+ if "0" == revision {
+ logger.Infof("Find instance without valid service
metadata: %s", instance.GetHost())
+ continue
+ }
+ metadataInfo, err := event.GetMetadataInfo(instance, revision)
+ if err != nil {
+ return err
+ }
+ instance.SetServiceMetadata(metadataInfo)
+ for _, url := range instance.ToURLs() {
+ notify.Notify(®istry.ServiceEvent{Action:
remoting.EventTypeAdd, Service: url})
+ }
+ }
return nil
}