Skip to content

Commit 105a274

Browse files
HBASE-27390 getClusterMetrics NullPointerException when ServerTask status null (#4853)
Signed-off-by: Bryan Beaudreault <[email protected]>
1 parent 96e8814 commit 105a274

File tree

7 files changed

+22
-17
lines changed

7 files changed

+22
-17
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public class MonitoredRPCHandlerImpl extends MonitoredTaskImpl implements Monito
4444
private boolean snapshot = false;
4545
private Map<String, Object> callInfoMap = new HashMap<>();
4646

47-
public MonitoredRPCHandlerImpl() {
48-
super(false);
47+
public MonitoredRPCHandlerImpl(String description) {
48+
super(false, description);
4949
// in this implementation, WAITING indicates that the handler is not
5050
// actively servicing an RPC call.
5151
setState(State.WAITING);

hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.hadoop.hbase.util.GsonUtil;
2929
import org.apache.yetus.audience.InterfaceAudience;
3030

31+
import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;
3132
import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;
3233
import org.apache.hbase.thirdparty.com.google.gson.Gson;
3334

@@ -46,11 +47,13 @@ class MonitoredTaskImpl implements MonitoredTask {
4647

4748
private static final Gson GSON = GsonUtil.createGson().create();
4849

49-
public MonitoredTaskImpl(boolean enableJournal) {
50+
public MonitoredTaskImpl(boolean enableJournal, String description) {
5051
startTime = EnvironmentEdgeManager.currentTime();
5152
statusTime = startTime;
5253
stateTime = startTime;
5354
warnTime = startTime;
55+
this.description = description;
56+
this.status = "status unset";
5457
if (enableJournal) {
5558
journal = new ConcurrentLinkedQueue<>();
5659
} else {
@@ -161,6 +164,7 @@ public void abort(String msg) {
161164

162165
@Override
163166
public void setStatus(String status) {
167+
Preconditions.checkNotNull(status, "Status is null");
164168
this.status = status;
165169
statusTime = EnvironmentEdgeManager.currentTime();
166170
if (journal != null) {
@@ -175,6 +179,7 @@ protected void setState(State state) {
175179

176180
@Override
177181
public void setDescription(String description) {
182+
Preconditions.checkNotNull(description, "Description is null");
178183
this.description = description;
179184
}
180185

hbase-server/src/main/java/org/apache/hadoop/hbase/monitoring/TaskMonitor.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ public MonitoredTask createStatus(String description, boolean ignore) {
9494

9595
public synchronized MonitoredTask createStatus(String description, boolean ignore,
9696
boolean enableJournal) {
97-
MonitoredTask stat = new MonitoredTaskImpl(enableJournal);
98-
stat.setDescription(description);
97+
MonitoredTask stat = new MonitoredTaskImpl(enableJournal, description);
9998
MonitoredTask proxy = (MonitoredTask) Proxy.newProxyInstance(stat.getClass().getClassLoader(),
10099
new Class<?>[] { MonitoredTask.class }, new PassthroughInvocationHandler<>(stat));
101100
TaskAndWeakRefPair pair = new TaskAndWeakRefPair(stat, proxy);
@@ -109,8 +108,7 @@ public synchronized MonitoredTask createStatus(String description, boolean ignor
109108
}
110109

111110
public synchronized MonitoredRPCHandler createRPCStatus(String description) {
112-
MonitoredRPCHandler stat = new MonitoredRPCHandlerImpl();
113-
stat.setDescription(description);
111+
MonitoredRPCHandler stat = new MonitoredRPCHandlerImpl(description);
114112
MonitoredRPCHandler proxy =
115113
(MonitoredRPCHandler) Proxy.newProxyInstance(stat.getClass().getClassLoader(),
116114
new Class<?>[] { MonitoredRPCHandler.class }, new PassthroughInvocationHandler<>(stat));

hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestCallRunner.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public void testSimpleCall() {
8181

8282
TraceUtil.trace(() -> {
8383
CallRunner cr = new CallRunner(mockRpcServer, mockCall);
84-
cr.setStatus(new MonitoredRPCHandlerImpl());
84+
cr.setStatus(new MonitoredRPCHandlerImpl("test"));
8585
cr.run();
8686
}, testName.getMethodName());
8787

@@ -101,7 +101,7 @@ public void testCallCleanup() {
101101

102102
TraceUtil.trace(() -> {
103103
CallRunner cr = new CallRunner(mockRpcServer, mockCall);
104-
cr.setStatus(new MonitoredRPCHandlerImpl());
104+
cr.setStatus(new MonitoredRPCHandlerImpl("test"));
105105
cr.run();
106106
}, testName.getMethodName());
107107
Mockito.verify(mockCall, Mockito.times(1)).cleanup();
@@ -116,7 +116,7 @@ public void testCallRunnerDropDisconnected() {
116116

117117
TraceUtil.trace(() -> {
118118
CallRunner cr = new CallRunner(mockRpcServer, mockCall);
119-
cr.setStatus(new MonitoredRPCHandlerImpl());
119+
cr.setStatus(new MonitoredRPCHandlerImpl("test"));
120120
cr.drop();
121121
}, testName.getMethodName());
122122
Mockito.verify(mockCall, Mockito.times(1)).cleanup();
@@ -142,7 +142,7 @@ public void testCallRunnerDropConnected() {
142142

143143
TraceUtil.trace(() -> {
144144
CallRunner cr = new CallRunner(mockRpcServer, mockCall);
145-
cr.setStatus(new MonitoredRPCHandlerImpl());
145+
cr.setStatus(new MonitoredRPCHandlerImpl("test"));
146146
cr.drop();
147147
}, testName.getMethodName());
148148
Mockito.verify(mockCall, Mockito.times(1)).cleanup();

hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public void testCallQueueInfo() throws IOException, InterruptedException {
113113

114114
for (int i = totalCallMethods; i > 0; i--) {
115115
CallRunner task = createMockTask();
116-
task.setStatus(new MonitoredRPCHandlerImpl());
116+
task.setStatus(new MonitoredRPCHandlerImpl("test"));
117117

118118
if (!scheduler.dispatch(task)) {
119119
unableToDispatch++;

hbase-server/src/test/java/org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void testBasic() throws IOException, InterruptedException {
109109
scheduler.init(CONTEXT);
110110
scheduler.start();
111111
CallRunner task = createMockTask();
112-
task.setStatus(new MonitoredRPCHandlerImpl());
112+
task.setStatus(new MonitoredRPCHandlerImpl("test"));
113113
scheduler.dispatch(task);
114114
verify(task, timeout(10000)).run();
115115
scheduler.stop();
@@ -164,7 +164,7 @@ public void testCallQueueInfo() throws IOException, InterruptedException {
164164
int totalCallMethods = 10;
165165
for (int i = totalCallMethods; i > 0; i--) {
166166
CallRunner task = createMockTask();
167-
task.setStatus(new MonitoredRPCHandlerImpl());
167+
task.setStatus(new MonitoredRPCHandlerImpl("test"));
168168
scheduler.dispatch(task);
169169
}
170170

@@ -205,7 +205,7 @@ public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
205205
}
206206
};
207207
for (CallRunner task : tasks) {
208-
task.setStatus(new MonitoredRPCHandlerImpl());
208+
task.setStatus(new MonitoredRPCHandlerImpl("test"));
209209
doAnswer(answerToRun).when(task).run();
210210
}
211211

@@ -524,7 +524,7 @@ public void testScanQueues() throws Exception {
524524

525525
private void doAnswerTaskExecution(final CallRunner callTask, final ArrayList<Integer> results,
526526
final int value, final int sleepInterval) {
527-
callTask.setStatus(new MonitoredRPCHandlerImpl());
527+
callTask.setStatus(new MonitoredRPCHandlerImpl("test"));
528528
doAnswer(new Answer<Object>() {
529529
@Override
530530
public Object answer(InvocationOnMock invocation) {

hbase-server/src/test/java/org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public void testTaskMonitorBasics() {
6363
assertEquals(task.getDescription(), taskFromTm.getDescription());
6464
assertEquals(-1, taskFromTm.getCompletionTimestamp());
6565
assertEquals(MonitoredTask.State.RUNNING, taskFromTm.getState());
66+
assertEquals(task.getStatus(), taskFromTm.getStatus());
67+
assertEquals("status unset", taskFromTm.getStatus());
6668

6769
// Mark it as finished
6870
task.markComplete("Finished!");
@@ -229,7 +231,7 @@ public void testStatusJournal() {
229231

230232
@Test
231233
public void testClone() throws Exception {
232-
MonitoredRPCHandlerImpl monitor = new MonitoredRPCHandlerImpl();
234+
MonitoredRPCHandlerImpl monitor = new MonitoredRPCHandlerImpl("test");
233235
monitor.abort("abort RPC");
234236
TestParam testParam = new TestParam("param1");
235237
monitor.setRPC("method1", new Object[] { testParam }, 0);

0 commit comments

Comments
 (0)