MCPcopy
hub / github.com/grafana/dskit / TestMultipleCAS

Function TestMultipleCAS

kv/memberlist/memberlist_client_test.go:594–679  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

592}
593
594func TestMultipleCAS(t *testing.T) {
595 t.Parallel()
596
597 c := dataCodec{}
598
599 var cfg KVConfig
600 flagext.DefaultValues(&cfg)
601 cfg.TCPTransport = TCPTransportConfig{
602 BindAddrs: getLocalhostAddrs(),
603 }
604 cfg.Codecs = []codec.Codec{c}
605
606 mkv := NewKV(cfg, log.NewNopLogger(), &staticDNSProviderMock{}, prometheus.NewPedanticRegistry())
607 mkv.maxCasRetries = 20
608 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv))
609 defer services.StopAndAwaitTerminated(context.Background(), mkv) //nolint:errcheck
610
611 kv, err := NewClient(mkv, c)
612 require.NoError(t, err)
613
614 wg := &sync.WaitGroup{}
615 start := make(chan struct{})
616
617 const members = 10
618 const namePattern = "Member-%d"
619
620 for i := 0; i < members; i++ {
621 wg.Add(1)
622 go func(name string) {
623 defer wg.Done()
624 <-start
625 up := updateFn(name)
626 err := cas(kv, "test", up) // JOINING state
627 require.NoError(t, err)
628 err = cas(kv, "test", up) // ACTIVE state
629 require.NoError(t, err)
630 }(fmt.Sprintf(namePattern, i))
631 }
632
633 close(start) // start all CAS updates
634 wg.Wait() // wait until all CAS updates are finished
635
636 // Now let's test that all members are in ACTIVE state
637 r := getData(t, kv, "test")
638 require.True(t, r != nil, "nil ring")
639
640 for i := 0; i < members; i++ {
641 n := fmt.Sprintf(namePattern, i)
642
643 if r.Members[n].State != ACTIVE {
644 t.Errorf("Expected member %s to be ACTIVE got %v", n, r.Members[n].State)
645 }
646 }
647
648 // Make all members leave
649 start = make(chan struct{})
650
651 for i := 0; i < members; i++ {

Callers

nothing calls this directly

Calls 13

DefaultValuesFunction · 0.92
StartAndAwaitRunningFunction · 0.92
StopAndAwaitTerminatedFunction · 0.92
getLocalhostAddrsFunction · 0.85
NewKVFunction · 0.85
updateFnFunction · 0.85
casFunction · 0.85
getDataFunction · 0.85
ErrorfMethod · 0.80
NewClientFunction · 0.70
AddMethod · 0.65
DoneMethod · 0.65

Tested by

no test coverage detected