(t *testing.T)
| 592 | } |
| 593 | |
| 594 | func 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++ { |
nothing calls this directly
no test coverage detected