1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.replication.regionserver;
19
20 import static org.junit.Assert.assertEquals;
21 import static org.mockito.Mockito.mock;
22 import static org.mockito.Mockito.when;
23
24 import java.util.List;
25
26 import org.apache.hadoop.conf.Configuration;
27 import org.apache.hadoop.hbase.ServerName;
28 import org.apache.hadoop.hbase.testclassification.SmallTests;
29 import org.apache.hadoop.hbase.client.HConnection;
30 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.AdminService;
31 import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;
32 import org.apache.hadoop.hbase.replication.regionserver.ReplicationSinkManager.SinkPeer;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.junit.experimental.categories.Category;
36
37 import com.google.common.collect.Lists;
38
39 @Category(SmallTests.class)
40 public class TestReplicationSinkManager {
41
42 private static final String PEER_CLUSTER_ID = "PEER_CLUSTER_ID";
43
44 private HBaseReplicationEndpoint replicationEndpoint;
45 private ReplicationSinkManager sinkManager;
46
47 @Before
48 public void setUp() {
49 replicationEndpoint = mock(HBaseReplicationEndpoint.class);
50 sinkManager = new ReplicationSinkManager(mock(HConnection.class),
51 PEER_CLUSTER_ID, replicationEndpoint, new Configuration());
52 }
53
54 @Test
55 public void testChooseSinks() {
56 List<ServerName> serverNames = Lists.newArrayList();
57 int totalServers = 20;
58 for (int i = 0; i < totalServers; i++) {
59 serverNames.add(mock(ServerName.class));
60 }
61
62 when(replicationEndpoint.getRegionServers())
63 .thenReturn(serverNames);
64
65 sinkManager.chooseSinks();
66
67 int expected = (int) (totalServers * ReplicationSinkManager.DEFAULT_REPLICATION_SOURCE_RATIO);
68 assertEquals(expected, sinkManager.getNumSinks());
69
70 }
71
72 @Test
73 public void testChooseSinks_LessThanRatioAvailable() {
74 List<ServerName> serverNames = Lists.newArrayList(mock(ServerName.class),
75 mock(ServerName.class));
76
77 when(replicationEndpoint.getRegionServers())
78 .thenReturn(serverNames);
79
80 sinkManager.chooseSinks();
81
82 assertEquals(1, sinkManager.getNumSinks());
83 }
84
85 @Test
86 public void testReportBadSink() {
87 ServerName serverNameA = mock(ServerName.class);
88 ServerName serverNameB = mock(ServerName.class);
89 when(replicationEndpoint.getRegionServers())
90 .thenReturn(Lists.newArrayList(serverNameA, serverNameB));
91
92 sinkManager.chooseSinks();
93
94 assertEquals(1, sinkManager.getNumSinks());
95
96 SinkPeer sinkPeer = new SinkPeer(serverNameA, mock(AdminService.BlockingInterface.class));
97
98 sinkManager.reportBadSink(sinkPeer);
99
100
101 assertEquals(1, sinkManager.getNumSinks());
102
103 }
104
105
106
107
108
109 @Test
110 public void testReportBadSink_PastThreshold() {
111 List<ServerName> serverNames = Lists.newArrayList();
112 int totalServers = 30;
113 for (int i = 0; i < totalServers; i++) {
114 serverNames.add(mock(ServerName.class));
115 }
116 when(replicationEndpoint.getRegionServers())
117 .thenReturn(serverNames);
118
119
120 sinkManager.chooseSinks();
121
122 int expected = (int) (totalServers * ReplicationSinkManager.DEFAULT_REPLICATION_SOURCE_RATIO);
123 assertEquals(expected, sinkManager.getNumSinks());
124
125 ServerName serverName = sinkManager.getSinksForTesting().get(0);
126
127 SinkPeer sinkPeer = new SinkPeer(serverName, mock(AdminService.BlockingInterface.class));
128
129 sinkManager.reportSinkSuccess(sinkPeer);
130 for (int i = 0; i <= ReplicationSinkManager.DEFAULT_BAD_SINK_THRESHOLD; i++) {
131 sinkManager.reportBadSink(sinkPeer);
132 }
133
134
135
136 assertEquals(expected - 1, sinkManager.getNumSinks());
137
138
139
140
141 serverName = sinkManager.getSinksForTesting().get(0);
142
143 sinkPeer = new SinkPeer(serverName, mock(AdminService.BlockingInterface.class));
144 for (int i = 0; i <= ReplicationSinkManager.DEFAULT_BAD_SINK_THRESHOLD-1; i++) {
145 sinkManager.reportBadSink(sinkPeer);
146 }
147 sinkManager.reportSinkSuccess(sinkPeer);
148 sinkManager.reportBadSink(sinkPeer);
149
150
151 assertEquals(expected - 1, sinkManager.getNumSinks());
152
153 for (int i = 0; i <= ReplicationSinkManager.DEFAULT_BAD_SINK_THRESHOLD-2; i++) {
154 sinkManager.reportBadSink(sinkPeer);
155 }
156
157 assertEquals(expected - 1, sinkManager.getNumSinks());
158
159 sinkManager.reportBadSink(sinkPeer);
160
161 assertEquals(expected - 2, sinkManager.getNumSinks());
162 }
163
164 @Test
165 public void testReportBadSink_DownToZeroSinks() {
166 List<ServerName> serverNames = Lists.newArrayList();
167 int totalServers = 4;
168 for (int i = 0; i < totalServers; i++) {
169 serverNames.add(mock(ServerName.class));
170 }
171 when(replicationEndpoint.getRegionServers())
172 .thenReturn(serverNames);
173
174
175 sinkManager.chooseSinks();
176
177 List<ServerName> sinkList = sinkManager.getSinksForTesting();
178 int expected = (int) (totalServers * ReplicationSinkManager.DEFAULT_REPLICATION_SOURCE_RATIO);
179 assertEquals(expected, sinkList.size());
180
181 ServerName serverNameA = sinkList.get(0);
182 ServerName serverNameB = sinkList.get(1);
183
184 SinkPeer sinkPeerA = new SinkPeer(serverNameA, mock(AdminService.BlockingInterface.class));
185 SinkPeer sinkPeerB = new SinkPeer(serverNameB, mock(AdminService.BlockingInterface.class));
186
187 for (int i = 0; i <= ReplicationSinkManager.DEFAULT_BAD_SINK_THRESHOLD; i++) {
188 sinkManager.reportBadSink(sinkPeerA);
189 sinkManager.reportBadSink(sinkPeerB);
190 }
191
192
193
194
195 expected = (int) ((totalServers - 2) * ReplicationSinkManager.DEFAULT_REPLICATION_SOURCE_RATIO);
196 assertEquals(expected, sinkManager.getNumSinks());
197 }
198
199 }