teamconfx opened a new issue, #6070:
URL: https://github.com/apache/accumulo/issues/6070
**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:
```java
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`:
```java
List<ProcessReference> references(Process... procs) {
return Stream.of(procs).map(ProcessReference::new).collect(toList());
}
```
The `ProcessReference` constructor enforces non-null:
```java
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`:
```java
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
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]