From a34562aecb0523c734eff9f76b7b50f1d256d42e Mon Sep 17 00:00:00 2001 From: suvrat1629 Date: Thu, 13 Feb 2025 21:05:54 +0530 Subject: [PATCH 1/9] added formatting flags --- .../apache/accumulo/server/util/ECAdmin.java | 120 ++++++++++++++---- 1 file changed, 96 insertions(+), 24 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index 3f0bcc1e657..b18a4686ba4 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -18,6 +18,11 @@ */ package org.apache.accumulo.server.util; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + import org.apache.accumulo.core.compaction.thrift.CompactionCoordinatorService; import org.apache.accumulo.core.compaction.thrift.TExternalCompactionList; import org.apache.accumulo.core.dataImpl.KeyExtent; @@ -40,6 +45,8 @@ import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.auto.service.AutoService; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -62,6 +69,10 @@ static class RunningCommand { @Parameter(names = {"-d", "--details"}, description = "display details about the running compactions") boolean details = false; + + @Parameter(names = {"-f", "--format"}, + description = "output format: plain (default), csv, json") + String format = "plain"; } @Parameters(commandDescription = "list all compactors in zookeeper") @@ -116,7 +127,7 @@ public void execute(final String[] args) { } else if (cl.getParsedCommand().equals("cancel")) { cancelCompaction(context, cancelOps.ecid); } else if (cl.getParsedCommand().equals("running")) { - runningCompactions(context, runningOpts.details); + runningCompactions(context, runningOpts.details, runningOpts.format); } else { log.error("Unknown command {}", cl.getParsedCommand()); cl.usage(); @@ -153,43 +164,104 @@ 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> 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 jsonEntry = new LinkedHashMap(); + 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); + } + } } catch (Exception e) { - throw new RuntimeException("Unable to get running compactions.", e); + throw new IllegalStateException("Unable to get running compactions.", e); } finally { ThriftUtil.returnClient(coordinatorClient, context); } From 35c4881392d06a02988642bec46755aff0b9f27c Mon Sep 17 00:00:00 2001 From: Suvrat Acharya <140749446+Suvrat1629@users.noreply.github.com> Date: Thu, 13 Feb 2025 22:14:04 +0530 Subject: [PATCH 2/9] Update server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java Co-authored-by: Kevin Rathbun --- .../src/main/java/org/apache/accumulo/server/util/ECAdmin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index b18a4686ba4..181564aebeb 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -188,8 +188,9 @@ private void runningCompactions(ServerContext context, boolean details, String f for (var entry : running.getCompactions().entrySet()) { String ecid = entry.getKey(); var ec = entry.getValue(); - if (ec == null) + if (ec == null) { continue; + } var runningCompaction = new RunningCompaction(ec); var addr = runningCompaction.getCompactorAddress(); From 2b2907c46607ca0e152fa10145c667b3a07a15c8 Mon Sep 17 00:00:00 2001 From: suvrat1629 Date: Thu, 13 Feb 2025 23:28:40 +0530 Subject: [PATCH 3/9] switched to gson for json formatting --- .../apache/accumulo/server/util/ECAdmin.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index 181564aebeb..c7b5993567e 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -24,7 +24,7 @@ import java.util.Map; import org.apache.accumulo.core.compaction.thrift.CompactionCoordinatorService; -import org.apache.accumulo.core.compaction.thrift.TExternalCompactionList; +import org.apache.accumulo.core.compaction.thrift.TExternalCompactionMap; import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.metadata.schema.ExternalCompactionId; import org.apache.accumulo.core.rpc.ThriftUtil; @@ -32,7 +32,6 @@ import org.apache.accumulo.core.singletons.SingletonManager; import org.apache.accumulo.core.singletons.SingletonManager.Mode; import org.apache.accumulo.core.trace.TraceUtil; -import org.apache.accumulo.core.util.HostAndPort; import org.apache.accumulo.core.util.compaction.ExternalCompactionUtil; import org.apache.accumulo.core.util.compaction.RunningCompaction; import org.apache.accumulo.core.util.compaction.RunningCompactionInfo; @@ -45,9 +44,10 @@ import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.auto.service.AutoService; +import com.google.common.net.HostAndPort; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -166,7 +166,7 @@ private void listCompactorsByQueue(ServerContext context) { private void runningCompactions(ServerContext context, boolean details, String format) { CompactionCoordinatorService.Client coordinatorClient = null; - TExternalCompactionList running; + TExternalCompactionMap running; try { coordinatorClient = getCoordinatorClient(context); running = coordinatorClient.getRunningCompactions(TraceUtil.traceInfo(), context.rpcCreds()); @@ -195,7 +195,7 @@ private void runningCompactions(ServerContext context, boolean details, String f var runningCompaction = new RunningCompaction(ec); var addr = runningCompaction.getCompactorAddress(); var kind = runningCompaction.getJob().kind; - var group = runningCompaction.getQueueName(); + var group = runningCompaction.getGroupName(); var ke = KeyExtent.fromThrift(runningCompaction.getJob().extent); String tableId = ke.tableId().canonical(); @@ -255,9 +255,9 @@ private void runningCompactions(ServerContext context, boolean details, String f // Print JSON if ("json".equalsIgnoreCase(format)) { try { - System.out.println( - new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(jsonOutput)); - } catch (JsonProcessingException e) { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println(gson.toJson(jsonOutput)); + } catch (Exception e) { log.error("Error generating JSON output", e); } } From ec6ea822fb16b728614af1c17c97169ef7ad37ae Mon Sep 17 00:00:00 2001 From: suvrat1629 Date: Fri, 14 Feb 2025 11:24:07 +0530 Subject: [PATCH 4/9] reverted TExternalCompactionMap to TExternalCompactionList --- .../apache/accumulo/server/util/ECAdmin.java | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index c7b5993567e..d7f4fe0f0eb 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -19,12 +19,14 @@ package org.apache.accumulo.server.util; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.accumulo.core.compaction.thrift.CompactionCoordinatorService; -import org.apache.accumulo.core.compaction.thrift.TExternalCompactionMap; +import org.apache.accumulo.core.compaction.thrift.TExternalCompaction; +import org.apache.accumulo.core.compaction.thrift.TExternalCompactionList; import org.apache.accumulo.core.dataImpl.KeyExtent; import org.apache.accumulo.core.metadata.schema.ExternalCompactionId; import org.apache.accumulo.core.rpc.ThriftUtil; @@ -32,6 +34,7 @@ import org.apache.accumulo.core.singletons.SingletonManager; import org.apache.accumulo.core.singletons.SingletonManager.Mode; import org.apache.accumulo.core.trace.TraceUtil; +import org.apache.accumulo.core.util.HostAndPort; import org.apache.accumulo.core.util.compaction.ExternalCompactionUtil; import org.apache.accumulo.core.util.compaction.RunningCompaction; import org.apache.accumulo.core.util.compaction.RunningCompactionInfo; @@ -45,7 +48,6 @@ import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; import com.google.auto.service.AutoService; -import com.google.common.net.HostAndPort; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -166,17 +168,25 @@ private void listCompactorsByQueue(ServerContext context) { private void runningCompactions(ServerContext context, boolean details, String format) { CompactionCoordinatorService.Client coordinatorClient = null; - TExternalCompactionMap running; + Map runningCompactionsMap = new HashMap<>(); + try { coordinatorClient = getCoordinatorClient(context); - running = coordinatorClient.getRunningCompactions(TraceUtil.traceInfo(), context.rpcCreds()); - if (running == null || running.getCompactions() == null - || running.getCompactions().isEmpty()) { + + // Fetch running compactions as a list and convert to a map + TExternalCompactionList running = + coordinatorClient.getRunningCompactions(TraceUtil.traceInfo(), context.rpcCreds()); + + if (running == null || running.getCompactions().isEmpty()) { System.out.println("No running compactions found."); return; } - // Use StringBuilder for CSV + // Convert the list to a map + for (Map.Entry entry : running.getCompactions().entrySet()) { + runningCompactionsMap.put(entry.getKey(), entry.getValue()); + } + StringBuilder csvOutput = new StringBuilder(); List> jsonOutput = new ArrayList<>(); @@ -185,17 +195,21 @@ private void runningCompactions(ServerContext context, boolean details, String f "ECID,Compactor,Kind,Queue,TableId,Status,LastUpdate,Duration,NumFiles,Progress\n"); } - for (var entry : running.getCompactions().entrySet()) { - String ecid = entry.getKey(); - var ec = entry.getValue(); + for (Map.Entry entry : runningCompactionsMap.entrySet()) { + TExternalCompaction ec = entry.getValue(); if (ec == null) { continue; } var runningCompaction = new RunningCompaction(ec); + String ecid = runningCompaction.getJob().getExternalCompactionId(); var addr = runningCompaction.getCompactorAddress(); var kind = runningCompaction.getJob().kind; - var group = runningCompaction.getGroupName(); + + // Ensure getQueueName() exists, else use an alternative like getGroupName() + var queueName = runningCompaction.getQueueName(); // If this method does not exist, replace + // with getGroupName() + var ke = KeyExtent.fromThrift(runningCompaction.getJob().extent); String tableId = ke.tableId().canonical(); @@ -213,28 +227,25 @@ private void runningCompactions(ServerContext context, boolean details, String f 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); + System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, queueName, tableId); if (details) { System.out.format(" %s Last Update: %dms Duration: %dms Files: %d Progress: %.2f%%\n", 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)); + queueName, tableId, status, lastUpdate, duration, numFiles, progress)); } - // Handle JSON output if ("json".equalsIgnoreCase(format)) { - Map jsonEntry = new LinkedHashMap(); + Map jsonEntry = new LinkedHashMap<>(); jsonEntry.put("ecid", ecid); jsonEntry.put("compactor", addr); jsonEntry.put("kind", kind); - jsonEntry.put("queue", group); + jsonEntry.put("queue", queueName); jsonEntry.put("tableId", tableId); if (details) { jsonEntry.put("status", status); @@ -247,12 +258,10 @@ private void runningCompactions(ServerContext context, boolean details, String f } } - // Print CSV if ("csv".equalsIgnoreCase(format)) { System.out.print(csvOutput.toString()); } - // Print JSON if ("json".equalsIgnoreCase(format)) { try { Gson gson = new GsonBuilder().setPrettyPrinting().create(); From f562a0c1487257ab9dbd08b1e2268939b4b8618b Mon Sep 17 00:00:00 2001 From: suvrat1629 Date: Thu, 20 Feb 2025 20:12:27 +0530 Subject: [PATCH 5/9] added format validation and removed csv build up --- .../apache/accumulo/server/util/ECAdmin.java | 106 +++++++++--------- 1 file changed, 54 insertions(+), 52 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index d7f4fe0f0eb..bb63fd90878 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -18,11 +18,10 @@ */ package org.apache.accumulo.server.util; -import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.accumulo.core.compaction.thrift.CompactionCoordinatorService; import org.apache.accumulo.core.compaction.thrift.TExternalCompaction; @@ -170,6 +169,18 @@ private void runningCompactions(ServerContext context, boolean details, String f CompactionCoordinatorService.Client coordinatorClient = null; Map runningCompactionsMap = new HashMap<>(); + // Default to "plain" format if null or empty + if (format == null || format.trim().isEmpty()) { + format = "plain"; + } + + // Validate format + Set validFormats = Set.of("plain", "csv", "json"); + if (!validFormats.contains(format.toLowerCase())) { + throw new IllegalArgumentException( + "Invalid format: " + format + ". Expected: plain, csv, or json."); + } + try { coordinatorClient = getCoordinatorClient(context); @@ -187,12 +198,10 @@ private void runningCompactions(ServerContext context, boolean details, String f runningCompactionsMap.put(entry.getKey(), entry.getValue()); } - StringBuilder csvOutput = new StringBuilder(); - List> jsonOutput = new ArrayList<>(); - + // Print CSV header if format is CSV if ("csv".equalsIgnoreCase(format)) { - csvOutput.append( - "ECID,Compactor,Kind,Queue,TableId,Status,LastUpdate,Duration,NumFiles,Progress\n"); + System.out.println( + "ECID,Compactor,Kind,Queue,TableId,Status,LastUpdate,Duration,NumFiles,Progress"); } for (Map.Entry entry : runningCompactionsMap.entrySet()) { @@ -205,11 +214,7 @@ private void runningCompactions(ServerContext context, boolean details, String f String ecid = runningCompaction.getJob().getExternalCompactionId(); var addr = runningCompaction.getCompactorAddress(); var kind = runningCompaction.getJob().kind; - - // Ensure getQueueName() exists, else use an alternative like getGroupName() - var queueName = runningCompaction.getQueueName(); // If this method does not exist, replace - // with getGroupName() - + var queueName = runningCompaction.getQueueName(); var ke = KeyExtent.fromThrift(runningCompaction.getJob().extent); String tableId = ke.tableId().canonical(); @@ -227,49 +232,46 @@ private void runningCompactions(ServerContext context, boolean details, String f progress = runningCompactionInfo.progress; } - if ("plain".equalsIgnoreCase(format)) { - System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, queueName, tableId); - if (details) { - System.out.format(" %s Last Update: %dms Duration: %dms Files: %d Progress: %.2f%%\n", - status, lastUpdate, duration, numFiles, progress); - } - } - - if ("csv".equalsIgnoreCase(format)) { - csvOutput.append(String.format("%s,%s,%s,%s,%s,%s,%d,%d,%d,%.2f\n", ecid, addr, kind, - queueName, tableId, status, lastUpdate, duration, numFiles, progress)); - } - - if ("json".equalsIgnoreCase(format)) { - Map jsonEntry = new LinkedHashMap<>(); - jsonEntry.put("ecid", ecid); - jsonEntry.put("compactor", addr); - jsonEntry.put("kind", kind); - jsonEntry.put("queue", queueName); - 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); + // Output handling + switch (format.toLowerCase()) { + case "plain": + System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, queueName, tableId); + if (details) { + System.out.format( + " %s Last Update: %dms Duration: %dms Files: %d Progress: %.2f%%\n", status, + lastUpdate, duration, numFiles, progress); + } + break; + case "csv": + System.out.println(String.format("%s,%s,%s,%s,%s,%s,%d,%d,%d,%.2f", ecid, addr, kind, + queueName, tableId, status, lastUpdate, duration, numFiles, progress)); + break; + case "json": + // Print JSON entry-by-entry immediately + Map jsonEntry = new LinkedHashMap<>(); + jsonEntry.put("ecid", ecid); + jsonEntry.put("compactor", addr); + jsonEntry.put("kind", kind); + jsonEntry.put("queue", queueName); + 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); + } + + try { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println(gson.toJson(jsonEntry)); + } catch (Exception e) { + log.error("Error generating JSON output", e); + } + break; } } - if ("csv".equalsIgnoreCase(format)) { - System.out.print(csvOutput.toString()); - } - - 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); - } - } } catch (Exception e) { throw new IllegalStateException("Unable to get running compactions.", e); } finally { From e391cf0d9eb34839345e8958a8013dc51be4a38e Mon Sep 17 00:00:00 2001 From: Suvrat Acharya <140749446+Suvrat1629@users.noreply.github.com> Date: Thu, 20 Feb 2025 23:39:19 +0530 Subject: [PATCH 6/9] fixes format validation Co-authored-by: Dave Marion --- .../org/apache/accumulo/server/util/ECAdmin.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index bb63fd90878..78eeca4b17d 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -172,13 +172,13 @@ private void runningCompactions(ServerContext context, boolean details, String f // Default to "plain" format if null or empty if (format == null || format.trim().isEmpty()) { format = "plain"; - } - + } else { // Validate format - Set validFormats = Set.of("plain", "csv", "json"); - if (!validFormats.contains(format.toLowerCase())) { - throw new IllegalArgumentException( - "Invalid format: " + format + ". Expected: plain, csv, or json."); + Set validFormats = Set.of("plain", "csv", "json"); + if (!validFormats.contains(format.toLowerCase())) { + throw new IllegalArgumentException( + "Invalid format: " + format + ". Expected: plain, csv, or json."); + } } try { From fe616c40cdd6782668bd3838a24458ce729c5f5d Mon Sep 17 00:00:00 2001 From: suvrat1629 Date: Fri, 21 Feb 2025 00:21:37 +0530 Subject: [PATCH 7/9] json fix --- .../apache/accumulo/server/util/ECAdmin.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index 78eeca4b17d..ebca6eb558e 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -18,8 +18,10 @@ */ package org.apache.accumulo.server.util; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Set; @@ -193,12 +195,12 @@ private void runningCompactions(ServerContext context, boolean details, String f return; } - // Convert the list to a map for (Map.Entry entry : running.getCompactions().entrySet()) { runningCompactionsMap.put(entry.getKey(), entry.getValue()); } - // Print CSV header if format is CSV + List> jsonOutput = new ArrayList<>(); + if ("csv".equalsIgnoreCase(format)) { System.out.println( "ECID,Compactor,Kind,Queue,TableId,Status,LastUpdate,Duration,NumFiles,Progress"); @@ -232,7 +234,6 @@ private void runningCompactions(ServerContext context, boolean details, String f progress = runningCompactionInfo.progress; } - // Output handling switch (format.toLowerCase()) { case "plain": System.out.format("%s %s %s %s TableId: %s\n", ecid, addr, kind, queueName, tableId); @@ -243,11 +244,10 @@ private void runningCompactions(ServerContext context, boolean details, String f } break; case "csv": - System.out.println(String.format("%s,%s,%s,%s,%s,%s,%d,%d,%d,%.2f", ecid, addr, kind, - queueName, tableId, status, lastUpdate, duration, numFiles, progress)); + System.out.printf("%s,%s,%s,%s,%s,%s,%d,%d,%d,%.2f\n", ecid, addr, kind, queueName, + tableId, status, lastUpdate, duration, numFiles, progress); break; case "json": - // Print JSON entry-by-entry immediately Map jsonEntry = new LinkedHashMap<>(); jsonEntry.put("ecid", ecid); jsonEntry.put("compactor", addr); @@ -261,17 +261,21 @@ private void runningCompactions(ServerContext context, boolean details, String f jsonEntry.put("numFiles", numFiles); jsonEntry.put("progress", progress); } - - try { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - System.out.println(gson.toJson(jsonEntry)); - } catch (Exception e) { - log.error("Error generating JSON output", e); - } + jsonOutput.add(jsonEntry); break; } } + // ✅ Serialize entire JSON list at the end + 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); + } + } + } catch (Exception e) { throw new IllegalStateException("Unable to get running compactions.", e); } finally { From 5af65f83f952d4196aac04624f42f00faab50278 Mon Sep 17 00:00:00 2001 From: suvrat1629 Date: Fri, 21 Feb 2025 00:26:44 +0530 Subject: [PATCH 8/9] removed a comment :') --- .../src/main/java/org/apache/accumulo/server/util/ECAdmin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index ebca6eb558e..d10d17be3f2 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -266,7 +266,6 @@ private void runningCompactions(ServerContext context, boolean details, String f } } - // ✅ Serialize entire JSON list at the end if ("json".equalsIgnoreCase(format)) { try { Gson gson = new GsonBuilder().setPrettyPrinting().create(); From 7c28f1dc1d9d9c361e208f42905a4ab8f5909e1d Mon Sep 17 00:00:00 2001 From: suvrat1629 Date: Fri, 21 Feb 2025 10:18:11 +0530 Subject: [PATCH 9/9] formatting --- .../src/main/java/org/apache/accumulo/server/util/ECAdmin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java index d10d17be3f2..787534841c2 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/ECAdmin.java @@ -175,7 +175,7 @@ private void runningCompactions(ServerContext context, boolean details, String f if (format == null || format.trim().isEmpty()) { format = "plain"; } else { - // Validate format + // Validate format Set validFormats = Set.of("plain", "csv", "json"); if (!validFormats.contains(format.toLowerCase())) { throw new IllegalArgumentException(