| 581 | const testOnCloseHookID = "test-close-counter" |
| 582 | |
| 583 | func TestRingShardsCleanup(t *testing.T) { |
| 584 | const ( |
| 585 | ringShard1Name = "ringShardOne" |
| 586 | ringShard2Name = "ringShardTwo" |
| 587 | |
| 588 | ringShard1Addr = "shard1.test" |
| 589 | ringShard2Addr = "shard2.test" |
| 590 | ) |
| 591 | |
| 592 | t.Run("closes unused shards", func(t *testing.T) { |
| 593 | closeCounter := newTestCounter(t) |
| 594 | |
| 595 | ring := NewRing(&RingOptions{ |
| 596 | Addrs: map[string]string{ |
| 597 | ringShard1Name: ringShard1Addr, |
| 598 | ringShard2Name: ringShard2Addr, |
| 599 | }, |
| 600 | NewClient: func(opt *Options) *Client { |
| 601 | c := NewClient(opt) |
| 602 | c.baseClient.onClose.register(testOnCloseHookID, func() error { |
| 603 | closeCounter.increment(opt.Addr) |
| 604 | return nil |
| 605 | }) |
| 606 | return c |
| 607 | }, |
| 608 | }) |
| 609 | closeCounter.expect(map[string]int{}) |
| 610 | |
| 611 | // no change due to the same addresses |
| 612 | ring.SetAddrs(map[string]string{ |
| 613 | ringShard1Name: ringShard1Addr, |
| 614 | ringShard2Name: ringShard2Addr, |
| 615 | }) |
| 616 | closeCounter.expect(map[string]int{}) |
| 617 | |
| 618 | ring.SetAddrs(map[string]string{ |
| 619 | ringShard1Name: ringShard1Addr, |
| 620 | }) |
| 621 | closeCounter.expect(map[string]int{ringShard2Addr: 1}) |
| 622 | |
| 623 | ring.SetAddrs(map[string]string{ |
| 624 | ringShard2Name: ringShard2Addr, |
| 625 | }) |
| 626 | closeCounter.expect(map[string]int{ringShard1Addr: 1, ringShard2Addr: 1}) |
| 627 | |
| 628 | ring.Close() |
| 629 | closeCounter.expect(map[string]int{ringShard1Addr: 1, ringShard2Addr: 2}) |
| 630 | }) |
| 631 | |
| 632 | t.Run("closes created shards if ring was closed", func(t *testing.T) { |
| 633 | createCounter := newTestCounter(t) |
| 634 | closeCounter := newTestCounter(t) |
| 635 | |
| 636 | var ( |
| 637 | ring *Ring |
| 638 | shouldClose int32 |
| 639 | ) |
| 640 | |