XnLemon commented on code in PR #3395:
URL: https://github.com/apache/dubbo-go/pull/3395#discussion_r3401541242


##########
registry/servicediscovery/service_instances_changed_listener_impl.go:
##########
@@ -258,20 +263,61 @@ func GetMetadataInfo(app string, instance 
registry.ServiceInstance, revision str
        var metadataInfo *info.MetadataInfo
        var err error
        if instance.GetMetadata() == nil {
+               // No metadata map at all; treat as default (local/RPC) storage 
type.
                metadataStorageType = constant.DefaultMetadataStorageType
        } else {
                metadataStorageType = 
instance.GetMetadata()[constant.MetadataStorageTypePropertyName]
+               if metadataStorageType == "" {
+                       // MetadataStorageTypePropertyName absent (e.g. old 
Java provider); default to local storage type.
+                       logger.Warnf("[Metadata] MetadataStorageType not set 
for instance %s, defaulting to local", instance.GetID())
+                       metadataStorageType = 
constant.DefaultMetadataStorageType
+               }
        }
+
        if metadataStorageType == constant.RemoteMetadataStorageType {
-               metadataInfo, err = 
metadata.GetMetadataFromMetadataReport(revision, instance, registryId)
-               if err != nil {
-                       return nil, err
+               var reportErr error
+               metadataInfo, reportErr = 
metadata.GetMetadataFromMetadataReport(revision, instance, registryId)
+               if reportErr == nil && metadataInfo != nil {
+                       metaCache.Set(cacheKey, metadataInfo)
+                       return metadataInfo, nil
                }
-       } else {
+               if reportErr != nil {
+                       logger.Errorf("[Metadata-Fallback] report failed, 
fallback to RPC app=%s registry=%s revision=%s err=%v",
+                               app, registryId, revision, reportErr)
+               } else {
+                       logger.Warnf("[Metadata-Fallback] report returned nil 
metadata, fallback to RPC app=%s registry=%s revision=%s",
+                               app, registryId, revision)
+               }
+
                metadataInfo, err = metadata.GetMetadataFromRpc(revision, 
instance)
                if err != nil {
-                       return nil, err
+                       if reportErr != nil {
+                               // Wrap rpcErr so callers can use errors.Is/As 
on the primary failure;
+                               // reportErr is annotated as context since it 
triggered the fallback.
+                               return nil, perrors.Wrapf(err,
+                                       "[Metadata-Fallback] both paths failed, 
reportErr: %v", reportErr)
+                       }
+                       // reportErr was nil — the report returned nil metadata 
and RPC also failed.
+                       return nil, perrors.Wrapf(err,
+                               "[Metadata-Fallback] RPC fallback failed after 
report returned nil metadata")

Review Comment:
   这是不是把L273看成新写的了 以为下面全是死代码(
   这段是处理 RPC fallback 也失败的情况
   1. report 报错 + RPC 也报错 → "both paths failed, reportErr: ..."
   把两个错误都记录下来,调用方能看到完整失败链
   2. report 返回 nil + RPC 报错 → "RPC fallback failed after report returned nil 
metadata"
   说明 report 虽然没报错但返回空,RPC 兜底也失败了
   感觉如果不需要这么细粒度降低complexity的话可以直接
   
   `perrors.Wrapf(err,"RPC fallback failed app=%s registry=%s revision=%s, 
reportErr: %v"` 
   看reportErr



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to