mirror of https://github.com/apache/druid.git
Configurability of recency threshold
This commit is contained in:
parent
4a8140be81
commit
600dc7546f
|
@ -0,0 +1,27 @@
|
||||||
|
package io.druid.indexing.common.config;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import org.joda.time.Duration;
|
||||||
|
import org.joda.time.Period;
|
||||||
|
|
||||||
|
public class TaskStorageConfig
|
||||||
|
{
|
||||||
|
@JsonProperty
|
||||||
|
private final Duration recentlyFinishedThreshold;
|
||||||
|
|
||||||
|
@JsonCreator
|
||||||
|
public TaskStorageConfig(
|
||||||
|
@JsonProperty("recentlyFinishedThreshold") final Period recentlyFinishedThreshold
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.recentlyFinishedThreshold = recentlyFinishedThreshold == null
|
||||||
|
? new Period("PT24H").toStandardDuration()
|
||||||
|
: recentlyFinishedThreshold.toStandardDuration();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Duration getRecentlyFinishedThreshold()
|
||||||
|
{
|
||||||
|
return recentlyFinishedThreshold;
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,6 +40,7 @@ import io.druid.db.DbTablesConfig;
|
||||||
import io.druid.indexing.common.TaskLock;
|
import io.druid.indexing.common.TaskLock;
|
||||||
import io.druid.indexing.common.TaskStatus;
|
import io.druid.indexing.common.TaskStatus;
|
||||||
import io.druid.indexing.common.actions.TaskAction;
|
import io.druid.indexing.common.actions.TaskAction;
|
||||||
|
import io.druid.indexing.common.config.TaskStorageConfig;
|
||||||
import io.druid.indexing.common.task.Task;
|
import io.druid.indexing.common.task.Task;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.Period;
|
import org.joda.time.Period;
|
||||||
|
@ -64,17 +65,24 @@ public class DbTaskStorage implements TaskStorage
|
||||||
private final DbConnector dbConnector;
|
private final DbConnector dbConnector;
|
||||||
private final DbTablesConfig dbTables;
|
private final DbTablesConfig dbTables;
|
||||||
private final IDBI dbi;
|
private final IDBI dbi;
|
||||||
|
private final TaskStorageConfig config;
|
||||||
|
|
||||||
private static final long RECENCY_THRESHOLD = new Period("PT24H").toStandardDuration().getMillis();
|
|
||||||
private static final EmittingLogger log = new EmittingLogger(DbTaskStorage.class);
|
private static final EmittingLogger log = new EmittingLogger(DbTaskStorage.class);
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public DbTaskStorage(ObjectMapper jsonMapper, DbConnector dbConnector, DbTablesConfig dbTables, IDBI dbi)
|
public DbTaskStorage(
|
||||||
|
final ObjectMapper jsonMapper,
|
||||||
|
final DbConnector dbConnector,
|
||||||
|
final DbTablesConfig dbTables,
|
||||||
|
final IDBI dbi,
|
||||||
|
final TaskStorageConfig config
|
||||||
|
)
|
||||||
{
|
{
|
||||||
this.jsonMapper = jsonMapper;
|
this.jsonMapper = jsonMapper;
|
||||||
this.dbConnector = dbConnector;
|
this.dbConnector = dbConnector;
|
||||||
this.dbTables = dbTables;
|
this.dbTables = dbTables;
|
||||||
this.dbi = dbi;
|
this.dbi = dbi;
|
||||||
|
this.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
@LifecycleStart
|
@LifecycleStart
|
||||||
|
@ -275,7 +283,7 @@ public class DbTaskStorage implements TaskStorage
|
||||||
@Override
|
@Override
|
||||||
public List<TaskStatus> getRecentlyFinishedTaskStatuses()
|
public List<TaskStatus> getRecentlyFinishedTaskStatuses()
|
||||||
{
|
{
|
||||||
final DateTime recent = new DateTime().minus(RECENCY_THRESHOLD);
|
final DateTime recent = new DateTime().minus(config.getRecentlyFinishedThreshold());
|
||||||
return retryingHandle(
|
return retryingHandle(
|
||||||
new HandleCallback<List<TaskStatus>>()
|
new HandleCallback<List<TaskStatus>>()
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,15 +28,15 @@ import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.common.collect.Ordering;
|
import com.google.common.collect.Ordering;
|
||||||
|
import com.google.inject.Inject;
|
||||||
import com.metamx.common.logger.Logger;
|
import com.metamx.common.logger.Logger;
|
||||||
import io.druid.indexing.common.TaskLock;
|
import io.druid.indexing.common.TaskLock;
|
||||||
import io.druid.indexing.common.TaskStatus;
|
import io.druid.indexing.common.TaskStatus;
|
||||||
import io.druid.indexing.common.actions.TaskAction;
|
import io.druid.indexing.common.actions.TaskAction;
|
||||||
|
import io.druid.indexing.common.config.TaskStorageConfig;
|
||||||
import io.druid.indexing.common.task.Task;
|
import io.druid.indexing.common.task.Task;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.Period;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
@ -47,14 +47,21 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||||
*/
|
*/
|
||||||
public class HeapMemoryTaskStorage implements TaskStorage
|
public class HeapMemoryTaskStorage implements TaskStorage
|
||||||
{
|
{
|
||||||
|
private final TaskStorageConfig config;
|
||||||
|
|
||||||
private final ReentrantLock giant = new ReentrantLock();
|
private final ReentrantLock giant = new ReentrantLock();
|
||||||
private final Map<String, TaskStuff> tasks = Maps.newHashMap();
|
private final Map<String, TaskStuff> tasks = Maps.newHashMap();
|
||||||
private final Multimap<String, TaskLock> taskLocks = HashMultimap.create();
|
private final Multimap<String, TaskLock> taskLocks = HashMultimap.create();
|
||||||
private final Multimap<String, TaskAction> taskActions = ArrayListMultimap.create();
|
private final Multimap<String, TaskAction> taskActions = ArrayListMultimap.create();
|
||||||
|
|
||||||
private static final long RECENCY_THRESHOLD = new Period("PT24H").toStandardDuration().getMillis();
|
|
||||||
private static final Logger log = new Logger(HeapMemoryTaskStorage.class);
|
private static final Logger log = new Logger(HeapMemoryTaskStorage.class);
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public HeapMemoryTaskStorage(TaskStorageConfig config)
|
||||||
|
{
|
||||||
|
this.config = config;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void insert(Task task, TaskStatus status)
|
public void insert(Task task, TaskStatus status)
|
||||||
{
|
{
|
||||||
|
@ -158,7 +165,7 @@ public class HeapMemoryTaskStorage implements TaskStorage
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final List<TaskStatus> returns = Lists.newArrayList();
|
final List<TaskStatus> returns = Lists.newArrayList();
|
||||||
final long recent = System.currentTimeMillis() - RECENCY_THRESHOLD;
|
final long recent = System.currentTimeMillis() - config.getRecentlyFinishedThreshold().getMillis();
|
||||||
final Ordering<TaskStuff> createdDateDesc = new Ordering<TaskStuff>()
|
final Ordering<TaskStuff> createdDateDesc = new Ordering<TaskStuff>()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -368,20 +368,13 @@ public class OverlordResource
|
||||||
@Produces("application/json")
|
@Produces("application/json")
|
||||||
public Response getScalingState()
|
public Response getScalingState()
|
||||||
{
|
{
|
||||||
if (!taskMaster.getResourceManagementScheduler().isPresent()) {
|
// Don't use asLeaderWith, since we want to return 200 instead of 503 when missing an autoscaler.
|
||||||
|
final Optional<ResourceManagementScheduler> rms = taskMaster.getResourceManagementScheduler();
|
||||||
|
if (rms.isPresent()) {
|
||||||
|
return Response.ok(rms.get().getStats()).build();
|
||||||
|
} else {
|
||||||
return Response.ok().build();
|
return Response.ok().build();
|
||||||
}
|
}
|
||||||
return asLeaderWith(
|
|
||||||
taskMaster.getResourceManagementScheduler(),
|
|
||||||
new Function<ResourceManagementScheduler, Response>()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public Response apply(ResourceManagementScheduler resourceManagementScheduler)
|
|
||||||
{
|
|
||||||
return Response.ok(resourceManagementScheduler.getStats()).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
|
|
@ -54,6 +54,7 @@ import io.druid.indexing.common.actions.SegmentInsertAction;
|
||||||
import io.druid.indexing.common.actions.TaskActionClientFactory;
|
import io.druid.indexing.common.actions.TaskActionClientFactory;
|
||||||
import io.druid.indexing.common.actions.TaskActionToolbox;
|
import io.druid.indexing.common.actions.TaskActionToolbox;
|
||||||
import io.druid.indexing.common.config.TaskConfig;
|
import io.druid.indexing.common.config.TaskConfig;
|
||||||
|
import io.druid.indexing.common.config.TaskStorageConfig;
|
||||||
import io.druid.indexing.common.task.AbstractFixedIntervalTask;
|
import io.druid.indexing.common.task.AbstractFixedIntervalTask;
|
||||||
import io.druid.indexing.common.task.IndexTask;
|
import io.druid.indexing.common.task.IndexTask;
|
||||||
import io.druid.indexing.common.task.KillTask;
|
import io.druid.indexing.common.task.KillTask;
|
||||||
|
@ -75,7 +76,9 @@ import io.druid.timeline.DataSegment;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.easymock.EasyMock;
|
import org.easymock.EasyMock;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
import org.joda.time.Duration;
|
||||||
import org.joda.time.Interval;
|
import org.joda.time.Interval;
|
||||||
|
import org.joda.time.Period;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
@ -120,7 +123,11 @@ public class TaskLifecycleTest
|
||||||
"{\"startDelay\":\"PT0S\", \"restartDelay\":\"PT1S\"}",
|
"{\"startDelay\":\"PT0S\", \"restartDelay\":\"PT1S\"}",
|
||||||
TaskQueueConfig.class
|
TaskQueueConfig.class
|
||||||
);
|
);
|
||||||
ts = new HeapMemoryTaskStorage();
|
ts = new HeapMemoryTaskStorage(
|
||||||
|
new TaskStorageConfig(new Period("PT24H"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
);
|
||||||
tsqa = new TaskStorageQueryAdapter(ts);
|
tsqa = new TaskStorageQueryAdapter(ts);
|
||||||
tl = new TaskLockbox(ts);
|
tl = new TaskLockbox(ts);
|
||||||
mdc = newMockMDC();
|
mdc = newMockMDC();
|
||||||
|
|
|
@ -45,6 +45,7 @@ import io.druid.indexing.common.actions.LocalTaskActionClientFactory;
|
||||||
import io.druid.indexing.common.actions.TaskActionClientFactory;
|
import io.druid.indexing.common.actions.TaskActionClientFactory;
|
||||||
import io.druid.indexing.common.actions.TaskActionToolbox;
|
import io.druid.indexing.common.actions.TaskActionToolbox;
|
||||||
import io.druid.indexing.common.config.TaskConfig;
|
import io.druid.indexing.common.config.TaskConfig;
|
||||||
|
import io.druid.indexing.common.config.TaskStorageConfig;
|
||||||
import io.druid.indexing.common.index.ChatHandlerProvider;
|
import io.druid.indexing.common.index.ChatHandlerProvider;
|
||||||
import io.druid.indexing.common.tasklogs.SwitchingTaskLogStreamer;
|
import io.druid.indexing.common.tasklogs.SwitchingTaskLogStreamer;
|
||||||
import io.druid.indexing.common.tasklogs.TaskRunnerTaskLogStreamer;
|
import io.druid.indexing.common.tasklogs.TaskRunnerTaskLogStreamer;
|
||||||
|
@ -154,6 +155,8 @@ public class CliOverlord extends ServerRunnable
|
||||||
|
|
||||||
private void configureTaskStorage(Binder binder)
|
private void configureTaskStorage(Binder binder)
|
||||||
{
|
{
|
||||||
|
JsonConfigProvider.bind(binder, "druid.indexer.storage", TaskStorageConfig.class);
|
||||||
|
|
||||||
PolyBind.createChoice(
|
PolyBind.createChoice(
|
||||||
binder, "druid.indexer.storage.type", Key.get(TaskStorage.class), Key.get(HeapMemoryTaskStorage.class)
|
binder, "druid.indexer.storage.type", Key.get(TaskStorage.class), Key.get(HeapMemoryTaskStorage.class)
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue