1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.coprocessor;
21
22 import java.io.IOException;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.conf.Configuration;
27 import org.apache.hadoop.hbase.*;
28 import org.apache.hadoop.hbase.Waiter.Predicate;
29 import org.apache.hadoop.hbase.client.HTable;
30 import org.apache.hadoop.hbase.client.Put;
31 import org.apache.hadoop.hbase.client.Durability;
32 import org.apache.hadoop.hbase.regionserver.HRegionServer;
33 import org.apache.hadoop.hbase.testclassification.MediumTests;
34 import org.apache.hadoop.hbase.util.Bytes;
35 import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
36 import org.junit.Assert;
37 import org.junit.Test;
38 import org.junit.experimental.categories.Category;
39
40 import static org.junit.Assert.*;
41
42
43
44
45
46
47
48 @Category(MediumTests.class)
49 public class TestRegionServerCoprocessorExceptionWithAbort {
50 static final Log LOG = LogFactory.getLog(TestRegionServerCoprocessorExceptionWithAbort.class);
51 private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
52 private static final TableName TABLE_NAME = TableName.valueOf("observed_table");
53
54 @Test(timeout=60000)
55 public void testExceptionDuringInitialization() throws Exception {
56 Configuration conf = TEST_UTIL.getConfiguration();
57 conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 2);
58 conf.setBoolean(CoprocessorHost.ABORT_ON_ERROR_KEY, true);
59 conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");
60 TEST_UTIL.startMiniCluster(2);
61 try {
62 MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
63
64
65 final HRegionServer regionServer = cluster.getRegionServer(0);
66 conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
67 FailedInitializationObserver.class.getName());
68 regionServer.getRegionServerCoprocessorHost().loadSystemCoprocessors(conf,
69 CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
70 TEST_UTIL.waitFor(10000, 1000, new Predicate<Exception>() {
71 @Override
72 public boolean evaluate() throws Exception {
73 return regionServer.isAborted();
74 }
75 });
76 } finally {
77 TEST_UTIL.shutdownMiniCluster();
78 }
79 }
80
81 @Test(timeout=60000)
82 public void testExceptionFromCoprocessorDuringPut() throws Exception {
83
84 Configuration conf = TEST_UTIL.getConfiguration();
85 conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 2);
86 conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, BuggyRegionObserver.class.getName());
87 conf.setBoolean(CoprocessorHost.ABORT_ON_ERROR_KEY, true);
88 TEST_UTIL.startMiniCluster(2);
89 try {
90
91
92
93 final byte[] TEST_FAMILY = Bytes.toBytes("aaa");
94
95 HTable table = TEST_UTIL.createTable(TABLE_NAME, TEST_FAMILY);
96 TEST_UTIL.createMultiRegions(table, TEST_FAMILY);
97 TEST_UTIL.waitUntilAllRegionsAssigned(TABLE_NAME);
98
99
100 final HRegionServer regionServer = TEST_UTIL.getRSForFirstRegionInTable(TABLE_NAME);
101
102 try {
103 final byte[] ROW = Bytes.toBytes("aaa");
104 Put put = new Put(ROW);
105 put.add(TEST_FAMILY, ROW, ROW);
106 table.put(put);
107 table.flushCommits();
108 } catch (IOException e) {
109
110
111
112 }
113
114
115
116 boolean aborted = false;
117 for (int i = 0; i < 10; i++) {
118 aborted = regionServer.isAborted();
119 if (aborted) {
120 break;
121 }
122 try {
123 Thread.sleep(1000);
124 } catch (InterruptedException e) {
125 fail("InterruptedException while waiting for regionserver " +
126 "zk node to be deleted.");
127 }
128 }
129 Assert.assertTrue("The region server should have aborted", aborted);
130 table.close();
131 } finally {
132 TEST_UTIL.shutdownMiniCluster();
133 }
134 }
135
136 public static class FailedInitializationObserver extends SimpleRegionObserver {
137 @SuppressWarnings("null")
138 @Override
139 public void start(CoprocessorEnvironment e) throws IOException {
140
141 Integer i = null;
142 i = i + 1;
143 }
144 }
145
146 public static class BuggyRegionObserver extends SimpleRegionObserver {
147 @SuppressWarnings("null")
148 @Override
149 public void prePut(final ObserverContext<RegionCoprocessorEnvironment> c,
150 final Put put, final WALEdit edit,
151 final Durability durability) {
152 String tableName =
153 c.getEnvironment().getRegion().getRegionInfo().getTable().getNameAsString();
154 if (tableName.equals("observed_table")) {
155
156 Integer i = null;
157 i = i + 1;
158 }
159 }
160 }
161 }