View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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      // Already dead =       127.0.0.1,9090,112321
82      // Coming back alive =  127.0.0.1,9090,223341
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