@@ -446,10 +446,40 @@ func TestRegistryDirectorySubscribeTimeoutSkipsSubscribeStart(t *testing.T) {
446446 assert .Equal (t , int32 (0 ), blockingRegistry .subscribeCalls .Load ())
447447}
448448
449+ func TestRegistryDirectorySubscribeTimeoutLateRegisterRollback (t * testing.T ) {
450+ registryURL , err := common .NewURL (
451+ "registry://127.0.0.1:20000" ,
452+ common .WithParamsValue (constant .RegistryTimeoutKey , "100ms" ),
453+ )
454+ require .NoError (t , err )
455+ subscribeURL , err := common .NewURL ("consumer://127.0.0.1:20000/org.apache.dubbo-go.mockService" )
456+ require .NoError (t , err )
457+
458+ blockingRegistry := & blockingRegistryForSubscribeTest {
459+ url : registryURL ,
460+ registerBlock : make (chan struct {}),
461+ }
462+
463+ dir := & RegistryDirectory {
464+ registry : blockingRegistry ,
465+ }
466+
467+ err = dir .Subscribe (subscribeURL )
468+ require .Error (t , err )
469+ require .Contains (t , err .Error (), "timed out" )
470+ assert .Equal (t , int32 (0 ), blockingRegistry .subscribeCalls .Load ())
471+
472+ close (blockingRegistry .registerBlock )
473+ assert .Eventually (t , func () bool {
474+ return blockingRegistry .unregisterCalls .Load () == 1
475+ }, time .Second , 10 * time .Millisecond )
476+ }
477+
449478type blockingRegistryForSubscribeTest struct {
450- url * common.URL
451- registerBlock chan struct {}
452- subscribeCalls atomic.Int32
479+ url * common.URL
480+ registerBlock chan struct {}
481+ subscribeCalls atomic.Int32
482+ unregisterCalls atomic.Int32
453483}
454484
455485func (r * blockingRegistryForSubscribeTest ) Register (_ * common.URL ) error {
@@ -458,6 +488,7 @@ func (r *blockingRegistryForSubscribeTest) Register(_ *common.URL) error {
458488}
459489
460490func (r * blockingRegistryForSubscribeTest ) UnRegister (_ * common.URL ) error {
491+ r .unregisterCalls .Add (1 )
461492 return nil
462493}
463494
0 commit comments