Fix timeout in etcdwatcher tests

This commit is contained in:
Wojciech Tyczynski 2015-12-22 16:56:54 +01:00
parent 1f26fa4049
commit 9f35eebb81

View File

@ -150,8 +150,7 @@ func (w *etcdWatcher) etcdWatch(ctx context.Context, client etcd.KeysAPI, key st
// All calls to etcd are coming from this function - once it is finished // All calls to etcd are coming from this function - once it is finished
// no other call to etcd should be generated by this watcher. // no other call to etcd should be generated by this watcher.
w.wg.Add(1) done := func() {}
defer w.wg.Done()
// We need to be prepared, that Stop() can be called at any time. // We need to be prepared, that Stop() can be called at any time.
// It can potentially also be called, even before this function is called. // It can potentially also be called, even before this function is called.
@ -165,6 +164,8 @@ func (w *etcdWatcher) etcdWatch(ctx context.Context, client etcd.KeysAPI, key st
// Watcher has already been stopped - don't event initiate it here. // Watcher has already been stopped - don't event initiate it here.
return true return true
} }
w.wg.Add(1)
done = w.wg.Done
// Perform initialization of watcher under lock - we want to avoid situation when // Perform initialization of watcher under lock - we want to avoid situation when
// Stop() is called in the meantime (which in tests can cause etcd termination and // Stop() is called in the meantime (which in tests can cause etcd termination and
// strange behavior here). // strange behavior here).
@ -185,6 +186,7 @@ func (w *etcdWatcher) etcdWatch(ctx context.Context, client etcd.KeysAPI, key st
w.ctx, w.cancel = context.WithCancel(ctx) w.ctx, w.cancel = context.WithCancel(ctx)
return false return false
}() }()
defer done()
if returned { if returned {
return return
} }
@ -455,7 +457,6 @@ func (w *etcdWatcher) ResultChan() <-chan watch.Event {
// Stop implements watch.Interface. // Stop implements watch.Interface.
func (w *etcdWatcher) Stop() { func (w *etcdWatcher) Stop() {
w.stopLock.Lock() w.stopLock.Lock()
defer w.stopLock.Unlock()
if w.cancel != nil { if w.cancel != nil {
w.cancel() w.cancel()
w.cancel = nil w.cancel = nil
@ -464,6 +465,8 @@ func (w *etcdWatcher) Stop() {
w.stopped = true w.stopped = true
close(w.userStop) close(w.userStop)
} }
w.stopLock.Unlock()
// Wait until all calls to etcd are finished and no other // Wait until all calls to etcd are finished and no other
// will be issued. // will be issued.
w.wg.Wait() w.wg.Wait()