Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
ef07f83
Add initial running status command
errose28 Feb 8, 2025
c430fdc
Add inital untested stdin/container list support
errose28 Feb 8, 2025
7e2b27a
Minor fixes and handle failures triggering reconcile for list
errose28 Feb 10, 2025
9f037c7
Initial test cases
errose28 Feb 12, 2025
b0d5a91
WIP test updates
errose28 Feb 19, 2025
eb9c92a
Basic test passes
errose28 Feb 20, 2025
7a0fefe
Set up tests to read from args and stdin and stub out all cases
errose28 Feb 20, 2025
fe9dd21
Checkstyle
errose28 Feb 21, 2025
9ba8efd
Fix findbugs and rat
errose28 Feb 21, 2025
d98bd25
Merge branch 'HDDS-10239-container-reconciliation' into HDDS-12078-im…
errose28 Feb 21, 2025
02b7dd4
Remove unused visible for testing
errose28 Feb 21, 2025
e026721
Add new line after array
errose28 Feb 24, 2025
4a2347c
Merge branch 'master' into HDDS-12078-improve-cli
errose28 Jul 24, 2025
9de2943
Use common mixin for container ID list
errose28 Jul 24, 2025
b487bd7
Merge branch 'HDDS-12078-improve-cli-ai' into HDDS-12078-improve-cli
errose28 Jul 29, 2025
bc6bab2
Test and CLI additions
errose28 Jul 29, 2025
25c1b55
Add type validation to ItemsFromStdin
errose28 Jul 29, 2025
10f156b
Fix stream reset
errose28 Jul 29, 2025
d56700b
Revert "Add type validation to ItemsFromStdin"
errose28 Jul 30, 2025
08ea893
Add validation method to containerIDParameters, split tests
errose28 Jul 30, 2025
24df64a
Condense output checks
errose28 Jul 30, 2025
e218381
All tests pass
errose28 Jul 30, 2025
b35faa6
Add more testing, all pass
errose28 Jul 30, 2025
bc10ab6
Checkstyle
errose28 Jul 30, 2025
f180e6f
Use --status flag in acceptance tests
errose28 Aug 7, 2025
f7705ab
Fix error messages
errose28 Aug 12, 2025
d6eeedb
Merge branch 'master' into HDDS-12078-improve-cli
errose28 Aug 12, 2025
66eaf34
Add IP address to output and assert number of DN fields output
errose28 Aug 12, 2025
503ff29
Raise error for checking status of open containers and add tests for …
errose28 Aug 13, 2025
d4a8385
Remove cursor's made up CLI flags
errose28 Aug 14, 2025
6819118
Checking status of open container should fail
errose28 Aug 15, 2025
2638e4f
Merge branch 'master' into HDDS-12078-improve-cli
errose28 Aug 15, 2025
a208a49
Fix robot jq and status newline placement
errose28 Aug 15, 2025
223956f
Fix numerous output issues, update tests
errose28 Aug 18, 2025
7bb61b2
Add TODOs to migrate related container CLIs to use new helper methods
errose28 Aug 18, 2025
d8fd3aa
PMD
errose28 Aug 18, 2025
36186ed
Fix javadoc warning
errose28 Aug 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,11 @@

package org.apache.hadoop.hdds.scm.container;

import static org.apache.hadoop.hdds.HddsUtils.checksumToString;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
import java.util.UUID;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.server.JsonUtils;

/**
* Class which stores ContainerReplica details on the client.
Expand All @@ -41,7 +36,7 @@ public final class ContainerReplicaInfo {
private long keyCount;
private long bytesUsed;
private int replicaIndex = -1;
@JsonSerialize(using = LongToHexJsonSerializer.class)
@JsonSerialize(using = JsonUtils.ChecksumSerializer.class)
private long dataChecksum;

public static ContainerReplicaInfo fromProto(
Expand Down Expand Up @@ -100,13 +95,6 @@ public long getDataChecksum() {
return dataChecksum;
}

private static class LongToHexJsonSerializer extends JsonSerializer<Long> {
@Override
public void serialize(Long value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(checksumToString(value));
}
}

/**
* Builder for ContainerReplicaInfo class.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,26 @@
package org.apache.hadoop.hdds.server;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SequenceWriter;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Reader;
import java.util.List;
import org.apache.hadoop.hdds.HddsUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -76,6 +81,23 @@ public static String toJsonString(Object obj) throws IOException {
return MAPPER.writeValueAsString(obj);
}

/**
* Returns a {@link SequenceWriter} that will write to and close the provided output stream when it is closed.
* If the sequence is being written to stdout and more stdout output is needed later, use
* {@link #getStdoutSequenceWriter} instead.
*/
public static SequenceWriter getSequenceWriter(OutputStream stream) throws IOException {
return WRITER.writeValuesAsArray(stream);
}

/**
* Returns a {@link SequenceWriter} that will write to stdout but not close stdout for more output once the sequence
* writer is closed.
*/
public static SequenceWriter getStdoutSequenceWriter() throws IOException {
return getSequenceWriter(new NonClosingOutputStream(System.out));
}

public static String toJsonStringWIthIndent(Object obj) {
try {
return INDENT_OUTPUT_MAPPER.writeValueAsString(obj);
Expand Down Expand Up @@ -107,6 +129,10 @@ public static <T> T readFromReader(Reader reader, Class<T> valueType) throws IOE
return MAPPER.readValue(reader, valueType);
}

public static ObjectMapper getDefaultMapper() {
return MAPPER;
}

/**
* Utility to sequentially write a large collection of items to a file.
*/
Expand All @@ -132,4 +158,47 @@ public static <T> List<T> readFromFile(File file, Class<T> itemType)
}
}

/**
* Serializes a checksum stored as a long into its json string representation.
*/
public static class ChecksumSerializer extends JsonSerializer<Long> {
@Override
public void serialize(Long value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(HddsUtils.checksumToString(value));
}
}

private static class NonClosingOutputStream extends OutputStream {

private final OutputStream delegate;

NonClosingOutputStream(OutputStream delegate) {
this.delegate = delegate;
}

@Override
public void write(int b) throws IOException {
delegate.write(b);
}

@Override
public void write(byte[] b) throws IOException {
delegate.write(b);
}

@Override
public void write(byte[] b, int off, int len) throws IOException {
delegate.write(b, off, len);
}

@Override
public void flush() throws IOException {
delegate.flush();
}

@Override
public void close() {
// Ignore close to keep the underlying stream open
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package org.apache.hadoop.hdds.scm.cli.container;

import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.hdds.cli.ItemsFromStdin;
import picocli.CommandLine;
Expand All @@ -25,10 +26,42 @@
@CommandLine.Command
public class ContainerIDParameters extends ItemsFromStdin {

@CommandLine.Spec
private CommandLine.Model.CommandSpec spec;

@CommandLine.Parameters(description = "Container IDs" + FORMAT_DESCRIPTION,
arity = "1..*",
paramLabel = "<container ID>")
public void setContainerIDs(List<String> arguments) {
setItems(arguments);
}

public List<Long> getValidatedIDs() {
List<Long> containerIDs = new ArrayList<>(size());
List<String> invalidIDs = new ArrayList<>();

for (String input: this) {
boolean idValid = true;
try {
long id = Long.parseLong(input);
if (id <= 0) {
idValid = false;
} else {
containerIDs.add(id);
}
} catch (NumberFormatException e) {
idValid = false;
}

if (!idValid) {
invalidIDs.add(input);
}
}

if (!invalidIDs.isEmpty()) {
throw new CommandLine.ParameterException(spec.commandLine(),
"Container IDs must be positive integers. Invalid container IDs: " + String.join(" ", invalidIDs));
}
return containerIDs;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ public void execute(ScmClient scmClient) throws IOException {
multiContainer = containerList.size() > 1;

printHeader();
// TODO HDDS-13592: Use ContainerIDParameters#getValidatedIDs to automatically handle type conversion and fail fast.
for (String id : containerList) {
printOutput(scmClient, id, first);
first = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ private void listAllContainers(ScmClient scmClient, SequenceWriter writer,
} while (fetchedCount > 0);
}

// TODO HDDS-13593 Remove this in favor of JsonUtils#getStdoutSequenceWriter.
private static class NonClosingOutputStream extends OutputStream {

private final OutputStream delegate;
Expand Down
Loading