AsperforMias commented on code in PR #3625:
URL: https://github.com/apache/dubbo-go/pull/3625#discussion_r3746597017


##########
registry/servicediscovery/service_instances_changed_listener_impl.go:
##########
@@ -343,3 +409,94 @@ func GetMetadataInfo(app string, instance 
registry.ServiceInstance, revision str
        metaCache.Set(cacheKey, metadataInfo)
        return metadataInfo, nil
 }
+
+var (
+       // metadataRetryInitialDelay is the first backoff delay before retrying 
a failed
+       // metadata fetch. Package-level so tests can shrink it.
+       metadataRetryInitialDelay = time.Second
+       // metadataRetryMaxDelay caps the backoff. The retry count itself is
+       // intentionally unlimited: retries only target instances the registry 
still
+       // reports as alive, and a capped count would re-introduce the permanent
+       // empty-directory failure this mechanism fixes.
+       metadataRetryMaxDelay = 30 * time.Second
+       // metadataFetchFailureLogInterval throttles repeated fetch-failure 
warnings
+       // for the same revision key.
+       metadataFetchFailureLogInterval = 5 * time.Minute
+)
+
+// metadataInfoFetcher resolves MetadataInfo for a revision; a package-level
+// indirection so tests can inject transient failures.
+var metadataInfoFetcher = GetMetadataInfo
+
+// stopMetadataRetry cancels any pending metadata retry. It is called when the
+// owning registry is destroyed and drops this listener without RemoveListener,
+// so the retry timer cannot leak.
+func (lstn *ServiceInstancesChangedListenerImpl) stopMetadataRetry() {
+       lstn.mutex.Lock()
+       defer lstn.mutex.Unlock()
+       if lstn.retryTimer != nil {
+               lstn.retryTimer.Stop()
+               lstn.retryTimer = nil
+       }
+}
+
+// scheduleMetadataRetry arms the shared retry timer while unresolved revisions
+// remain. Retries replay the latest instance snapshot, so revisions whose
+// instances disappeared from the registry are dropped naturally on the next 
run.
+func (lstn *ServiceInstancesChangedListenerImpl) scheduleMetadataRetry() {
+       lstn.mutex.Lock()
+       defer lstn.mutex.Unlock()
+       if len(lstn.unresolvedRevisions) == 0 {
+               if lstn.retryTimer != nil {
+                       lstn.retryTimer.Stop()
+                       lstn.retryTimer = nil
+               }
+               lstn.retryAttempts = 0
+               return
+       }
+       if lstn.retryTimer != nil {
+               // One shared timer per listener: repeated events must not 
multiply retries.
+               return
+       }

Review Comment:
   增加listener生命周期状态(closed)和互斥锁保护



-- 
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