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