From 3e07983ff7ba8553ad1f107a1b0fdf90497954ce Mon Sep 17 00:00:00 2001 From: arbaazkhan1 Date: Thu, 27 Aug 2026 19:13:29 -0400 Subject: [PATCH] made use of toMinimalString() to resolve Base64 encoding --- .../core/metadata/StoredTabletFile.java | 2 +- .../accumulo/shell/commands/ScanCommand.java | 54 ++++++++++++++++++- .../accumulo/test/util/FileMetadataUtil.java | 5 +- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java b/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java index b1f80ccd75a..537ffff1556 100644 --- a/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java +++ b/core/src/main/java/org/apache/accumulo/core/metadata/StoredTabletFile.java @@ -150,7 +150,7 @@ public int hashCode() { @Override public String toString() { - return metadataEntry; + return toMinimalString(); } public static StoredTabletFile of(final Text metadataEntry) { diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java index cfa5cae39f0..32d051d4545 100644 --- a/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java +++ b/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java @@ -21,6 +21,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map.Entry; @@ -40,7 +41,11 @@ import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.iterators.SortedKeyValueIterator; +import org.apache.accumulo.core.metadata.StoredTabletFile; +import org.apache.accumulo.core.metadata.SystemTables; +import org.apache.accumulo.core.metadata.schema.MetadataSchema; import org.apache.accumulo.core.security.Authorizations; +import org.apache.accumulo.core.util.format.DefaultFormatter; import org.apache.accumulo.core.util.format.Formatter; import org.apache.accumulo.core.util.format.FormatterConfig; import org.apache.accumulo.shell.Shell; @@ -75,6 +80,7 @@ public class ScanCommand extends Command { protected Option contextOpt; private Option executionHintsOpt; private Option scanServerOpt; + private Option decodeMetadataOpt; protected void setupSampling(final String tableName, final CommandLine cl, final Shell shellState, ScannerBase scanner) @@ -155,12 +161,54 @@ public int execute(final String fullCommand, final CommandLine cl, final Shell s Shell.log.error("Invalid length argument", iae); } } - printRecords(cl, shellState, config, scanner, formatter, printFile); + boolean decodeMetadata = cl.hasOption(decodeMetadataOpt.getLongOpt()) + && (tableName.equals(SystemTables.METADATA.tableName()) + || tableName.equals(SystemTables.ROOT.tableName())); + + if (decodeMetadata) { + printRecordsWithDecodedRanges(cl, shellState, config, scanner, printFile); + } else { + printRecords(cl, shellState, config, scanner, formatter, printFile); + } } return 0; } + private void printRecordsWithDecodedRanges(final CommandLine cl, final Shell shellState, + final FormatterConfig config, final Scanner scanner, final PrintFile printFile) + throws IOException { + + final Text fileCf = new Text(MetadataSchema.TabletsSection.DataFileColumnFamily.STR_NAME); + final Text scanCf = new Text(MetadataSchema.TabletsSection.ScanFileColumnFamily.STR_NAME); + + final List lines = new ArrayList<>(); + + for (Entry entry : scanner) { + Text cf = entry.getKey().getColumnFamily(); + + if (fileCf.equals(cf) || scanCf.equals(cf)) { + String metadataRow = entry.getKey().getRow().toString(); + String cq = entry.getKey().getColumnQualifier().toString(); + try { + StoredTabletFile stf = StoredTabletFile.of(cq); + lines.add(metadataRow + "\t" + stf.toMinimalString()); + } catch (RuntimeException e) { + lines.add(DefaultFormatter.formatEntry(entry, config)); + } + } else { + // All non-file columns (loc:, srv:, ~tab:, etc.) use normal formatting + lines.add(DefaultFormatter.formatEntry(entry, config)); + } + } + + if (printFile == null) { + shellState.printLines(lines.iterator(), !cl.hasOption(disablePaginationOpt.getOpt())); + } else { + shellState.printLines(lines.iterator(), false, printFile); + } + } + protected boolean getUseSample(CommandLine cl) { return cl.hasOption(sampleOpt.getLongOpt()); } @@ -352,6 +400,8 @@ public Options getOptions() { executionHintsOpt = new Option(null, "execution-hints", true, "Execution hints map"); scanServerOpt = new Option("cl", "consistency-level", true, "set consistency level (experimental)"); + decodeMetadataOpt = new Option("dm", "decode-metadata", false, + "Decode fenced file row ranges from metadata and root tables"); scanOptAuths.setArgName("comma-separated-authorizations"); scanOptRow.setArgName("row"); @@ -366,6 +416,7 @@ public Options getOptions() { contextOpt.setArgName("context"); executionHintsOpt.setArgName("={,=}"); scanServerOpt.setArgName("immediate|eventual"); + decodeMetadataOpt.setArgName("decode-metadata"); profileOpt = new Option("pn", "profile", true, "iterator profile name"); profileOpt.setArgName("profile"); @@ -398,6 +449,7 @@ public Options getOptions() { o.addOption(contextOpt); o.addOption(executionHintsOpt); o.addOption(scanServerOpt); + o.addOption(decodeMetadataOpt); return o; } diff --git a/test/src/main/java/org/apache/accumulo/test/util/FileMetadataUtil.java b/test/src/main/java/org/apache/accumulo/test/util/FileMetadataUtil.java index bfc39c9e36a..d7e55e88819 100644 --- a/test/src/main/java/org/apache/accumulo/test/util/FileMetadataUtil.java +++ b/test/src/main/java/org/apache/accumulo/test/util/FileMetadataUtil.java @@ -68,9 +68,8 @@ public class FileMetadataUtil { StoredTabletFile file = fileEntry.getKey(); DataFileValue dfv = fileEntry.getValue(); files.put(file, dfv); - log.debug("Extent: " + tabletMetadata.getExtent() + "; File Name: " + file.getFileName() - + "; Range: " + file.getRange() + "; Entries: " + dfv.getNumEntries() + ", Size: " - + dfv.getSize()); + log.debug("Extent: {}; File: {}; Entries: {}; Size: {}", tabletMetadata.getExtent(), file, + dfv.getNumEntries(), dfv.getSize()); i++; } }