(t *testing.T)
| 84 | } |
| 85 | |
| 86 | func TestCluster_FailureCount(t *testing.T) { |
| 87 | ctx := context.Background() |
| 88 | ns := "test-ns" |
| 89 | clusterName := "test-clusterName" |
| 90 | |
| 91 | s := NewMockClusterStore() |
| 92 | mockNode0 := store.NewClusterMockNode() |
| 93 | mockNode0.SetRole(store.RoleMaster) |
| 94 | mockNode0.Sequence = 104 |
| 95 | mockNode1 := store.NewClusterMockNode() |
| 96 | mockNode1.SetRole(store.RoleSlave) |
| 97 | mockNode1.Sequence = 102 |
| 98 | mockNode2 := store.NewClusterMockNode() |
| 99 | mockNode2.SetRole(store.RoleSlave) |
| 100 | mockNode2.Sequence = 103 |
| 101 | mockNode3 := store.NewClusterMockNode() |
| 102 | mockNode3.SetRole(store.RoleSlave) |
| 103 | mockNode3.Sequence = 101 |
| 104 | |
| 105 | clusterInfo := &store.Cluster{ |
| 106 | Name: clusterName, |
| 107 | Shards: []*store.Shard{{ |
| 108 | Nodes: []store.Node{ |
| 109 | mockNode0, mockNode1, mockNode2, mockNode3, |
| 110 | }, |
| 111 | SlotRanges: []store.SlotRange{{Start: 0, Stop: 16383}}, |
| 112 | MigratingSlot: &store.MigratingSlot{IsMigrating: false}, |
| 113 | TargetShardIndex: -1, |
| 114 | }}, |
| 115 | } |
| 116 | clusterInfo.Version.Store(1) |
| 117 | |
| 118 | require.NoError(t, s.CreateCluster(ctx, ns, clusterInfo)) |
| 119 | |
| 120 | cluster := &ClusterChecker{ |
| 121 | clusterStore: s, |
| 122 | namespace: ns, |
| 123 | clusterName: clusterName, |
| 124 | options: ClusterCheckOptions{ |
| 125 | pingInterval: time.Second, |
| 126 | maxFailureCount: 3, |
| 127 | }, |
| 128 | failureCounts: make(map[string]int64), |
| 129 | syncCh: make(chan struct{}, 1), |
| 130 | } |
| 131 | |
| 132 | require.EqualValues(t, 1, clusterInfo.Version.Load()) |
| 133 | for i := int64(0); i < cluster.options.maxFailureCount-1; i++ { |
| 134 | require.EqualValues(t, i+1, cluster.increaseFailureCount(0, mockNode2)) |
| 135 | } |
| 136 | for i := int64(0); i < cluster.options.maxFailureCount; i++ { |
| 137 | require.EqualValues(t, i+1, cluster.increaseFailureCount(0, mockNode0)) |
| 138 | } |
| 139 | require.False(t, mockNode0.IsMaster()) |
| 140 | // mockNode2 should become the new master since its sequence is the largest |
| 141 | require.True(t, mockNode2.IsMaster()) |
| 142 | require.EqualValues(t, 2, clusterInfo.Version.Load()) |
| 143 |
nothing calls this directly
no test coverage detected