diff options
author | Pavlo Strokov <pstrokov@gitlab.com> | 2020-11-19 20:30:44 +0300 |
---|---|---|
committer | Pavlo Strokov <pstrokov@gitlab.com> | 2020-11-24 23:15:17 +0300 |
commit | 8dd83e26c8244438dd402ff273dc14119f414628 (patch) | |
tree | 07a2cb64d52e457ff323df0f0a90d337090ca6de | |
parent | ee004d1d8723e362e9ece4b839ad46938f058936 (diff) |
Refactor potential flaky test.
Closes: https://gitlab.com/gitlab-org/gitaly/-/issues/1466
-rw-r--r-- | internal/praefect/datastore/storage_provider_test.go | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/internal/praefect/datastore/storage_provider_test.go b/internal/praefect/datastore/storage_provider_test.go index 28e93f783..0548d5e7a 100644 --- a/internal/praefect/datastore/storage_provider_test.go +++ b/internal/praefect/datastore/storage_provider_test.go @@ -3,10 +3,10 @@ package datastore import ( "context" "io" + "runtime" "strings" "sync" "testing" - "time" "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus" "github.com/prometheus/client_golang/prometheus/testutil" @@ -433,33 +433,28 @@ func TestCachingStorageProvider_GetSyncedNodes(t *testing.T) { func TestSyncer_await(t *testing.T) { sc := syncer{inflight: map[string]chan struct{}{}} - const dur = 50 * time.Millisecond + returned := make(chan string, 2) - var wg sync.WaitGroup - begin := make(chan struct{}) + releaseA := sc.await("a") + go func() { + sc.await("a")() + returned <- "waiter" + }() - awaitKey := func(key string) { - wg.Add(1) - go func() { - defer wg.Done() + // different key should proceed immediately + sc.await("b")() - <-begin + // Yield to the 'waiter' goroutine. It should be blocked and + // not send to the channel before releaseA is called. + runtime.Gosched() - defer sc.await(key)() - time.Sleep(dur) - }() - } + returned <- "locker" + releaseA() - keys := []string{"a", "a", "b", "c", "d"} - for _, key := range keys { - awaitKey(key) + var returnOrder []string + for i := 0; i < cap(returned); i++ { + returnOrder = append(returnOrder, <-returned) } - start := time.Now() - close(begin) - wg.Wait() - duration := time.Since(start).Milliseconds() - - require.GreaterOrEqual(t, duration, 2*dur.Milliseconds(), "we use same key twice, so it should take at least 2 durations") - require.Less(t, duration, int64(len(keys))*dur.Milliseconds(), "it should take less time as sequential processing") + require.Equal(t, []string{"locker", "waiter"}, returnOrder) } |