001/** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.master; 019 020import static org.junit.Assert.assertFalse; 021import static org.junit.Assert.assertTrue; 022 023import java.util.List; 024import java.util.Set; 025import org.apache.hadoop.hbase.HBaseClassTestRule; 026import org.apache.hadoop.hbase.HBaseTestingUtility; 027import org.apache.hadoop.hbase.ServerName; 028import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; 029import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure; 030import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; 031import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility; 032import org.apache.hadoop.hbase.testclassification.MasterTests; 033import org.apache.hadoop.hbase.testclassification.MediumTests; 034import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; 035import org.apache.hadoop.hbase.util.ManualEnvironmentEdge; 036import org.apache.hadoop.hbase.util.Pair; 037import org.junit.AfterClass; 038import org.junit.Assert; 039import org.junit.BeforeClass; 040import org.junit.ClassRule; 041import org.junit.Test; 042import org.junit.experimental.categories.Category; 043 044@Category({MasterTests.class, MediumTests.class}) 045public class TestDeadServer { 046 047 @ClassRule 048 public static final HBaseClassTestRule CLASS_RULE = 049 HBaseClassTestRule.forClass(TestDeadServer.class); 050 051 private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); 052 053 final ServerName hostname123 = ServerName.valueOf("127.0.0.1", 123, 3L); 054 final ServerName hostname123_2 = ServerName.valueOf("127.0.0.1", 123, 4L); 055 final ServerName hostname1234 = ServerName.valueOf("127.0.0.2", 1234, 4L); 056 final ServerName hostname12345 = ServerName.valueOf("127.0.0.2", 12345, 4L); 057 058 @BeforeClass 059 public static void setupBeforeClass() throws Exception { 060 TEST_UTIL.startMiniCluster(); 061 } 062 063 @AfterClass 064 public static void tearDownAfterClass() throws Exception { 065 TEST_UTIL.shutdownMiniCluster(); 066 } 067 068 @Test public void testIsDead() { 069 DeadServer ds = new DeadServer(); 070 ds.putIfAbsent(hostname123); 071 ds.processing(hostname123); 072 assertTrue(ds.areDeadServersInProgress()); 073 ds.finish(hostname123); 074 assertFalse(ds.areDeadServersInProgress()); 075 076 ds.putIfAbsent(hostname1234); 077 ds.processing(hostname1234); 078 assertTrue(ds.areDeadServersInProgress()); 079 ds.finish(hostname1234); 080 assertFalse(ds.areDeadServersInProgress()); 081 082 ds.putIfAbsent(hostname12345); 083 ds.processing(hostname12345); 084 assertTrue(ds.areDeadServersInProgress()); 085 ds.finish(hostname12345); 086 assertFalse(ds.areDeadServersInProgress()); 087 088 // Already dead = 127.0.0.1,9090,112321 089 // Coming back alive = 127.0.0.1,9090,223341 090 091 final ServerName deadServer = ServerName.valueOf("127.0.0.1", 9090, 112321L); 092 assertFalse(ds.cleanPreviousInstance(deadServer)); 093 ds.putIfAbsent(deadServer); 094 assertTrue(ds.isDeadServer(deadServer)); 095 Set<ServerName> deadServerNames = ds.copyServerNames(); 096 for (ServerName eachDeadServer : deadServerNames) { 097 Assert.assertNotNull(ds.getTimeOfDeath(eachDeadServer)); 098 } 099 final ServerName deadServerHostComingAlive = 100 ServerName.valueOf("127.0.0.1", 9090, 223341L); 101 assertTrue(ds.cleanPreviousInstance(deadServerHostComingAlive)); 102 assertFalse(ds.isDeadServer(deadServer)); 103 assertFalse(ds.cleanPreviousInstance(deadServerHostComingAlive)); 104 } 105 106 @Test 107 public void testCrashProcedureReplay() { 108 HMaster master = TEST_UTIL.getHBaseCluster().getMaster(); 109 final ProcedureExecutor<MasterProcedureEnv> pExecutor = master.getMasterProcedureExecutor(); 110 ServerCrashProcedure proc = new ServerCrashProcedure( 111 pExecutor.getEnvironment(), hostname123, false, false); 112 113 ProcedureTestingUtility.submitAndWait(pExecutor, proc); 114 115 assertFalse(master.getServerManager().getDeadServers().areDeadServersInProgress()); 116 } 117 118 @Test 119 public void testSortExtract(){ 120 ManualEnvironmentEdge mee = new ManualEnvironmentEdge(); 121 EnvironmentEdgeManager.injectEdge(mee); 122 mee.setValue(1); 123 124 DeadServer d = new DeadServer(); 125 126 d.putIfAbsent(hostname123); 127 mee.incValue(1); 128 d.putIfAbsent(hostname1234); 129 mee.incValue(1); 130 d.putIfAbsent(hostname12345); 131 132 List<Pair<ServerName, Long>> copy = d.copyDeadServersSince(2L); 133 Assert.assertEquals(2, copy.size()); 134 135 Assert.assertEquals(hostname1234, copy.get(0).getFirst()); 136 Assert.assertEquals(new Long(2L), copy.get(0).getSecond()); 137 138 Assert.assertEquals(hostname12345, copy.get(1).getFirst()); 139 Assert.assertEquals(new Long(3L), copy.get(1).getSecond()); 140 141 EnvironmentEdgeManager.reset(); 142 } 143 144 @Test 145 public void testClean(){ 146 DeadServer d = new DeadServer(); 147 d.putIfAbsent(hostname123); 148 149 d.cleanPreviousInstance(hostname12345); 150 Assert.assertFalse(d.isEmpty()); 151 152 d.cleanPreviousInstance(hostname1234); 153 Assert.assertFalse(d.isEmpty()); 154 155 d.cleanPreviousInstance(hostname123_2); 156 Assert.assertTrue(d.isEmpty()); 157 } 158 159 @Test 160 public void testClearDeadServer(){ 161 DeadServer d = new DeadServer(); 162 d.putIfAbsent(hostname123); 163 d.putIfAbsent(hostname1234); 164 Assert.assertEquals(2, d.size()); 165 166 d.finish(hostname123); 167 d.removeDeadServer(hostname123); 168 Assert.assertEquals(1, d.size()); 169 d.finish(hostname1234); 170 d.removeDeadServer(hostname1234); 171 Assert.assertTrue(d.isEmpty()); 172 173 d.putIfAbsent(hostname1234); 174 Assert.assertFalse(d.removeDeadServer(hostname123_2)); 175 Assert.assertEquals(1, d.size()); 176 d.finish(hostname1234); 177 Assert.assertTrue(d.removeDeadServer(hostname1234)); 178 Assert.assertTrue(d.isEmpty()); 179 } 180} 181