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