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 master.assignmentManager.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
111 assertTrue("Meta should be assigned",
112 regionStates.isRegionOnline(HRegionInfo.FIRST_META_REGIONINFO));
113
114 metaState = MetaTableLocator.getMetaRegionState(master.getZooKeeper());
115 assertEquals("Meta should be not in transition",
116 metaState.getState(), RegionState.State.OPEN);
117 assertEquals("Meta should be assigned", metaState.getServerName(),
118 regionStates.getRegionServerOfRegion(HRegionInfo.FIRST_META_REGIONINFO));
119 assertNotEquals("Meta should be assigned on a different server",
120 metaState.getServerName(), metaServerName);
121 }
122
123 public static class MyRegionServer extends MiniHBaseClusterRegionServer {
124
125 public MyRegionServer(Configuration conf, CoordinatedStateManager cp)
126 throws IOException, KeeperException,
127 InterruptedException {
128 super(conf, cp);
129 }
130
131 @Override
132 public void abort(String reason, Throwable cause) {
133
134 try {
135 Thread.sleep(30*1000);
136 } catch (InterruptedException e) {
137 return;
138 }
139 super.abort(reason, cause);
140 }
141 }
142 }