getDataSources()
{
diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/compact/InlineCompactionJobTemplate.java b/indexing-service/src/main/java/org/apache/druid/indexing/compact/InlineCompactionJobTemplate.java
new file mode 100644
index 000000000000..c147fde4f9f2
--- /dev/null
+++ b/indexing-service/src/main/java/org/apache/druid/indexing/compact/InlineCompactionJobTemplate.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.indexing.compact;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.druid.data.input.InputSource;
+import org.apache.druid.data.output.OutputDestination;
+import org.apache.druid.java.util.common.granularity.Granularity;
+import org.apache.druid.server.coordinator.InlineSchemaDataSourceCompactionConfig;
+import org.apache.druid.server.coordinator.UserCompactionTaskGranularityConfig;
+import org.apache.druid.server.coordinator.UserCompactionTaskQueryTuningConfig;
+import org.joda.time.Period;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Template to create compaction jobs using inline specifications. This template
+ * does not fetch any information from the Druid catalog while creating jobs.
+ *
+ * This template does not contain all the fields supported by
+ * {@link InlineSchemaDataSourceCompactionConfig} since some of those fields may
+ * change the data itself (and not just its layout) and are thus not considered
+ * compaction-compatible.
+ */
+public class InlineCompactionJobTemplate extends CompactionJobTemplate
+{
+ public static final String TYPE = "compactInline";
+
+ private final UserCompactionTaskQueryTuningConfig tuningConfig;
+ private final Granularity segmentGranularity;
+
+ @JsonCreator
+ public InlineCompactionJobTemplate(
+ @JsonProperty("tuningConfig") UserCompactionTaskQueryTuningConfig tuningConfig,
+ @JsonProperty("segmentGranularity") Granularity segmentGranularity
+ )
+ {
+ this.tuningConfig = tuningConfig;
+ this.segmentGranularity = segmentGranularity;
+ }
+
+ @JsonProperty
+ public Granularity getSegmentGranularity()
+ {
+ return segmentGranularity;
+ }
+
+ @JsonProperty
+ public UserCompactionTaskQueryTuningConfig getTuningConfig()
+ {
+ return tuningConfig;
+ }
+
+ @Override
+ public List createCompactionJobs(
+ InputSource source,
+ OutputDestination destination,
+ CompactionJobParams jobParams
+ )
+ {
+ final String dataSource = ensureDruidInputSource(source).getDataSource();
+ return new CompactionConfigBasedJobTemplate(
+ InlineSchemaDataSourceCompactionConfig
+ .builder()
+ .forDataSource(dataSource)
+ .withSkipOffsetFromLatest(Period.ZERO)
+ .withTuningConfig(tuningConfig)
+ .withGranularitySpec(new UserCompactionTaskGranularityConfig(segmentGranularity, null, null))
+ .build()
+ ).createCompactionJobs(source, destination, jobParams);
+ }
+
+ @Override
+ public boolean equals(Object object)
+ {
+ if (this == object) {
+ return true;
+ }
+ if (object == null || getClass() != object.getClass()) {
+ return false;
+ }
+ InlineCompactionJobTemplate that = (InlineCompactionJobTemplate) object;
+ return Objects.equals(this.tuningConfig, that.tuningConfig)
+ && Objects.equals(this.segmentGranularity, that.segmentGranularity);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return Objects.hash(tuningConfig, segmentGranularity);
+ }
+
+ @Override
+ public String getType()
+ {
+ return TYPE;
+ }
+}
diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/compact/LocalOverlordClient.java b/indexing-service/src/main/java/org/apache/druid/indexing/compact/LocalOverlordClient.java
index 3f1427c7c34e..eb200577bb8b 100644
--- a/indexing-service/src/main/java/org/apache/druid/indexing/compact/LocalOverlordClient.java
+++ b/indexing-service/src/main/java/org/apache/druid/indexing/compact/LocalOverlordClient.java
@@ -72,10 +72,12 @@ class LocalOverlordClient extends NoopOverlordClient
@Override
public ListenableFuture runTask(String taskId, Object clientTaskQuery)
{
+ final CompactionTask task =
+ clientTaskQuery instanceof CompactionTask
+ ? (CompactionTask) clientTaskQuery
+ : convertTask(clientTaskQuery, ClientCompactionTaskQuery.class, CompactionTask.class);
return futureOf(() -> {
- getValidTaskQueue().add(
- convertTask(clientTaskQuery, ClientCompactionTaskQuery.class, CompactionTask.class)
- );
+ getValidTaskQueue().add(task);
return null;
});
}
diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java b/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java
index 95ea3d116939..9896db489264 100644
--- a/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java
+++ b/indexing-service/src/main/java/org/apache/druid/indexing/compact/OverlordCompactionScheduler.java
@@ -27,6 +27,8 @@
import org.apache.druid.client.indexing.ClientCompactionRunnerInfo;
import org.apache.druid.indexer.TaskLocation;
import org.apache.druid.indexer.TaskStatus;
+import org.apache.druid.indexing.common.actions.TaskActionClientFactory;
+import org.apache.druid.indexing.overlord.GlobalTaskLockbox;
import org.apache.druid.indexing.overlord.TaskMaster;
import org.apache.druid.indexing.overlord.TaskQueryTool;
import org.apache.druid.indexing.overlord.TaskRunner;
@@ -52,17 +54,19 @@
import org.apache.druid.server.coordinator.duty.CompactSegments;
import org.apache.druid.server.coordinator.stats.CoordinatorRunStats;
import org.apache.druid.server.coordinator.stats.CoordinatorStat;
-import org.apache.druid.server.coordinator.stats.Dimension;
+import org.apache.druid.server.coordinator.stats.RowKey;
import org.apache.druid.server.coordinator.stats.Stats;
import org.joda.time.Duration;
-import java.util.ArrayList;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
/**
* Implementation of {@link CompactionScheduler}.
@@ -87,10 +91,13 @@ public class OverlordCompactionScheduler implements CompactionScheduler
private final SegmentsMetadataManager segmentManager;
private final LocalOverlordClient overlordClient;
private final ServiceEmitter emitter;
+ private final ObjectMapper objectMapper;
private final TaskMaster taskMaster;
private final Supplier compactionConfigSupplier;
- private final ConcurrentHashMap activeDatasourceConfigs;
+ private final ConcurrentHashMap activeSupervisors;
+
+ private final AtomicReference