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.RetriesExhaustedWithDetailsException;
29 import org.apache.hadoop.hbase.client.Durability;
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 Durability durability) {
55 String tableName =
56 c.getEnvironment().getRegion().getRegionInfo().getTable().getNameAsString();
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=60000)
81 public void testExceptionFromCoprocessorDuringPut()
82 throws IOException, InterruptedException {
83
84
85
86
87
88
89
90
91 TableName TEST_TABLE =
92 TableName.valueOf("observed_table");
93 byte[] TEST_FAMILY = Bytes.toBytes("aaa");
94
95 HTable table = TEST_UTIL.createTable(TEST_TABLE, TEST_FAMILY);
96 TEST_UTIL.createMultiRegions(table, TEST_FAMILY);
97 TEST_UTIL.waitUntilAllRegionsAssigned(TEST_TABLE);
98
99
100 HRegionServer regionServer =
101 TEST_UTIL.getRSForFirstRegionInTable(TEST_TABLE);
102
103
104
105
106
107
108
109
110 boolean threwDNRE = false;
111 try {
112 final byte[] ROW = Bytes.toBytes("aaa");
113 Put put = new Put(ROW);
114 put.add(TEST_FAMILY, ROW, ROW);
115 table.put(put);
116 } catch (RetriesExhaustedWithDetailsException e) {
117
118
119
120
121 assertTrue(e.getMessage().contains("DoNotRetryIOException"));
122 threwDNRE = true;
123 } finally {
124 assertTrue(threwDNRE);
125 }
126
127
128
129 for (int i = 0; i < 3; i++) {
130 assertFalse(regionServer.isAborted());
131 try {
132 Thread.sleep(1000);
133 } catch (InterruptedException e) {
134 fail("InterruptedException while waiting for regionserver " +
135 "zk node to be deleted.");
136 }
137 }
138 table.close();
139 }
140
141 }
142