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]

Reply via email to