diff --git a/plugin/src/main/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfig.java b/plugin/src/main/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfig.java index 41bf6c6fee5..d3207499512 100644 --- a/plugin/src/main/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfig.java +++ b/plugin/src/main/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfig.java @@ -41,6 +41,7 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Random; import java.util.concurrent.TimeUnit; /** @@ -352,12 +353,13 @@ public class DatafeedConfig extends AbstractDiffable implements public static class Builder { private static final int DEFAULT_SCROLL_SIZE = 1000; - private static final TimeValue DEFAULT_QUERY_DELAY = TimeValue.timeValueMinutes(1); + private static final TimeValue MIN_DEFAULT_QUERY_DELAY = TimeValue.timeValueMinutes(1); + private static final TimeValue MAX_DEFAULT_QUERY_DELAY = TimeValue.timeValueMinutes(2); private static final int DEFAULT_AGGREGATION_CHUNKING_BUCKETS = 1000; private String id; private String jobId; - private TimeValue queryDelay = DEFAULT_QUERY_DELAY; + private TimeValue queryDelay; private TimeValue frequency; private List indices = Collections.emptyList(); private List types = Collections.emptyList(); @@ -460,6 +462,7 @@ public class DatafeedConfig extends AbstractDiffable implements } validateAggregations(); setDefaultChunkingConfig(); + setDefaultQueryDelay(); return new DatafeedConfig(id, jobId, queryDelay, frequency, indices, types, query, aggregations, scriptFields, scrollSize, chunkingConfig); } @@ -530,6 +533,15 @@ public class DatafeedConfig extends AbstractDiffable implements } } + private void setDefaultQueryDelay() { + if (queryDelay == null) { + Random random = new Random(jobId.hashCode()); + long delayMillis = random.longs(MIN_DEFAULT_QUERY_DELAY.millis(), MAX_DEFAULT_QUERY_DELAY.millis()) + .findFirst().getAsLong(); + queryDelay = TimeValue.timeValueMillis(delayMillis); + } + } + private static ElasticsearchException invalidOptionValue(String fieldName, Object value) { String msg = Messages.getMessage(Messages.DATAFEED_CONFIG_INVALID_OPTION_VALUE, fieldName, value); throw ExceptionsHelper.badRequestException(msg); diff --git a/plugin/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfigTests.java b/plugin/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfigTests.java index d0bdb4c8404..57be39f7612 100644 --- a/plugin/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfigTests.java +++ b/plugin/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedConfigTests.java @@ -33,18 +33,23 @@ import org.elasticsearch.search.builder.SearchSourceBuilder.ScriptField; import org.elasticsearch.test.AbstractSerializingTestCase; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.ml.datafeed.ChunkingConfig.Mode; +import org.elasticsearch.xpack.ml.job.config.JobTests; import org.elasticsearch.xpack.ml.job.messages.Messages; import org.joda.time.DateTimeZone; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.TimeZone; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.lessThan; +import static org.hamcrest.Matchers.not; public class DatafeedConfigTests extends AbstractSerializingTestCase { @@ -162,15 +167,36 @@ public class DatafeedConfigTests extends AbstractSerializingTestCase