1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.master;
19
20 import org.apache.hadoop.hbase.HBaseTestingUtility;
21 import org.apache.hadoop.hbase.ServerName;
22 import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
23 import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure;
24 import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
25 import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;
26 import org.apache.hadoop.hbase.testclassification.MediumTests;
27 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
28 import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;
29 import org.apache.hadoop.hbase.util.Pair;
30 import org.junit.AfterClass;
31 import org.junit.Assert;
32 import org.junit.BeforeClass;
33 import org.junit.Test;
34 import org.junit.experimental.categories.Category;
35
36 import java.util.List;
37 import java.util.Set;
38
39 import static org.junit.Assert.assertFalse;
40 import static org.junit.Assert.assertTrue;
41
42 @Category({MediumTests.class})
43 public class TestDeadServer {
44 private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
45
46 final ServerName hostname123 = ServerName.valueOf("127.0.0.1", 123, 3L);
47 final ServerName hostname123_2 = ServerName.valueOf("127.0.0.1", 123, 4L);
48 final ServerName hostname1234 = ServerName.valueOf("127.0.0.2", 1234, 4L);
49 final ServerName hostname12345 = ServerName.valueOf("127.0.0.2", 12345, 4L);
50
51 @BeforeClass
52 public static void setupBeforeClass() throws Exception {
53 TEST_UTIL.startMiniCluster();
54 }
55
56 @AfterClass
57 public static void tearDownAfterClass() throws Exception {
58 TEST_UTIL.shutdownMiniCluster();
59 }
60
61 @Test public void testIsDead() {
62 DeadServer ds = new DeadServer();
63 ds.add(hostname123);
64 ds.notifyServer(hostname123);
65 assertTrue(ds.areDeadServersInProgress());
66 ds.finish(hostname123);
67 assertFalse(ds.areDeadServersInProgress());
68
69 ds.add(hostname1234);
70 ds.notifyServer(hostname1234);
71 assertTrue(ds.areDeadServersInProgress());
72 ds.finish(hostname1234);
73 assertFalse(ds.areDeadServersInProgress());
74
75 ds.add(hostname12345);
76 ds.notifyServer(hostname12345);
77 assertTrue(ds.areDeadServersInProgress());
78 ds.finish(hostname12345);
79 assertFalse(ds.areDeadServersInProgress());
80
81
82
83
84 final ServerName deadServer = ServerName.valueOf("127.0.0.1", 9090, 112321L);
85 assertFalse(ds.cleanPreviousInstance(deadServer));
86 ds.add(deadServer);
87 assertTrue(ds.isDeadServer(deadServer));
88 Set<ServerName> deadServerNames = ds.copyServerNames();
89 for (ServerName eachDeadServer : deadServerNames) {
90 Assert.assertNotNull(ds.getTimeOfDeath(eachDeadServer));
91 }
92 final ServerName deadServerHostComingAlive =
93 ServerName.valueOf("127.0.0.1", 9090, 223341L);
94 assertTrue(ds.cleanPreviousInstance(deadServerHostComingAlive));
95 assertFalse(ds.isDeadServer(deadServer));
96 assertFalse(ds.cleanPreviousInstance(deadServerHostComingAlive));
97 }
98
99 @Test(timeout = 15000)
100 public void testCrashProcedureReplay() {
101 HMaster master = TEST_UTIL.getHBaseCluster().getMaster();
102 final ProcedureExecutor<MasterProcedureEnv> pExecutor = master.getMasterProcedureExecutor();
103 ServerCrashProcedure proc = new ServerCrashProcedure(
104 pExecutor.getEnvironment(), hostname123, false, false);
105
106 ProcedureTestingUtility.submitAndWait(pExecutor, proc);
107
108 assertFalse(master.getServerManager().getDeadServers().areDeadServersInProgress());
109 }
110
111 @Test
112 public void testSortExtract(){
113 ManualEnvironmentEdge mee = new ManualEnvironmentEdge();
114 EnvironmentEdgeManager.injectEdge(mee);
115 mee.setValue(1);
116
117 DeadServer d = new DeadServer();
118
119 d.add(hostname123);
120 mee.incValue(1);
121 d.add(hostname1234);
122 mee.incValue(1);
123 d.add(hostname12345);
124
125 List<Pair<ServerName, Long>> copy = d.copyDeadServersSince(2L);
126 Assert.assertEquals(2, copy.size());
127
128 Assert.assertEquals(hostname1234, copy.get(0).getFirst());
129 Assert.assertEquals(new Long(2L), copy.get(0).getSecond());
130
131 Assert.assertEquals(hostname12345, copy.get(1).getFirst());
132 Assert.assertEquals(new Long(3L), copy.get(1).getSecond());
133
134 EnvironmentEdgeManager.reset();
135 }
136
137 @Test
138 public void testClean(){
139 DeadServer d = new DeadServer();
140 d.add(hostname123);
141
142 d.cleanPreviousInstance(hostname12345);
143 Assert.assertFalse(d.isEmpty());
144
145 d.cleanPreviousInstance(hostname1234);
146 Assert.assertFalse(d.isEmpty());
147
148 d.cleanPreviousInstance(hostname123_2);
149 Assert.assertTrue(d.isEmpty());
150 }
151
152 @Test
153 public void testClearDeadServer(){
154 DeadServer d = new DeadServer();
155 d.add(hostname123);
156 d.add(hostname1234);
157 Assert.assertEquals(2, d.size());
158
159 d.finish(hostname123);
160 d.removeDeadServer(hostname123);
161 Assert.assertEquals(1, d.size());
162 d.finish(hostname1234);
163 d.removeDeadServer(hostname1234);
164 Assert.assertTrue(d.isEmpty());
165
166 d.add(hostname1234);
167 Assert.assertFalse(d.removeDeadServer(hostname123_2));
168 Assert.assertEquals(1, d.size());
169 d.finish(hostname1234);
170 Assert.assertTrue(d.removeDeadServer(hostname1234));
171 Assert.assertTrue(d.isEmpty());
172 }
173 }
174