1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver;
19
20 import static org.junit.Assert.*;
21
22 import java.io.IOException;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.hadoop.hbase.HBaseTestingUtility;
27 import org.apache.hadoop.hbase.HColumnDescriptor;
28 import org.apache.hadoop.hbase.HRegionInfo;
29 import org.apache.hadoop.hbase.HTableDescriptor;
30 import org.apache.hadoop.hbase.MiniHBaseCluster;
31 import org.apache.hadoop.hbase.client.HBaseAdmin;
32 import org.apache.hadoop.hbase.client.HTable;
33 import org.apache.hadoop.hbase.client.Put;
34 import org.apache.hadoop.hbase.client.Result;
35 import org.apache.hadoop.hbase.client.ResultScanner;
36 import org.apache.hadoop.hbase.client.Scan;
37 import org.apache.hadoop.hbase.master.HMaster;
38 import org.apache.hadoop.hbase.util.Bytes;
39 import org.apache.hadoop.hbase.MediumTests;
40 import org.junit.Test;
41 import org.junit.experimental.categories.Category;
42
43
44
45
46
47
48 @Category(MediumTests.class)
49 public class TestHRegionOnCluster {
50 private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
51
52 @Test (timeout=180000)
53 public void testDataCorrectnessReplayingRecoveredEdits() throws Exception {
54 final int NUM_MASTERS = 1;
55 final int NUM_RS = 3;
56 TEST_UTIL.startMiniCluster(NUM_MASTERS, NUM_RS);
57
58 try {
59 final byte[] TABLENAME = Bytes
60 .toBytes("testDataCorrectnessReplayingRecoveredEdits");
61 final byte[] FAMILY = Bytes.toBytes("family");
62 MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
63 HMaster master = cluster.getMaster();
64
65
66 HTableDescriptor desc = new HTableDescriptor(TABLENAME);
67 desc.addFamily(new HColumnDescriptor(FAMILY));
68 HBaseAdmin hbaseAdmin = TEST_UTIL.getHBaseAdmin();
69 hbaseAdmin.createTable(desc);
70
71 assertTrue(hbaseAdmin.isTableAvailable(TABLENAME));
72
73
74 HTable table = new HTable(TEST_UTIL.getConfiguration(), TABLENAME);
75 putDataAndVerify(table, "r1", FAMILY, "v1", 1);
76
77
78 HRegionInfo regionInfo = table.getRegionLocation("r1").getRegionInfo();
79 int originServerNum = cluster.getServerWith(regionInfo.getRegionName());
80 HRegionServer originServer = cluster.getRegionServer(originServerNum);
81 int targetServerNum = (originServerNum + 1) % NUM_RS;
82 HRegionServer targetServer = cluster.getRegionServer(targetServerNum);
83 assertFalse(originServer.equals(targetServer));
84
85 do {
86 Thread.sleep(10);
87 } while (!originServer.getServerName().equals(
88 cluster.getMaster().getAssignmentManager().getRegionServerOfRegion(regionInfo)));
89
90 hbaseAdmin.move(regionInfo.getEncodedNameAsBytes(),
91 Bytes.toBytes(targetServer.getServerName().getServerName()));
92
93 do {
94 Thread.sleep(10);
95 } while (cluster.getServerWith(regionInfo.getRegionName()) == originServerNum ||
96 !targetServer.getServerName().equals(
97 cluster.getMaster().getAssignmentManager().getRegionServerOfRegion(regionInfo)));
98
99
100 putDataAndVerify(table, "r2", FAMILY, "v2", 2);
101
102
103 hbaseAdmin.move(regionInfo.getEncodedNameAsBytes(),
104 Bytes.toBytes(originServer.getServerName().getServerName()));
105 do {
106 Thread.sleep(1);
107 } while (cluster.getServerWith(regionInfo.getRegionName()) == targetServerNum);
108
109
110 putDataAndVerify(table, "r3", FAMILY, "v3", 3);
111
112
113 targetServer.kill();
114 cluster.getRegionServerThreads().get(targetServerNum).join();
115
116 while (master.getServerManager().areDeadServersInProgress()) {
117 Thread.sleep(5);
118 }
119
120 originServer.kill();
121 cluster.getRegionServerThreads().get(originServerNum).join();
122
123
124 putDataAndVerify(table, "r4", FAMILY, "v4", 4);
125
126 } finally {
127 TEST_UTIL.shutdownMiniCluster();
128 }
129 }
130
131 private void putDataAndVerify(HTable table, String row, byte[] family,
132 String value, int verifyNum) throws IOException {
133 System.out.println("=========Putting data :" + row);
134 Put put = new Put(Bytes.toBytes(row));
135 put.add(family, Bytes.toBytes("q1"), Bytes.toBytes(value));
136 table.put(put);
137 ResultScanner resultScanner = table.getScanner(new Scan());
138 List<Result> results = new ArrayList<Result>();
139 while (true) {
140 Result r = resultScanner.next();
141 if (r == null)
142 break;
143 results.add(r);
144 }
145 resultScanner.close();
146 if (results.size() != verifyNum) {
147 System.out.println(results);
148 }
149 assertEquals(verifyNum, results.size());
150 }
151
152 @org.junit.Rule
153 public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
154 new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
155 }