ddanielr commented on code in PR #5332:
URL: https://github.com/apache/accumulo/pull/5332#discussion_r1954933451


##########
server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java:
##########
@@ -153,43 +164,105 @@ private void listCompactorsByQueue(ServerContext 
context) {
     }
   }
 
-  private void runningCompactions(ServerContext context, boolean details) {
+  private void runningCompactions(ServerContext context, boolean details, 
String format) {
     CompactionCoordinatorService.Client coordinatorClient = null;
     TExternalCompactionList running;
     try {
       coordinatorClient = getCoordinatorClient(context);
       running = coordinatorClient.getRunningCompactions(TraceUtil.traceInfo(), 
context.rpcCreds());
-      if (running == null) {
+      if (running == null || running.getCompactions() == null
+          || running.getCompactions().isEmpty()) {
         System.out.println("No running compactions found.");
         return;
       }
-      var ecidMap = running.getCompactions();
-      if (ecidMap == null) {
-        System.out.println("No running compactions found.");
-        return;
+
+      // Use StringBuilder for CSV
+      StringBuilder csvOutput = new StringBuilder();
+      List<Map<String,Object>> jsonOutput = new ArrayList<>();
+
+      if ("csv".equalsIgnoreCase(format)) {
+        csvOutput.append(
+            
"ECID,Compactor,Kind,Queue,TableId,Status,LastUpdate,Duration,NumFiles,Progress\n");
       }
-      ecidMap.forEach((ecid, ec) -> {
-        if (ec != null) {
-          var runningCompaction = new RunningCompaction(ec);
-          var addr = runningCompaction.getCompactorAddress();
-          var kind = runningCompaction.getJob().kind;
-          var queue = runningCompaction.getQueueName();
-          var ke = KeyExtent.fromThrift(runningCompaction.getJob().extent);
-          System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, 
queue, ke.tableId());
+
+      for (var entry : running.getCompactions().entrySet()) {
+        String ecid = entry.getKey();
+        var ec = entry.getValue();
+        if (ec == null) {
+          continue;
+        }
+
+        var runningCompaction = new RunningCompaction(ec);
+        var addr = runningCompaction.getCompactorAddress();
+        var kind = runningCompaction.getJob().kind;
+        var group = runningCompaction.getQueueName();
+        var ke = KeyExtent.fromThrift(runningCompaction.getJob().extent);
+        String tableId = ke.tableId().canonical();
+
+        String status = "";
+        long lastUpdate = 0, duration = 0;
+        int numFiles = 0;
+        double progress = 0.0;
+
+        if (details) {
+          var runningCompactionInfo = new RunningCompactionInfo(ec);
+          status = runningCompactionInfo.status;
+          lastUpdate = runningCompactionInfo.lastUpdate;
+          duration = runningCompactionInfo.duration;
+          numFiles = runningCompactionInfo.numFiles;
+          progress = runningCompactionInfo.progress;
+        }
+
+        // Handle plain output
+        if ("plain".equalsIgnoreCase(format)) {
+          System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, 
group, tableId);
           if (details) {
-            var runningCompactionInfo = new RunningCompactionInfo(ec);
-            var status = runningCompactionInfo.status;
-            var last = runningCompactionInfo.lastUpdate;
-            var duration = runningCompactionInfo.duration;
-            var numFiles = runningCompactionInfo.numFiles;
-            var progress = runningCompactionInfo.progress;
             System.out.format("  %s Last Update: %dms Duration: %dms Files: %d 
Progress: %.2f%%\n",
-                status, last, duration, numFiles, progress);
+                status, lastUpdate, duration, numFiles, progress);
           }
         }
-      });
+
+        // Handle CSV output
+        if ("csv".equalsIgnoreCase(format)) {
+          csvOutput.append(String.format("%s,%s,%s,%s,%s,%s,%d,%d,%d,%.2f\n", 
ecid, addr, kind,
+              group, tableId, status, lastUpdate, duration, numFiles, 
progress));
+        }
+
+        // Handle JSON output
+        if ("json".equalsIgnoreCase(format)) {
+          Map<String,Object> jsonEntry = new LinkedHashMap<String,Object>();
+          jsonEntry.put("ecid", ecid);
+          jsonEntry.put("compactor", addr);
+          jsonEntry.put("kind", kind);
+          jsonEntry.put("queue", group);
+          jsonEntry.put("tableId", tableId);
+          if (details) {
+            jsonEntry.put("status", status);
+            jsonEntry.put("lastUpdate", lastUpdate);
+            jsonEntry.put("duration", duration);
+            jsonEntry.put("numFiles", numFiles);
+            jsonEntry.put("progress", progress);
+          }
+          jsonOutput.add(jsonEntry);
+        }
+      }
+
+      // Print CSV
+      if ("csv".equalsIgnoreCase(format)) {
+        System.out.print(csvOutput.toString());
+      }
+
+      // Print JSON
+      if ("json".equalsIgnoreCase(format)) {
+        try {
+          System.out.println(
+              new 
ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(jsonOutput));
+        } catch (JsonProcessingException e) {
+          log.error("Error generating JSON output", e);
+        }

Review Comment:
   To avoid the jackson dependency that @kevinrr888 mentioned, you can just 
gson printing instead.
   
   ```suggestion
         // Print JSON
         if ("json".equalsIgnoreCase(format)) {
           try {
             Gson gson = new GsonBuilder().setPrettyPrinting().create();
             System.out.println(gson.toJson(jsonOutput));
           } catch (Exception e) {
             log.error("Error generating JSON output", e);
           }
   ```



##########
server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java:
##########
@@ -153,43 +164,105 @@ private void listCompactorsByQueue(ServerContext 
context) {
     }
   }
 
-  private void runningCompactions(ServerContext context, boolean details) {
+  private void runningCompactions(ServerContext context, boolean details, 
String format) {
     CompactionCoordinatorService.Client coordinatorClient = null;
     TExternalCompactionList running;
     try {
       coordinatorClient = getCoordinatorClient(context);
       running = coordinatorClient.getRunningCompactions(TraceUtil.traceInfo(), 
context.rpcCreds());
-      if (running == null) {
+      if (running == null || running.getCompactions() == null
+          || running.getCompactions().isEmpty()) {
         System.out.println("No running compactions found.");
         return;
       }
-      var ecidMap = running.getCompactions();
-      if (ecidMap == null) {
-        System.out.println("No running compactions found.");
-        return;
+
+      // Use StringBuilder for CSV
+      StringBuilder csvOutput = new StringBuilder();
+      List<Map<String,Object>> jsonOutput = new ArrayList<>();
+
+      if ("csv".equalsIgnoreCase(format)) {
+        csvOutput.append(
+            
"ECID,Compactor,Kind,Queue,TableId,Status,LastUpdate,Duration,NumFiles,Progress\n");
       }
-      ecidMap.forEach((ecid, ec) -> {
-        if (ec != null) {
-          var runningCompaction = new RunningCompaction(ec);
-          var addr = runningCompaction.getCompactorAddress();
-          var kind = runningCompaction.getJob().kind;
-          var queue = runningCompaction.getQueueName();
-          var ke = KeyExtent.fromThrift(runningCompaction.getJob().extent);
-          System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, 
queue, ke.tableId());
+
+      for (var entry : running.getCompactions().entrySet()) {
+        String ecid = entry.getKey();
+        var ec = entry.getValue();
+        if (ec == null) {
+          continue;
+        }
+
+        var runningCompaction = new RunningCompaction(ec);
+        var addr = runningCompaction.getCompactorAddress();
+        var kind = runningCompaction.getJob().kind;
+        var group = runningCompaction.getQueueName();
+        var ke = KeyExtent.fromThrift(runningCompaction.getJob().extent);
+        String tableId = ke.tableId().canonical();
+
+        String status = "";
+        long lastUpdate = 0, duration = 0;
+        int numFiles = 0;
+        double progress = 0.0;
+
+        if (details) {
+          var runningCompactionInfo = new RunningCompactionInfo(ec);
+          status = runningCompactionInfo.status;
+          lastUpdate = runningCompactionInfo.lastUpdate;
+          duration = runningCompactionInfo.duration;
+          numFiles = runningCompactionInfo.numFiles;
+          progress = runningCompactionInfo.progress;
+        }
+
+        // Handle plain output
+        if ("plain".equalsIgnoreCase(format)) {
+          System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, 
group, tableId);
           if (details) {
-            var runningCompactionInfo = new RunningCompactionInfo(ec);
-            var status = runningCompactionInfo.status;
-            var last = runningCompactionInfo.lastUpdate;
-            var duration = runningCompactionInfo.duration;
-            var numFiles = runningCompactionInfo.numFiles;
-            var progress = runningCompactionInfo.progress;
             System.out.format("  %s Last Update: %dms Duration: %dms Files: %d 
Progress: %.2f%%\n",
-                status, last, duration, numFiles, progress);
+                status, lastUpdate, duration, numFiles, progress);
           }
         }
-      });
+
+        // Handle CSV output
+        if ("csv".equalsIgnoreCase(format)) {
+          csvOutput.append(String.format("%s,%s,%s,%s,%s,%s,%d,%d,%d,%.2f\n", 
ecid, addr, kind,
+              group, tableId, status, lastUpdate, duration, numFiles, 
progress));
+        }
+
+        // Handle JSON output
+        if ("json".equalsIgnoreCase(format)) {
+          Map<String,Object> jsonEntry = new LinkedHashMap<String,Object>();
+          jsonEntry.put("ecid", ecid);
+          jsonEntry.put("compactor", addr);
+          jsonEntry.put("kind", kind);
+          jsonEntry.put("queue", group);
+          jsonEntry.put("tableId", tableId);
+          if (details) {
+            jsonEntry.put("status", status);
+            jsonEntry.put("lastUpdate", lastUpdate);
+            jsonEntry.put("duration", duration);
+            jsonEntry.put("numFiles", numFiles);
+            jsonEntry.put("progress", progress);
+          }
+          jsonOutput.add(jsonEntry);
+        }
+      }
+
+      // Print CSV
+      if ("csv".equalsIgnoreCase(format)) {
+        System.out.print(csvOutput.toString());
+      }
+
+      // Print JSON
+      if ("json".equalsIgnoreCase(format)) {
+        try {
+          System.out.println(
+              new 
ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(jsonOutput));
+        } catch (JsonProcessingException e) {
+          log.error("Error generating JSON output", e);
+        }

Review Comment:
   To avoid the jackson dependency that @kevinrr888 mentioned, you can just use 
gson printing instead.
   
   ```suggestion
         // Print JSON
         if ("json".equalsIgnoreCase(format)) {
           try {
             Gson gson = new GsonBuilder().setPrettyPrinting().create();
             System.out.println(gson.toJson(jsonOutput));
           } catch (Exception e) {
             log.error("Error generating JSON output", e);
           }
   ```



-- 
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