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 static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertNotEquals;
22 import static org.junit.Assert.assertTrue;
23 import java.io.IOException;
24 import org.apache.hadoop.conf.Configuration;
25 import org.apache.hadoop.hbase.CoordinatedStateManager;
26 import org.apache.hadoop.hbase.HBaseTestingUtility;
27 import org.apache.hadoop.hbase.HRegionInfo;
28 import org.apache.hadoop.hbase.testclassification.MediumTests;
29 import org.apache.hadoop.hbase.MiniHBaseCluster;
30 import org.apache.hadoop.hbase.MiniHBaseCluster.MiniHBaseClusterRegionServer;
31 import org.apache.hadoop.hbase.ServerName;
32 import org.apache.hadoop.hbase.Waiter;
33 import org.apache.hadoop.hbase.util.Bytes;
34 import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;
35 import org.apache.hadoop.hbase.zookeeper.ZKUtil;
36 import org.apache.zookeeper.KeeperException;
37 import org.junit.AfterClass;
38 import org.junit.BeforeClass;
39 import org.junit.Test;
40 import org.junit.experimental.categories.Category;
41
42
43
44
45 @Category(MediumTests.class)
46 public class TestMetaShutdownHandler {
47 private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
48 final static Configuration conf = TEST_UTIL.getConfiguration();
49
50 @BeforeClass
51 public static void setUpBeforeClass() throws Exception {
52 TEST_UTIL.startMiniCluster(1, 3, null, null, MyRegionServer.class);
53 }
54
55 @AfterClass
56 public static void tearDownAfterClass() throws Exception {
57 TEST_UTIL.shutdownMiniCluster();
58 }
59
60
61
62
63
64
65
66
67
68
69
70 @Test (timeout=180000)
71 public void testExpireMetaRegionServer() throws Exception {
72 MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
73
74 HMaster master = cluster.getMaster();
75 RegionStates regionStates = master.getAssignmentManager().getRegionStates();
76 ServerName metaServerName = regionStates.getRegionServerOfRegion(
77 HRegionInfo.FIRST_META_REGIONINFO);
78 if (master.getServerName().equals(metaServerName) || metaServerName == null
79 || !metaServerName.equals(cluster.getServerHoldingMeta())) {
80
81 metaServerName = cluster.getLiveRegionServerThreads()
82 .get(0).getRegionServer().getServerName();
83 master.move(HRegionInfo.FIRST_META_REGIONINFO.getEncodedNameAsBytes(),
84 Bytes.toBytes(metaServerName.getServerName()));
85 TEST_UTIL.waitUntilNoRegionsInTransition(60000);
86 }
87 RegionState metaState =
88 MetaTableLocator.getMetaRegionState(master.getZooKeeper());
89 assertEquals("Meta should be not in transition",
90 metaState.getState(), RegionState.State.OPEN);
91 assertNotEquals("Meta should be moved off master",
92 metaServerName, master.getServerName());
93
94
95
96 String rsEphemeralNodePath =
97 ZKUtil.joinZNode(master.getZooKeeper().rsZNode, metaServerName.toString());
98 ZKUtil.deleteNode(master.getZooKeeper(), rsEphemeralNodePath);
99
100 final ServerManager serverManager = master.getServerManager();
101 final ServerName priorMetaServerName = metaServerName;
102 TEST_UTIL.waitFor(120000, 200, new Waiter.Predicate<Exception>() {
103 @Override
104 public boolean evaluate() throws Exception {
105 return !serverManager.isServerOnline(priorMetaServerName)
106 && !serverManager.areDeadServersInProgress();
107 }
108 });
109
110 TEST_UTIL.waitUntilNoRegionsInTransition(60000);
111
112 assertTrue("Meta should be assigned",
113 regionStates.isRegionOnline(HRegionInfo.FIRST_META_REGIONINFO));
114
115 metaState = MetaTableLocator.getMetaRegionState(master.getZooKeeper());
116 assertEquals("Meta should be not in transition",
117 metaState.getState(), RegionState.State.OPEN);
118 assertEquals("Meta should be assigned", metaState.getServerName(),
119 regionStates.getRegionServerOfRegion(HRegionInfo.FIRST_META_REGIONINFO));
120 assertNotEquals("Meta should be assigned on a different server",
121 metaState.getServerName(), metaServerName);
122 }
123
124 public static class MyRegionServer extends MiniHBaseClusterRegionServer {
125
126 public MyRegionServer(Configuration conf, CoordinatedStateManager cp)
127 throws IOException, KeeperException,
128 InterruptedException {
129 super(conf, cp);
130 }
131
132 @Override
133 public void abort(String reason, Throwable cause) {
134
135 try {
136 Thread.sleep(30*1000);
137 } catch (InterruptedException e) {
138 return;
139 }
140 super.abort(reason, cause);
141 }
142 }
143 }