1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.hadoop.hbase.coprocessor;
22
23 import java.io.IOException;
24
25 import org.apache.hadoop.conf.Configuration;
26 import org.apache.hadoop.hbase.*;
27 import org.apache.hadoop.hbase.client.HTable;
28 import org.apache.hadoop.hbase.client.Put;
29 import org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException;
30 import org.apache.hadoop.hbase.regionserver.HRegionServer;
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 boolean writeToWAL) {
55 String tableName =
56 c.getEnvironment().getRegion().getRegionInfo().getTableNameAsString();
57 if (tableName.equals("observed_table")) {
58 Integer i = null;
59 i = i + 1;
60 }
61 }
62 }
63
64 private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
65
66 @BeforeClass
67 public static void setupBeforeClass() throws Exception {
68
69 Configuration conf = TEST_UTIL.getConfiguration();
70 conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
71 BuggyRegionObserver.class.getName());
72 TEST_UTIL.startMiniCluster(2);
73 }
74
75 @AfterClass
76 public static void teardownAfterClass() throws Exception {
77 TEST_UTIL.shutdownMiniCluster();
78 }
79
80 @Test(timeout=30000)
81 public void testExceptionFromCoprocessorDuringPut()
82 throws IOException {
83
84
85
86
87
88
89
90
91 byte[] TEST_TABLE = Bytes.toBytes("observed_table");
92 byte[] TEST_FAMILY = Bytes.toBytes("aaa");
93
94 HTable table = TEST_UTIL.createTable(TEST_TABLE, TEST_FAMILY);
95 TEST_UTIL.waitUntilAllRegionsAssigned(
96 TEST_UTIL.createMultiRegions(table, TEST_FAMILY));
97
98
99 HRegionServer regionServer =
100 TEST_UTIL.getRSForFirstRegionInTable(TEST_TABLE);
101
102
103
104
105
106
107
108
109 boolean threwDNRE = false;
110 try {
111 final byte[] ROW = Bytes.toBytes("aaa");
112 Put put = new Put(ROW);
113 put.add(TEST_FAMILY, ROW, ROW);
114 table.put(put);
115 } catch (RetriesExhaustedWithDetailsException e) {
116
117
118
119
120 assertTrue(e.getMessage().contains("DoNotRetryIOException"));
121 threwDNRE = true;
122 } finally {
123 assertTrue(threwDNRE);
124 }
125
126
127
128 for (int i = 0; i < 3; i++) {
129 assertFalse(regionServer.isAborted());
130 try {
131 Thread.sleep(1000);
132 } catch (InterruptedException e) {
133 fail("InterruptedException while waiting for regionserver " +
134 "zk node to be deleted.");
135 }
136 }
137 table.close();
138 }
139
140 @org.junit.Rule
141 public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
142 new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
143 }
144