AlexStocks commented on code in PR #3590:
URL: https://github.com/apache/dubbo-go/pull/3590#discussion_r3710896389


##########
registry/servicediscovery/service_discovery_registry_test.go:
##########
@@ -97,6 +97,275 @@ func TestServiceDiscoveryRegistryRegister(t *testing.T) {
        }
 }
 
+// TestServiceDiscoveryRegistryRegisterPublishesMetadataOnce verifies that
+// app metadata is published exactly once.
+func TestServiceDiscoveryRegistryRegisterPublishesMetadataOnce(t *testing.T) {
+       mockSD, mockMapping := setupEnvironment(t)
+       regID := fmt.Sprintf("mock-reg-%s-%d", t.Name(), time.Now().UnixNano())
+       prevType := metadata.GetMetadataType()
+       opts := 
metadata.NewOptions(metadata.WithMetadataType(constant.RemoteMetadataStorageType))
+       _ = opts.Init()
+       defer func() {
+               restoreOpts := 
metadata.NewOptions(metadata.WithMetadataType(prevType))
+               _ = restoreOpts.Init()
+       }()
+
+       registryURL, err := common.NewURL(testRegistryURL,
+               common.WithParamsValue(constant.RegistryKey, "mock"),
+               common.WithParamsValue(constant.RegistryIdKey, regID))
+       require.NoError(t, err)
+
+       reg, err := newServiceDiscoveryRegistry(registryURL)
+       require.NoError(t, err)
+
+       countingReport := &mockMetadataReportForGC{}
+       sdReg, ok := reg.(*serviceDiscoveryRegistry)
+       require.True(t, ok)
+       sdReg.metadataReport = countingReport
+
+       providerURL1, err := common.NewURL("dubbo://127.0.0.1:20880/",
+               common.WithParamsValue(constant.ApplicationKey, testApp),
+               common.WithInterface(testInterface),
+               common.WithParamsValue(constant.SideKey, constant.SideProvider),
+       )
+       require.NoError(t, err)
+       providerURL2, err := common.NewURL("dubbo://127.0.0.1:20881/",
+               common.WithParamsValue(constant.ApplicationKey, testApp),
+               common.WithInterface(testInterface),
+               common.WithParamsValue(constant.SideKey, constant.SideProvider),
+       )
+       require.NoError(t, err)
+
+       err = reg.Register(providerURL1)
+       require.NoError(t, err)
+       err = reg.Register(providerURL2)
+       require.NoError(t, err)
+       assert.True(t, mockMapping.mapCalled, "ServiceNameMapping.Map should be 
called")
+
+       err = sdReg.RegisterService()
+       require.NoError(t, err)
+
+       assert.True(t, mockSD.registerCalled, "ServiceDiscovery.Register should 
be called")
+       assert.Len(t, sdReg.instances, 2)
+       assert.Equal(t, 1, countingReport.published)

Review Comment:
   [P1] 隔离启动续期后再断言发布次数
   
   这个断言与 `RegisterService()` 启动的 metadata renew goroutine 并发访问 
`countingReport.published`。在当前 Head 上执行 `go test -race 
./registry/servicediscovery -run 
'^TestServiceDiscoveryRegistryRegisterPublishesMetadataOnce$' -count=1` 稳定退出 
1:Race Detector 指向这里的读取和 `PublishAppMetadata()` 中的自增;测试先打印 `PASS`,随后 startup 
renew 又发布一次。因此该用例既有数据竞争,也不能可靠证明 exactly-once。请为本测试显式关闭 
`metadata.renew.on.startup` 并在 cleanup 停止 timer,或用可同步等待的事件分别记录首次发布和续期发布,再补 
package 级 `-race` 门禁。



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