services/syncbase/vsync: Wait for ad cancellation to complete
Change-Id: I2a5d65a8be04af1dc9405455afe30ddef9da8176
diff --git a/lib/discovery/advertise_server.go b/lib/discovery/advertise_server.go
index 098955e..75e70b6 100644
--- a/lib/discovery/advertise_server.go
+++ b/lib/discovery/advertise_server.go
@@ -64,6 +64,7 @@
}
curAddrs = newAddrs
case <-ctx.Done():
+ stop()
return
}
}
diff --git a/services/syncbase/vsync/sync.go b/services/syncbase/vsync/sync.go
index cf23497..66eac7b 100644
--- a/services/syncbase/vsync/sync.go
+++ b/services/syncbase/vsync/sync.go
@@ -481,11 +481,14 @@
ctx, stop := context.WithCancel(s.ctx)
// Note that duplicate calls to advertise will return an error.
- _, err := idiscovery.AdvertiseServer(ctx, s.discovery, s.svr, "", &sbService, nil)
+ ch, err := idiscovery.AdvertiseServer(ctx, s.discovery, s.svr, "", &sbService, nil)
if err == nil {
vlog.VI(4).Infof("sync: advertiseSyncbaseInNeighborhood: successful")
- s.cancelAdvSyncbase = stop
+ s.cancelAdvSyncbase = func() {
+ stop()
+ <-ch
+ }
return nil
}
stop()
@@ -556,10 +559,14 @@
// if you match the In list you can see the advertisement, though you
// might not be able to join.
visibility := sg.Spec.Perms[string(access.Read)].In
- _, err = idiscovery.AdvertiseServer(ctx, s.discovery, s.svr, "", &sbService, visibility)
+ ch, err := idiscovery.AdvertiseServer(ctx, s.discovery, s.svr, "", &sbService, visibility)
if err == nil {
vlog.VI(4).Infof("sync: advertiseSyncgroupInNeighborhood: successful")
- s.advSyncgroups[gid] = syncAdvertisementState{cancel: stop, specVersion: sg.SpecVersion, adId: sbService.Id}
+ cancel := func() {
+ stop()
+ <-ch
+ }
+ s.advSyncgroups[gid] = syncAdvertisementState{cancel: cancel, specVersion: sg.SpecVersion, adId: sbService.Id}
return nil
}
stop()