diff --git a/checkstyle/import-control-core.xml b/checkstyle/import-control-core.xml
index bf06a19de34b7..48659867000f8 100644
--- a/checkstyle/import-control-core.xml
+++ b/checkstyle/import-control-core.xml
@@ -60,6 +60,9 @@
+
+
+
diff --git a/checkstyle/import-control.xml b/checkstyle/import-control.xml
index ddb13bc4d093c..8f17d5c55cc3d 100644
--- a/checkstyle/import-control.xml
+++ b/checkstyle/import-control.xml
@@ -229,6 +229,10 @@
+
+
+
+
diff --git a/core/src/main/scala/kafka/admin/ConsumerGroupCommand.scala b/core/src/main/scala/kafka/admin/ConsumerGroupCommand.scala
index d71f062e3b407..9e35ebcd9b0da 100755
--- a/core/src/main/scala/kafka/admin/ConsumerGroupCommand.scala
+++ b/core/src/main/scala/kafka/admin/ConsumerGroupCommand.scala
@@ -529,8 +529,8 @@ object ConsumerGroupCommand extends Logging {
case "Empty" | "Dead" =>
val partitionsToReset = getPartitionsToReset(groupId)
val preparedOffsets = prepareOffsetsToReset(groupId, partitionsToReset)
- val execute = opts.options.has(opts.executeOpt)
- if (execute)
+ val dryRun = opts.options.has(opts.dryRunOpt)
+ if (!dryRun)
getConsumer().commitSync(preparedOffsets.asJava)
preparedOffsets
case currentState =>
@@ -727,7 +727,7 @@ object ConsumerGroupCommand extends Logging {
"Has 3 execution options: (default) to plan which offsets to reset, --execute to execute the reset-offsets process, and --export to export the results to a CSV format." + nl +
"Has the following scenarios to choose: --to-datetime, --by-period, --to-earliest, --to-latest, --shift-by, --from-file, --to-current. One scenario must be choose" + nl +
"To define the scope use: --all-topics or --topic. . One scope must be choose, unless you use '--from-file' scenario"
- val ExecuteDoc = "Execute operation. Supported operations: reset-offsets."
+ val DryRunDoc = "Only show results without executing changes on Consumer Groups. Supported operations: reset-offsets."
val ExportDoc = "Export operation execution to a CSV file. Supported operations: reset-offsets."
val ResetToOffsetDoc = "Reset offsets to a specific offset."
val ResetFromFileDoc = "Reset offsets to values defined in CSV file."
@@ -770,7 +770,7 @@ object ConsumerGroupCommand extends Logging {
.describedAs("command config property file")
.ofType(classOf[String])
val resetOffsetsOpt = parser.accepts("reset-offsets", ResetOffsetsDoc)
- val executeOpt = parser.accepts("execute", ExecuteDoc)
+ val dryRunOpt = parser.accepts("dry-run", DryRunDoc)
val exportOpt = parser.accepts("export", ExportDoc)
val resetToOffsetOpt = parser.accepts("to-offset", ResetToOffsetDoc)
.withRequiredArg()
diff --git a/core/src/main/scala/kafka/tools/StreamsResetter.java b/core/src/main/scala/kafka/tools/StreamsResetter.java
index 55392588bb9c8..4851a948399b9 100644
--- a/core/src/main/scala/kafka/tools/StreamsResetter.java
+++ b/core/src/main/scala/kafka/tools/StreamsResetter.java
@@ -21,11 +21,14 @@
import joptsimple.OptionSet;
import joptsimple.OptionSpec;
import joptsimple.OptionSpecBuilder;
+import kafka.utils.CommandLineUtils;
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.DeleteTopicsResult;
import org.apache.kafka.clients.admin.KafkaAdminClient;
+import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.clients.consumer.OffsetAndTimestamp;
import org.apache.kafka.common.KafkaFuture;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.annotation.InterfaceStability;
@@ -33,8 +36,14 @@
import org.apache.kafka.common.utils.Exit;
import org.apache.kafka.common.utils.Utils;
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.Duration;
import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
@@ -74,12 +83,19 @@ public class StreamsResetter {
private static OptionSpec applicationIdOption;
private static OptionSpec inputTopicsOption;
private static OptionSpec intermediateTopicsOption;
+ private static OptionSpec toOffsetOption;
+ private static OptionSpec toDatetimeOption;
+ private static OptionSpec byDurationOption;
+ private static OptionSpecBuilder toEarliestOption;
+ private static OptionSpecBuilder toLatestOption;
+ private static OptionSpec fromFileOption;
+ private static OptionSpec shiftByOption;
private static OptionSpecBuilder dryRunOption;
private static OptionSpec commandConfigOption;
private OptionSet options = null;
private final List allTopics = new LinkedList<>();
- private boolean dryRun = false;
+
public int run(final String[] args) {
return run(args, new Properties());
@@ -93,7 +109,7 @@ public int run(final String[] args,
try {
parseArguments(args);
- dryRun = options.has(dryRunOption);
+ final boolean dryRun = options.has(dryRunOption);
final String groupId = options.valueOf(applicationIdOption);
final Properties properties = new Properties();
@@ -114,8 +130,8 @@ public int run(final String[] args,
final HashMap