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.client.HConnection;
29 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.AdminService;
30 import org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint;
31 import org.apache.hadoop.hbase.replication.ReplicationPeers;
32 import org.apache.hadoop.hbase.replication.regionserver.ReplicationSinkManager.SinkPeer;
33 import org.apache.hadoop.hbase.testclassification.SmallTests;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.junit.experimental.categories.Category;
37
38 import com.google.common.collect.Lists;
39
40 @Category(SmallTests.class)
41 public class TestReplicationSinkManager {
42
43 private static final String PEER_CLUSTER_ID = "PEER_CLUSTER_ID";
44
45 private ReplicationPeers replicationPeers;
46 private HBaseReplicationEndpoint replicationEndpoint;
47 private ReplicationSinkManager sinkManager;
48
49 @Before
50 public void setUp() {
51 replicationPeers = mock(ReplicationPeers.class);
52 replicationEndpoint = mock(HBaseReplicationEndpoint.class);
53 sinkManager = new ReplicationSinkManager(mock(HConnection.class),
54 PEER_CLUSTER_ID, replicationEndpoint, new Configuration());
55 }
56
57 @Test
58 public void testChooseSinks() {
59 List<ServerName> serverNames = Lists.newArrayList();
60 for (int i = 0; i < 20; i++) {
61 serverNames.add(mock(ServerName.class));
62 }
63
64 when(replicationEndpoint.getRegionServers())
65 .thenReturn(serverNames);
66
67 sinkManager.chooseSinks();
68
69 assertEquals(2, sinkManager.getSinks().size());
70
71 }
72
73 @Test
74 public void testChooseSinks_LessThanRatioAvailable() {
75 List<ServerName> serverNames = Lists.newArrayList(mock(ServerName.class),
76 mock(ServerName.class));
77
78 when(replicationEndpoint.getRegionServers())
79 .thenReturn(serverNames);
80
81 sinkManager.chooseSinks();
82
83 assertEquals(1, sinkManager.getSinks().size());
84 }
85
86 @Test
87 public void testReportBadSink() {
88 ServerName serverNameA = mock(ServerName.class);
89 ServerName serverNameB = mock(ServerName.class);
90 when(replicationEndpoint.getRegionServers())
91 .thenReturn(Lists.newArrayList(serverNameA, serverNameB));
92
93 sinkManager.chooseSinks();
94
95 assertEquals(1, sinkManager.getSinks().size());
96
97 SinkPeer sinkPeer = new SinkPeer(serverNameA, mock(AdminService.BlockingInterface.class));
98
99 sinkManager.reportBadSink(sinkPeer);
100
101
102 assertEquals(1, sinkManager.getSinks().size());
103
104 }
105
106
107
108
109
110 @Test
111 public void testReportBadSink_PastThreshold() {
112 List<ServerName> serverNames = Lists.newArrayList();
113 for (int i = 0; i < 20; i++) {
114 serverNames.add(mock(ServerName.class));
115 }
116 when(replicationEndpoint.getRegionServers())
117 .thenReturn(serverNames);
118
119
120 sinkManager.chooseSinks();
121
122 assertEquals(2, sinkManager.getSinks().size());
123
124 ServerName serverName = sinkManager.getSinks().get(0);
125
126 SinkPeer sinkPeer = new SinkPeer(serverName, mock(AdminService.BlockingInterface.class));
127
128 for (int i = 0; i <= ReplicationSinkManager.DEFAULT_BAD_SINK_THRESHOLD; i++) {
129 sinkManager.reportBadSink(sinkPeer);
130 }
131
132
133
134 assertEquals(1, sinkManager.getSinks().size());
135 }
136
137 @Test
138 public void testReportBadSink_DownToZeroSinks() {
139 List<ServerName> serverNames = Lists.newArrayList();
140 for (int i = 0; i < 20; i++) {
141 serverNames.add(mock(ServerName.class));
142 }
143 when(replicationEndpoint.getRegionServers())
144 .thenReturn(serverNames);
145
146
147 sinkManager.chooseSinks();
148
149
150 List<ServerName> sinkList = sinkManager.getSinks();
151 assertEquals(2, sinkList.size());
152
153 ServerName serverNameA = sinkList.get(0);
154 ServerName serverNameB = sinkList.get(1);
155
156 SinkPeer sinkPeerA = new SinkPeer(serverNameA, mock(AdminService.BlockingInterface.class));
157 SinkPeer sinkPeerB = new SinkPeer(serverNameB, mock(AdminService.BlockingInterface.class));
158
159 for (int i = 0; i <= ReplicationSinkManager.DEFAULT_BAD_SINK_THRESHOLD; i++) {
160 sinkManager.reportBadSink(sinkPeerA);
161 sinkManager.reportBadSink(sinkPeerB);
162 }
163
164
165
166 assertEquals(2, sinkManager.getSinks().size());
167 }
168
169 }