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.hadoop.conf.Configuration;
25 import org.apache.hadoop.hbase.*;
26 import org.apache.hadoop.hbase.client.HTable;
27 import org.apache.hadoop.hbase.client.Put;
28 import org.apache.hadoop.hbase.client.Durability;
29 import org.apache.hadoop.hbase.regionserver.HRegionServer;
30 import org.apache.hadoop.hbase.testclassification.MediumTests;
31 import org.apache.hadoop.hbase.util.Bytes;
32 import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
33 import org.junit.AfterClass;
34 import org.junit.BeforeClass;
35 import org.junit.Test;
36 import org.junit.experimental.categories.Category;
37
38 import static org.junit.Assert.*;
39
40
41
42
43
44
45
46
47 @Category(MediumTests.class)
48 public class TestRegionServerCoprocessorExceptionWithRemove {
49 public static class BuggyRegionObserver extends SimpleRegionObserver {
50 @SuppressWarnings("null")
51 @Override
52 public void prePut(final ObserverContext<RegionCoprocessorEnvironment> c,
53 final Put put, final WALEdit edit,
54 final Durability durability) {
55 String tableName =
56 c.getEnvironment().getRegion().getRegionInfo().getTable().getNameAsString();
57 if (tableName.equals("observed_table")) {
58
59 Integer i = null;
60 i = i + 1;
61 }
62 }
63 }
64
65 private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
66
67 @BeforeClass
68 public static void setupBeforeClass() throws Exception {
69
70 Configuration conf = TEST_UTIL.getConfiguration();
71 conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
72 BuggyRegionObserver.class.getName());
73 TEST_UTIL.getConfiguration().setBoolean(CoprocessorHost.ABORT_ON_ERROR_KEY, false);
74 TEST_UTIL.startMiniCluster();
75 }
76
77 @AfterClass
78 public static void teardownAfterClass() throws Exception {
79 TEST_UTIL.shutdownMiniCluster();
80 }
81
82 @Test(timeout=60000)
83 public void testExceptionFromCoprocessorDuringPut()
84 throws IOException, InterruptedException {
85
86
87
88
89
90
91
92
93 TableName TEST_TABLE =
94 TableName.valueOf("observed_table");
95 byte[] TEST_FAMILY = Bytes.toBytes("aaa");
96
97 HTable table = TEST_UTIL.createTable(TEST_TABLE, TEST_FAMILY);
98 TEST_UTIL.createMultiRegions(table, TEST_FAMILY);
99 TEST_UTIL.waitUntilAllRegionsAssigned(TEST_TABLE);
100
101
102 HRegionServer regionServer =
103 TEST_UTIL.getRSForFirstRegionInTable(TEST_TABLE);
104
105 boolean threwIOE = false;
106 try {
107 final byte[] ROW = Bytes.toBytes("aaa");
108 Put put = new Put(ROW);
109 put.add(TEST_FAMILY, ROW, ROW);
110 table.put(put);
111 table.flushCommits();
112
113 table.put(put);
114 table.flushCommits();
115 } catch (IOException e) {
116 threwIOE = true;
117 } finally {
118 assertTrue("The regionserver should have thrown an exception", threwIOE);
119 }
120
121
122
123 for (int i = 0; i < 10; i++) {
124 assertFalse(regionServer.isAborted());
125 try {
126 Thread.sleep(1000);
127 } catch (InterruptedException e) {
128 fail("InterruptedException while waiting for regionserver " +
129 "zk node to be deleted.");
130 }
131 }
132 table.close();
133 }
134
135 }
136