diff --git a/management-api-agent-common/src/main/java/com/datastax/mgmtapi/NodeOpsProvider.java b/management-api-agent-common/src/main/java/com/datastax/mgmtapi/NodeOpsProvider.java index ad801e89..4f39abaa 100644 --- a/management-api-agent-common/src/main/java/com/datastax/mgmtapi/NodeOpsProvider.java +++ b/management-api-agent-common/src/main/java/com/datastax/mgmtapi/NodeOpsProvider.java @@ -5,6 +5,7 @@ */ package com.datastax.mgmtapi; +import com.datastax.mgmtapi.models.RingRange; import com.datastax.mgmtapi.rpc.Rpc; import com.datastax.mgmtapi.rpc.RpcParam; import com.datastax.mgmtapi.rpc.RpcRegistry; @@ -734,6 +735,8 @@ public void clearSnapshots( } } + // This version of repair takes beginToken and endToken, which does not allow for non-contiguous ranges to be repaired under + // a single run. @Rpc(name = "repair") public void repair( @RpcParam(name = "keyspaceName") String keyspace, @@ -743,29 +746,56 @@ public void repair( @RpcParam(name = "endToken") BigInteger endToken, @RpcParam(name = "repairParallelism") RepairParallelism repairParallelism, @RpcParam(name = "datacenters") Collection datacenters, + @RpcParam(name = "repairThreadCount") int repairThreadCount) + throws IOException { + // At least one keyspace is required + assert(keyspace != null); + Map options = new HashMap<>(); + options.put(RepairOption.PARALLELISM_KEY, repairParallelism.getName()); + options.put(RepairOption.INCREMENTAL_KEY, Boolean.toString(!full)); + options.put( + RepairOption.JOB_THREADS_KEY, + Integer.toString(repairThreadCount == 0 ? 1 : repairThreadCount)); + options.put(RepairOption.TRACE_KEY, Boolean.toString(Boolean.FALSE)); + options.put(RepairOption.COLUMNFAMILIES_KEY, StringUtils.join(tables, ",")); + if (full) { + options.put( + RepairOption.RANGES_KEY, StringUtils.join(beginToken + ":" + endToken) + ); + } + + } + + // This version of repair() takes a list of RingRange objects instead of begin/end tokens. + @Rpc(name = "repair") + public void repair( + @RpcParam(name = "keyspaceName") String keyspace, + @RpcParam(name = "tables") List tables, + @RpcParam(name = "full") Boolean full, + @RpcParam(name = "repairParallelism") RepairParallelism repairParallelism, + @RpcParam(name = "datacenters") Collection datacenters, @RpcParam(name = "associatedTokens") List associatedTokens, @RpcParam(name = "repairThreadCount") int repairThreadCount) throws IOException { // At least one keyspace is required - if (keyspace != null) { - Map options = new HashMap<>(); - options.put(RepairOption.PARALLELISM_KEY, repairParallelism.getName()); - options.put(RepairOption.INCREMENTAL_KEY, Boolean.toString(!full)); + assert(keyspace != null); + Map options = new HashMap<>(); + options.put(RepairOption.PARALLELISM_KEY, repairParallelism.getName()); + options.put(RepairOption.INCREMENTAL_KEY, Boolean.toString(!full)); + options.put( + RepairOption.JOB_THREADS_KEY, + Integer.toString(repairThreadCount == 0 ? 1 : repairThreadCount)); + options.put(RepairOption.TRACE_KEY, Boolean.toString(Boolean.FALSE)); + options.put(RepairOption.COLUMNFAMILIES_KEY, StringUtils.join(tables, ",")); + if (full) { options.put( - RepairOption.JOB_THREADS_KEY, - Integer.toString(repairThreadCount == 0 ? 1 : repairThreadCount)); - options.put(RepairOption.TRACE_KEY, Boolean.toString(Boolean.FALSE)); - options.put(RepairOption.COLUMNFAMILIES_KEY, StringUtils.join(tables, ",")); - if (full) { - options.put( - RepairOption.RANGES_KEY, - StringUtils.join( - associatedTokens - .stream() - .map(token -> token.getStart() + ":" + token.getEnd()) - .collect(Collectors.toList()), - ",")); - } + RepairOption.RANGES_KEY, + StringUtils.join( + associatedTokens + .stream() + .map(token -> token.getStart() + ":" + token.getEnd()) + .collect(Collectors.toList()), + ",")); } } diff --git a/management-api-agent-common/src/main/java/com/datastax/mgmtapi/models/RingRange.java b/management-api-agent-common/src/main/java/com/datastax/mgmtapi/models/RingRange.java new file mode 100644 index 00000000..d8971a45 --- /dev/null +++ b/management-api-agent-common/src/main/java/com/datastax/mgmtapi/models/RingRange.java @@ -0,0 +1,37 @@ +/* + * Copyright DataStax, Inc. + * + * Please see the included license file for details. + */ +package com.datastax.mgmtapi.models; + +import java.math.BigInteger; +import java.util.Comparator; + +public final class RingRange { + + public static final Comparator START_COMPARATOR + = (RingRange o1, RingRange o2) -> o1.start.compareTo(o2.start); + + private final BigInteger start; + private final BigInteger end; + + public RingRange(BigInteger start, BigInteger end) { + this.start = start; + this.end = end; + } + + public RingRange(String... range) { + start = new BigInteger(range[0]); + end = new BigInteger(range[1]); + } + + public BigInteger getStart() { + return start; + } + + public BigInteger getEnd() { + return end; + } + +} \ No newline at end of file