-
Notifications
You must be signed in to change notification settings - Fork 476
Open
Labels
bugThis issue has been verified to be a bug.This issue has been verified to be a bug.
Description
Describe the bug
MiniAccumuloClusterImpl.getProcesses() throws NullPointerException when managerProcess is null due to missing null check, while other similar fields (zooKeeperProcess, gcProcess) have proper null checks.
Root Cause Analysis
The getProcesses() method has inconsistent null handling for process references:
public Map<ServerType,Collection<ProcessReference>> getProcesses() {
Map<ServerType,Collection<ProcessReference>> result = new HashMap<>();
MiniAccumuloClusterControl control = getClusterControl();
result.put(ServerType.MANAGER, references(control.managerProcess)); // BUG: No null check!
result.put(ServerType.TABLET_SERVER,
references(control.tabletServerProcesses.toArray(new Process[0])));
if (control.zooKeeperProcess != null) { // Has null check
result.put(ServerType.ZOOKEEPER, references(control.zooKeeperProcess));
}
if (control.gcProcess != null) { // Has null check
result.put(ServerType.GARBAGE_COLLECTOR, references(control.gcProcess));
}
return result;
}When managerProcess is null (e.g., before cluster starts or after manager is stopped), it gets passed to references() which creates a ProcessReference:
List<ProcessReference> references(Process... procs) {
return Stream.of(procs).map(ProcessReference::new).collect(toList());
}The ProcessReference constructor enforces non-null:
ProcessReference(Process process) {
this.process = Objects.requireNonNull(process); // Throws NPE if null
}Stack Trace
Caused by: java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:209)
at org.apache.accumulo.miniclusterImpl.ProcessReference.<init>(ProcessReference.java:30)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.apache.accumulo.miniclusterImpl.MiniAccumuloClusterImpl.references(MiniAccumuloClusterImpl.java:776)
at org.apache.accumulo.miniclusterImpl.MiniAccumuloClusterImpl.getProcesses(MiniAccumuloClusterImpl.java:782)
Proposed Fix
Add null check for managerProcess consistent with handling of zooKeeperProcess and gcProcess:
public Map<ServerType,Collection<ProcessReference>> getProcesses() {
Map<ServerType,Collection<ProcessReference>> result = new HashMap<>();
MiniAccumuloClusterControl control = getClusterControl();
if (control.managerProcess != null) { // ADD NULL CHECK
result.put(ServerType.MANAGER, references(control.managerProcess));
}
result.put(ServerType.TABLET_SERVER,
references(control.tabletServerProcesses.toArray(new Process[0])));
if (control.zooKeeperProcess != null) {
result.put(ServerType.ZOOKEEPER, references(control.zooKeeperProcess));
}
if (control.gcProcess != null) {
result.put(ServerType.GARBAGE_COLLECTOR, references(control.gcProcess));
}
return result;
}Additional context
Happy to send a PR for this
Metadata
Metadata
Assignees
Labels
bugThis issue has been verified to be a bug.This issue has been verified to be a bug.