From 2f638b5a23597967a98b1ced1deac91d64af5a44 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 27 Jun 2016 18:41:18 -0400 Subject: [PATCH] Keep input time unit when parsing TimeValues This commit modifies TimeValue parsing to keep the input time unit. This enables round-trip parsing from instances of String to instances of TimeValue and vice-versa. With this, this commit removes support for the unit "w" representing weeks, and also removes support for fractional values of units (e.g., 0.5s). Relates #19102 --- .../resources/checkstyle_suppressions.xml | 1 - .../common/io/stream/Streamable.java | 5 +- .../common/io/stream/Writeable.java | 3 +- .../elasticsearch/common/unit/TimeValue.java | 123 ++++++++++++------ .../elasticsearch/search/SearchService.java | 2 +- .../search/builder/SearchSourceBuilder.java | 24 ++-- .../search/internal/DefaultSearchContext.java | 15 +-- .../internal/FilteredSearchContext.java | 9 +- .../search/internal/SearchContext.java | 5 +- .../search/internal/SubSearchContext.java | 3 +- .../search/query/QueryPhase.java | 4 +- .../cluster/settings/ClusterSettingsIT.java | 2 +- .../common/unit/TimeValueTests.java | 43 +++--- .../index/IndexingSlowLogTests.java | 8 +- .../index/SearchSlowLogTests.java | 16 +-- .../index/mapper/ttl/TTLMappingTests.java | 2 +- .../ingest/PipelineExecutionServiceTests.java | 2 +- .../builder/SearchSourceBuilderTests.java | 7 +- .../functionscore/DecayFunctionScoreIT.java | 4 +- .../versioning/SimpleVersioningIT.java | 2 +- .../migration/migrate_5_0/settings.asciidoc | 8 ++ .../org/elasticsearch/test/ESTestCase.java | 2 +- .../test/InternalTestCluster.java | 8 +- .../elasticsearch/test/TestSearchContext.java | 7 +- 24 files changed, 183 insertions(+), 122 deletions(-) diff --git a/buildSrc/src/main/resources/checkstyle_suppressions.xml b/buildSrc/src/main/resources/checkstyle_suppressions.xml index 745c8374063..5a08a834c3c 100644 --- a/buildSrc/src/main/resources/checkstyle_suppressions.xml +++ b/buildSrc/src/main/resources/checkstyle_suppressions.xml @@ -323,7 +323,6 @@ - diff --git a/core/src/main/java/org/elasticsearch/common/io/stream/Streamable.java b/core/src/main/java/org/elasticsearch/common/io/stream/Streamable.java index a37c6371482..99c054c4c78 100644 --- a/core/src/main/java/org/elasticsearch/common/io/stream/Streamable.java +++ b/core/src/main/java/org/elasticsearch/common/io/stream/Streamable.java @@ -24,10 +24,7 @@ import java.io.IOException; /** * Implementers can be written to a {@linkplain StreamOutput} and read from a {@linkplain StreamInput}. This allows them to be "thrown * across the wire" using Elasticsearch's internal protocol. If the implementer also implements equals and hashCode then a copy made by - * serializing and deserializing must be equal and have the same hashCode. It isn't required that such a copy be entirely unchanged. For - * example, {@link org.elasticsearch.common.unit.TimeValue} converts the time to nanoseconds for serialization. - * {@linkplain org.elasticsearch.common.unit.TimeValue} actually implements {@linkplain Writeable} not {@linkplain Streamable} but it has - * the same contract. + * serializing and deserializing must be equal and have the same hashCode. It isn't required that such a copy be entirely unchanged. * * Prefer implementing {@link Writeable} over implementing this interface where possible. Lots of code depends on this interface so this * isn't always possible. diff --git a/core/src/main/java/org/elasticsearch/common/io/stream/Writeable.java b/core/src/main/java/org/elasticsearch/common/io/stream/Writeable.java index cf127e5b968..16497533e29 100644 --- a/core/src/main/java/org/elasticsearch/common/io/stream/Writeable.java +++ b/core/src/main/java/org/elasticsearch/common/io/stream/Writeable.java @@ -24,8 +24,7 @@ import java.io.IOException; /** * Implementers can be written to a {@linkplain StreamOutput} and read from a {@linkplain StreamInput}. This allows them to be "thrown * across the wire" using Elasticsearch's internal protocol. If the implementer also implements equals and hashCode then a copy made by - * serializing and deserializing must be equal and have the same hashCode. It isn't required that such a copy be entirely unchanged. For - * example, {@link org.elasticsearch.common.unit.TimeValue} converts the time to nanoseconds for serialization. + * serializing and deserializing must be equal and have the same hashCode. It isn't required that such a copy be entirely unchanged. * * Prefer implementing this interface over implementing {@link Streamable} where possible. Lots of code depends on {@linkplain Streamable} * so this isn't always possible. diff --git a/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java b/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java index 2058355d300..5a56603dad7 100644 --- a/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java +++ b/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java @@ -30,14 +30,50 @@ import org.joda.time.format.PeriodFormat; import org.joda.time.format.PeriodFormatter; import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; public class TimeValue implements Writeable { /** How many nano-seconds in one milli-second */ - public static final long NSEC_PER_MSEC = 1000000; + public static final long NSEC_PER_MSEC = TimeUnit.NANOSECONDS.convert(1, TimeUnit.MILLISECONDS); + + private static Map TIME_UNIT_BYTE_MAP; + private static Map BYTE_TIME_UNIT_MAP; + + static { + final Map timeUnitByteMap = new HashMap<>(); + timeUnitByteMap.put(TimeUnit.NANOSECONDS, (byte)0); + timeUnitByteMap.put(TimeUnit.MICROSECONDS, (byte)1); + timeUnitByteMap.put(TimeUnit.MILLISECONDS, (byte)2); + timeUnitByteMap.put(TimeUnit.SECONDS, (byte)3); + timeUnitByteMap.put(TimeUnit.MINUTES, (byte)4); + timeUnitByteMap.put(TimeUnit.HOURS, (byte)5); + timeUnitByteMap.put(TimeUnit.DAYS, (byte)6); + + final Set bytes = new HashSet<>(); + for (TimeUnit value : TimeUnit.values()) { + assert timeUnitByteMap.containsKey(value) : value; + assert bytes.add(timeUnitByteMap.get(value)); + } + + final Map byteTimeUnitMap = new HashMap<>(); + for (Map.Entry entry : timeUnitByteMap.entrySet()) { + byteTimeUnitMap.put(entry.getValue(), entry.getKey()); + } + + TIME_UNIT_BYTE_MAP = Collections.unmodifiableMap(timeUnitByteMap); + BYTE_TIME_UNIT_MAP = Collections.unmodifiableMap(byteTimeUnitMap); + } + + public static final TimeValue MINUS_ONE = timeValueMillis(-1); + public static final TimeValue ZERO = timeValueMillis(0); public static TimeValue timeValueNanos(long nanos) { return new TimeValue(nanos, TimeUnit.NANOSECONDS); @@ -60,8 +96,19 @@ public class TimeValue implements Writeable { } private final long duration; + + // visible for testing + long duration() { + return duration; + } + private final TimeUnit timeUnit; + // visible for testing + TimeUnit timeUnit() { + return timeUnit; + } + public TimeValue(long millis) { this(millis, TimeUnit.MILLISECONDS); } @@ -76,12 +123,13 @@ public class TimeValue implements Writeable { */ public TimeValue(StreamInput in) throws IOException { duration = in.readZLong(); - timeUnit = TimeUnit.NANOSECONDS; + timeUnit = BYTE_TIME_UNIT_MAP.get(in.readByte()); } @Override public void writeTo(StreamOutput out) throws IOException { - out.writeZLong(nanos()); + out.writeZLong(duration); + out.writeByte(TIME_UNIT_BYTE_MAP.get(timeUnit)); } public long nanos() { @@ -240,19 +288,19 @@ public class TimeValue implements Writeable { } switch (timeUnit) { case NANOSECONDS: - return Strings.format1Decimals(duration, "nanos"); + return duration + "nanos"; case MICROSECONDS: - return Strings.format1Decimals(duration, "micros"); + return duration + "micros"; case MILLISECONDS: - return Strings.format1Decimals(duration, "ms"); + return duration + "ms"; case SECONDS: - return Strings.format1Decimals(duration, "s"); + return duration + "s"; case MINUTES: - return Strings.format1Decimals(duration, "m"); + return duration + "m"; case HOURS: - return Strings.format1Decimals(duration, "h"); + return duration + "h"; case DAYS: - return Strings.format1Decimals(duration, "d"); + return duration + "d"; default: throw new IllegalArgumentException("unknown time unit: " + timeUnit.name()); } @@ -270,47 +318,48 @@ public class TimeValue implements Writeable { return defaultValue; } try { - long millis; String lowerSValue = sValue.toLowerCase(Locale.ROOT).trim(); - if (lowerSValue.endsWith("ms")) { - millis = parse(lowerSValue, 2, 1); + if (lowerSValue.endsWith("nanos")) { + return new TimeValue(parse(lowerSValue, 5), TimeUnit.NANOSECONDS); + } else if (lowerSValue.endsWith("micros")) { + return new TimeValue(parse(lowerSValue, 6), TimeUnit.MICROSECONDS); + } else if (lowerSValue.endsWith("ms")) { + return new TimeValue(parse(lowerSValue, 2), TimeUnit.MILLISECONDS); } else if (lowerSValue.endsWith("s")) { - millis = parse(lowerSValue, 1, 1000); + return new TimeValue(parse(lowerSValue, 1), TimeUnit.SECONDS); } else if (lowerSValue.endsWith("m")) { - millis = parse(lowerSValue, 1, 60 * 1000); + return new TimeValue(parse(lowerSValue, 1), TimeUnit.MINUTES); } else if (lowerSValue.endsWith("h")) { - millis = parse(lowerSValue, 1, 60 * 60 * 1000); + return new TimeValue(parse(lowerSValue, 1), TimeUnit.HOURS); } else if (lowerSValue.endsWith("d")) { - millis = parse(lowerSValue, 1, 24 * 60 * 60 * 1000); - } else if (lowerSValue.endsWith("w")) { - millis = parse(lowerSValue, 1, 7 * 24 * 60 * 60 * 1000); - } else if (lowerSValue.equals("-1")) { - // Allow this special value to be unit-less: - millis = -1; - } else if (lowerSValue.equals("0")) { - // Allow this special value to be unit-less: - millis = 0; + return new TimeValue(parse(lowerSValue, 1), TimeUnit.DAYS); + } else if (lowerSValue.matches("-0*1")) { + return TimeValue.MINUS_ONE; + } else if (lowerSValue.matches("0+")) { + return TimeValue.ZERO; } else { // Missing units: - throw new ElasticsearchParseException("Failed to parse setting [{}] with value [{}] as a time value: unit is missing or unrecognized", settingName, sValue); + throw new ElasticsearchParseException( + "failed to parse setting [{}] with value [{}] as a time value: unit is missing or unrecognized", + settingName, + sValue); } - return new TimeValue(millis, TimeUnit.MILLISECONDS); } catch (NumberFormatException e) { - throw new ElasticsearchParseException("Failed to parse [{}]", e, sValue); + throw new ElasticsearchParseException("failed to parse [{}]", e, sValue); } } - private static long parse(String s, int suffixLength, long scale) { - return (long) (Double.parseDouble(s.substring(0, s.length() - suffixLength)) * scale); + private static long parse(String s, int suffixLength) { + return Long.parseLong(s.substring(0, s.length() - suffixLength).trim()); } - static final long C0 = 1L; - static final long C1 = C0 * 1000L; - static final long C2 = C1 * 1000L; - static final long C3 = C2 * 1000L; - static final long C4 = C3 * 60L; - static final long C5 = C4 * 60L; - static final long C6 = C5 * 24L; + private static final long C0 = 1L; + private static final long C1 = C0 * 1000L; + private static final long C2 = C1 * 1000L; + private static final long C3 = C2 * 1000L; + private static final long C4 = C3 * 60L; + private static final long C5 = C4 * 60L; + private static final long C6 = C5 * 24L; @Override public boolean equals(Object o) { diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java index 50b59631e95..96fee4b968f 100644 --- a/core/src/main/java/org/elasticsearch/search/SearchService.java +++ b/core/src/main/java/org/elasticsearch/search/SearchService.java @@ -685,7 +685,7 @@ public class SearchService extends AbstractLifecycleComponent imp if (source.profile()) { context.setProfilers(new Profilers(context.searcher())); } - context.timeoutInMillis(source.timeoutInMillis()); + context.timeout(source.timeout()); context.terminateAfter(source.terminateAfter()); if (source.aggregations() != null) { try { diff --git a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java index 24278bdf127..ebf8880d4aa 100644 --- a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java @@ -143,7 +143,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ private Float minScore; - private long timeoutInMillis = -1; + private TimeValue timeout = null; private int terminateAfter = SearchContext.DEFAULT_TERMINATE_AFTER; private List fieldNames; @@ -241,7 +241,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } suggestBuilder = in.readOptionalWriteable(SuggestBuilder::new); terminateAfter = in.readVInt(); - timeoutInMillis = in.readLong(); + timeout = in.readOptionalWriteable(TimeValue::new); trackScores = in.readBoolean(); version = in.readOptionalBoolean(); ext = in.readOptionalBytesReference(); @@ -320,7 +320,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } out.writeOptionalWriteable(suggestBuilder); out.writeVInt(terminateAfter); - out.writeLong(timeoutInMillis); + out.writeOptionalWriteable(timeout); out.writeBoolean(trackScores); out.writeOptionalBoolean(version); out.writeOptionalBytesReference(ext); @@ -446,15 +446,15 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ * An optional timeout to control how long search is allowed to take. */ public SearchSourceBuilder timeout(TimeValue timeout) { - this.timeoutInMillis = timeout.millis(); + this.timeout = timeout; return this; } /** * Gets the timeout to control how long search is allowed to take. */ - public long timeoutInMillis() { - return timeoutInMillis; + public TimeValue timeout() { + return timeout; } /** @@ -928,7 +928,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ rewrittenBuilder.stats = stats; rewrittenBuilder.suggestBuilder = suggestBuilder; rewrittenBuilder.terminateAfter = terminateAfter; - rewrittenBuilder.timeoutInMillis = timeoutInMillis; + rewrittenBuilder.timeout = timeout; rewrittenBuilder.trackScores = trackScores; rewrittenBuilder.version = version; return rewrittenBuilder; @@ -958,7 +958,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } else if (context.getParseFieldMatcher().match(currentFieldName, SIZE_FIELD)) { size = parser.intValue(); } else if (context.getParseFieldMatcher().match(currentFieldName, TIMEOUT_FIELD)) { - timeoutInMillis = TimeValue.parseTimeValue(parser.text(), null, TIMEOUT_FIELD.getPreferredName()).millis(); + timeout = TimeValue.parseTimeValue(parser.text(), null, TIMEOUT_FIELD.getPreferredName()); } else if (context.getParseFieldMatcher().match(currentFieldName, TERMINATE_AFTER_FIELD)) { terminateAfter = parser.intValue(); } else if (context.getParseFieldMatcher().match(currentFieldName, MIN_SCORE_FIELD)) { @@ -1095,8 +1095,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ builder.field(SIZE_FIELD.getPreferredName(), size); } - if (timeoutInMillis != -1) { - builder.field(TIMEOUT_FIELD.getPreferredName(), TimeValue.timeValueMillis(timeoutInMillis).toString()); + if (timeout != null && !timeout.equals(TimeValue.MINUS_ONE)) { + builder.field(TIMEOUT_FIELD.getPreferredName(), timeout.getStringRep()); } if (terminateAfter != SearchContext.DEFAULT_TERMINATE_AFTER) { @@ -1341,7 +1341,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ public int hashCode() { return Objects.hash(aggregations, explain, fetchSourceContext, fieldDataFields, fieldNames, from, highlightBuilder, indexBoost, minScore, postQueryBuilder, queryBuilder, rescoreBuilders, scriptFields, - size, sorts, searchAfterBuilder, sliceBuilder, stats, suggestBuilder, terminateAfter, timeoutInMillis, trackScores, version, profile); + size, sorts, searchAfterBuilder, sliceBuilder, stats, suggestBuilder, terminateAfter, timeout, trackScores, version, profile); } @Override @@ -1373,7 +1373,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ && Objects.equals(stats, other.stats) && Objects.equals(suggestBuilder, other.suggestBuilder) && Objects.equals(terminateAfter, other.terminateAfter) - && Objects.equals(timeoutInMillis, other.timeoutInMillis) + && Objects.equals(timeout, other.timeout) && Objects.equals(trackScores, other.trackScores) && Objects.equals(version, other.version) && Objects.equals(profile, other.profile); diff --git a/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java b/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java index 06df04db8a0..e10cafdaaf6 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java +++ b/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java @@ -24,8 +24,8 @@ import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Collector; import org.apache.lucene.search.ConstantScoreQuery; -import org.apache.lucene.search.Query; import org.apache.lucene.search.FieldDoc; +import org.apache.lucene.search.Query; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.Counter; import org.elasticsearch.action.search.SearchType; @@ -99,8 +99,7 @@ public class DefaultSearchContext extends SearchContext { private final QuerySearchResult queryResult; private final FetchSearchResult fetchResult; private float queryBoost = 1.0f; - // timeout in millis - private long timeoutInMillis; + private TimeValue timeout; // terminate after count private int terminateAfter = DEFAULT_TERMINATE_AFTER; private List groupStats; @@ -174,7 +173,7 @@ public class DefaultSearchContext extends SearchContext { this.indexService = indexService; this.searcher = new ContextIndexSearcher(engineSearcher, indexService.cache().query(), indexShard.getQueryCachingPolicy()); this.timeEstimateCounter = timeEstimateCounter; - this.timeoutInMillis = timeout.millis(); + this.timeout = timeout; queryShardContext = indexService.newQueryShardContext(searcher.getIndexReader()); queryShardContext.setTypes(request.types()); } @@ -512,13 +511,13 @@ public class DefaultSearchContext extends SearchContext { } @Override - public long timeoutInMillis() { - return timeoutInMillis; + public TimeValue timeout() { + return timeout; } @Override - public void timeoutInMillis(long timeoutInMillis) { - this.timeoutInMillis = timeoutInMillis; + public void timeout(TimeValue timeout) { + this.timeout = timeout; } @Override diff --git a/core/src/main/java/org/elasticsearch/search/internal/FilteredSearchContext.java b/core/src/main/java/org/elasticsearch/search/internal/FilteredSearchContext.java index 822ac6f5422..6c646a62b6b 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/FilteredSearchContext.java +++ b/core/src/main/java/org/elasticsearch/search/internal/FilteredSearchContext.java @@ -25,6 +25,7 @@ import org.apache.lucene.search.Query; import org.apache.lucene.util.Counter; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.common.ParseFieldMatcher; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.index.analysis.AnalysisService; import org.elasticsearch.index.cache.bitset.BitsetFilterCache; @@ -264,13 +265,13 @@ public abstract class FilteredSearchContext extends SearchContext { } @Override - public long timeoutInMillis() { - return in.timeoutInMillis(); + public TimeValue timeout() { + return in.timeout(); } @Override - public void timeoutInMillis(long timeoutInMillis) { - in.timeoutInMillis(timeoutInMillis); + public void timeout(TimeValue timeout) { + in.timeout(timeout); } @Override diff --git a/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java b/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java index 5135f42ab56..7b29cabdf16 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java +++ b/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java @@ -28,6 +28,7 @@ import org.elasticsearch.common.Nullable; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.lease.Releasable; import org.elasticsearch.common.lease.Releasables; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.common.util.iterable.Iterables; import org.elasticsearch.index.analysis.AnalysisService; @@ -226,9 +227,9 @@ public abstract class SearchContext implements Releasable { public abstract IndexFieldDataService fieldData(); - public abstract long timeoutInMillis(); + public abstract TimeValue timeout(); - public abstract void timeoutInMillis(long timeoutInMillis); + public abstract void timeout(TimeValue timeout); public abstract int terminateAfter(); diff --git a/core/src/main/java/org/elasticsearch/search/internal/SubSearchContext.java b/core/src/main/java/org/elasticsearch/search/internal/SubSearchContext.java index 37fb608fd0c..363b6ad076a 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/SubSearchContext.java +++ b/core/src/main/java/org/elasticsearch/search/internal/SubSearchContext.java @@ -20,6 +20,7 @@ package org.elasticsearch.search.internal; import org.apache.lucene.search.Query; import org.apache.lucene.util.Counter; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.ParsedQuery; import org.elasticsearch.search.aggregations.SearchContextAggregations; import org.elasticsearch.search.fetch.FetchSearchResult; @@ -155,7 +156,7 @@ public class SubSearchContext extends FilteredSearchContext { } @Override - public void timeoutInMillis(long timeoutInMillis) { + public void timeout(TimeValue timeout) { throw new UnsupportedOperationException("Not supported"); } diff --git a/core/src/main/java/org/elasticsearch/search/query/QueryPhase.java b/core/src/main/java/org/elasticsearch/search/query/QueryPhase.java index 4e3a642f694..22e6c40d338 100644 --- a/core/src/main/java/org/elasticsearch/search/query/QueryPhase.java +++ b/core/src/main/java/org/elasticsearch/search/query/QueryPhase.java @@ -349,12 +349,12 @@ public class QueryPhase implements SearchPhase { } } - final boolean timeoutSet = searchContext.timeoutInMillis() != SearchService.NO_TIMEOUT.millis(); + final boolean timeoutSet = searchContext.timeout() != null && !searchContext.timeout().equals(SearchService.NO_TIMEOUT); if (timeoutSet && collector != null) { // collector might be null if no collection is actually needed final Collector child = collector; // TODO: change to use our own counter that uses the scheduler in ThreadPool // throws TimeLimitingCollector.TimeExceededException when timeout has reached - collector = Lucene.wrapTimeLimitingCollector(collector, searchContext.timeEstimateCounter(), searchContext.timeoutInMillis()); + collector = Lucene.wrapTimeLimitingCollector(collector, searchContext.timeEstimateCounter(), searchContext.timeout().millis()); if (doProfile) { collector = new InternalProfileCollector(collector, CollectorResult.REASON_SEARCH_TIMEOUT, Collections.singletonList((InternalProfileCollector) child)); diff --git a/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java b/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java index 1c25659d2cf..7f423d1bb9e 100644 --- a/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java @@ -263,7 +263,7 @@ public class ClusterSettingsIT extends ESIntegTestCase { .get(); fail("bogus value"); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [discovery.zen.publish_timeout] with value [whatever] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [discovery.zen.publish_timeout] with value [whatever] as a time value: unit is missing or unrecognized"); } assertThat(discoverySettings.getPublishTimeout().seconds(), equalTo(1L)); diff --git a/core/src/test/java/org/elasticsearch/common/unit/TimeValueTests.java b/core/src/test/java/org/elasticsearch/common/unit/TimeValueTests.java index cc36625e68f..9b73f2f99af 100644 --- a/core/src/test/java/org/elasticsearch/common/unit/TimeValueTests.java +++ b/core/src/test/java/org/elasticsearch/common/unit/TimeValueTests.java @@ -85,9 +85,6 @@ public class TimeValueTests extends ESTestCase { assertEquals(new TimeValue(10, TimeUnit.SECONDS), TimeValue.parseTimeValue("10S", null, "test")); - assertEquals(new TimeValue(100, TimeUnit.MILLISECONDS), - TimeValue.parseTimeValue("0.1s", null, "test")); - assertEquals(new TimeValue(10, TimeUnit.MINUTES), TimeValue.parseTimeValue("10 m", null, "test")); assertEquals(new TimeValue(10, TimeUnit.MINUTES), @@ -115,14 +112,17 @@ public class TimeValueTests extends ESTestCase { assertEquals(new TimeValue(10, TimeUnit.DAYS), TimeValue.parseTimeValue("10D", null, "test")); - assertEquals(new TimeValue(70, TimeUnit.DAYS), - TimeValue.parseTimeValue("10 w", null, "test")); - assertEquals(new TimeValue(70, TimeUnit.DAYS), - TimeValue.parseTimeValue("10w", null, "test")); - assertEquals(new TimeValue(70, TimeUnit.DAYS), - TimeValue.parseTimeValue("10 W", null, "test")); - assertEquals(new TimeValue(70, TimeUnit.DAYS), - TimeValue.parseTimeValue("10W", null, "test")); + final int length = randomIntBetween(0, 8); + final String zeros = new String(new char[length]).replace('\0', '0'); + assertTrue(TimeValue.parseTimeValue("-" + zeros + "1", null, "test") == TimeValue.MINUS_ONE); + assertTrue(TimeValue.parseTimeValue(zeros + "0", null, "test") == TimeValue.ZERO); + } + + public void testRoundTrip() { + final String s = randomTimeValue(); + assertThat(TimeValue.parseTimeValue(s, null, "test").getStringRep(), equalTo(s)); + final TimeValue t = new TimeValue(randomIntBetween(1, 128), randomFrom(TimeUnit.values())); + assertThat(TimeValue.parseTimeValue(t.getStringRep(), null, "test"), equalTo(t)); } private void assertEqualityAfterSerialize(TimeValue value, int expectedSize) throws IOException { @@ -134,13 +134,20 @@ public class TimeValueTests extends ESTestCase { TimeValue inValue = new TimeValue(in); assertThat(inValue, equalTo(value)); + assertThat(inValue.duration(), equalTo(value.duration())); + assertThat(inValue.timeUnit(), equalTo(value.timeUnit())); } public void testSerialize() throws Exception { - assertEqualityAfterSerialize(new TimeValue(100, TimeUnit.DAYS), 8); - assertEqualityAfterSerialize(timeValueNanos(-1), 1); - assertEqualityAfterSerialize(timeValueNanos(1), 1); - assertEqualityAfterSerialize(timeValueSeconds(30), 6); + assertEqualityAfterSerialize(new TimeValue(100, TimeUnit.DAYS), 3); + assertEqualityAfterSerialize(timeValueNanos(-1), 2); + assertEqualityAfterSerialize(timeValueNanos(1), 2); + assertEqualityAfterSerialize(timeValueSeconds(30), 2); + + final TimeValue timeValue = new TimeValue(randomIntBetween(0, 1024), randomFrom(TimeUnit.values())); + BytesStreamOutput out = new BytesStreamOutput(); + out.writeZLong(timeValue.duration()); + assertEqualityAfterSerialize(timeValue, 1 + out.bytes().length()); } public void testFailOnUnknownUnits() { @@ -148,7 +155,7 @@ public class TimeValueTests extends ESTestCase { TimeValue.parseTimeValue("23tw", null, "test"); fail("Expected ElasticsearchParseException"); } catch (ElasticsearchParseException e) { - assertThat(e.getMessage(), containsString("Failed to parse")); + assertThat(e.getMessage(), containsString("failed to parse")); } } @@ -157,7 +164,7 @@ public class TimeValueTests extends ESTestCase { TimeValue.parseTimeValue("42", null, "test"); fail("Expected ElasticsearchParseException"); } catch (ElasticsearchParseException e) { - assertThat(e.getMessage(), containsString("Failed to parse")); + assertThat(e.getMessage(), containsString("failed to parse")); } } @@ -166,7 +173,7 @@ public class TimeValueTests extends ESTestCase { TimeValue.parseTimeValue("42ms.", null, "test"); fail("Expected ElasticsearchParseException"); } catch (ElasticsearchParseException e) { - assertThat(e.getMessage(), containsString("Failed to parse")); + assertThat(e.getMessage(), containsString("failed to parse")); } } diff --git a/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java b/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java index a076224eae5..8951123d0da 100644 --- a/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java +++ b/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java @@ -176,28 +176,28 @@ public class IndexingSlowLogTests extends ESTestCase { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(IndexingSlowLog.INDEX_INDEXING_SLOWLOG_THRESHOLD_INDEX_TRACE_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.indexing.slowlog.threshold.index.trace] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.indexing.slowlog.threshold.index.trace] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(IndexingSlowLog.INDEX_INDEXING_SLOWLOG_THRESHOLD_INDEX_DEBUG_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.indexing.slowlog.threshold.index.debug] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.indexing.slowlog.threshold.index.debug] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(IndexingSlowLog.INDEX_INDEXING_SLOWLOG_THRESHOLD_INDEX_INFO_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.indexing.slowlog.threshold.index.info] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.indexing.slowlog.threshold.index.info] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(IndexingSlowLog.INDEX_INDEXING_SLOWLOG_THRESHOLD_INDEX_WARN_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.indexing.slowlog.threshold.index.warn] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.indexing.slowlog.threshold.index.warn] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } } diff --git a/core/src/test/java/org/elasticsearch/index/SearchSlowLogTests.java b/core/src/test/java/org/elasticsearch/index/SearchSlowLogTests.java index 04291d957a8..d2bffb0f749 100644 --- a/core/src/test/java/org/elasticsearch/index/SearchSlowLogTests.java +++ b/core/src/test/java/org/elasticsearch/index/SearchSlowLogTests.java @@ -249,28 +249,28 @@ public class SearchSlowLogTests extends ESSingleNodeTestCase { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_QUERY_TRACE_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.query.trace] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.query.trace] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_QUERY_DEBUG_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.query.debug] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.query.debug] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_QUERY_INFO_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.query.info] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.query.info] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_QUERY_WARN_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.query.warn] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.query.warn] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } } @@ -320,28 +320,28 @@ public class SearchSlowLogTests extends ESSingleNodeTestCase { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_FETCH_TRACE_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.fetch.trace] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.fetch.trace] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_FETCH_DEBUG_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.fetch.debug] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.fetch.debug] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_FETCH_INFO_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.fetch.info] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.fetch.info] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } try { settings.updateIndexMetaData(newIndexMeta("index", Settings.builder().put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_FETCH_WARN_SETTING.getKey(), "NOT A TIME VALUE").build())); fail(); } catch (IllegalArgumentException ex) { - assertEquals(ex.getMessage(), "Failed to parse setting [index.search.slowlog.threshold.fetch.warn] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); + assertEquals(ex.getMessage(), "failed to parse setting [index.search.slowlog.threshold.fetch.warn] with value [NOT A TIME VALUE] as a time value: unit is missing or unrecognized"); } } diff --git a/core/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java b/core/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java index ad9e03327b2..620968ddbe8 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/ttl/TTLMappingTests.java @@ -139,7 +139,7 @@ public class TTLMappingTests extends ESSingleNodeTestCase { String updatedMapping = XContentFactory.jsonBuilder().startObject().startObject("type") .startObject("_ttl") - .field("default", "1w") + .field("default", "7d") .endObject() .startObject("properties").field("field").startObject().field("type", "text").endObject().endObject() .endObject().endObject().string(); diff --git a/core/src/test/java/org/elasticsearch/ingest/PipelineExecutionServiceTests.java b/core/src/test/java/org/elasticsearch/ingest/PipelineExecutionServiceTests.java index d001a829443..8bf6f77a026 100644 --- a/core/src/test/java/org/elasticsearch/ingest/PipelineExecutionServiceTests.java +++ b/core/src/test/java/org/elasticsearch/ingest/PipelineExecutionServiceTests.java @@ -140,7 +140,7 @@ public class PipelineExecutionServiceTests extends ESTestCase { IngestDocument ingestDocument = (IngestDocument) invocationOnMock.getArguments()[0]; for (IngestDocument.MetaData metaData : IngestDocument.MetaData.values()) { if (metaData == IngestDocument.MetaData.TTL) { - ingestDocument.setFieldValue(IngestDocument.MetaData.TTL.getFieldName(), "5w"); + ingestDocument.setFieldValue(IngestDocument.MetaData.TTL.getFieldName(), "35d"); } else { ingestDocument.setFieldValue(metaData.getFieldName(), "update" + metaData.getFieldName()); } diff --git a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java index 9d66669d07c..f3a78b65d78 100644 --- a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java @@ -86,7 +86,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.TimeUnit; import static org.elasticsearch.test.ClusterServiceUtils.createClusterService; import static org.elasticsearch.test.ClusterServiceUtils.setState; @@ -208,7 +207,7 @@ public class SearchSourceBuilderTests extends ESTestCase { builder.minScore(randomFloat() * 1000); } if (randomBoolean()) { - builder.timeout(new TimeValue(randomIntBetween(1, 100), randomFrom(TimeUnit.values()))); + builder.timeout(TimeValue.parseTimeValue(randomTimeValue(), null, "timeout")); } if (randomBoolean()) { builder.terminateAfter(randomIntBetween(1, 100000)); @@ -456,7 +455,7 @@ public class SearchSourceBuilderTests extends ESTestCase { public void testEqualsAndHashcode() throws IOException { SearchSourceBuilder firstBuilder = createSearchSourceBuilder(); - assertFalse("source builder is equal to null", firstBuilder.equals(null)); + assertNotNull("source builder is equal to null", firstBuilder); assertFalse("source builder is equal to incompatible type", firstBuilder.equals("")); assertTrue("source builder is not equal to self", firstBuilder.equals(firstBuilder)); assertThat("same source builder's hashcode returns different values if called multiple times", firstBuilder.hashCode(), @@ -601,7 +600,7 @@ public class SearchSourceBuilderTests extends ESTestCase { final String query = "{ \"query\": { \"match_all\": {}}, \"timeout\": \"" + timeout + "\"}"; try (XContentParser parser = XContentFactory.xContent(query).createParser(query)) { final SearchSourceBuilder builder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers, suggesters); - assertThat(builder.timeoutInMillis(), equalTo(TimeValue.parseTimeValue(timeout, null, "timeout").millis())); + assertThat(builder.timeout(), equalTo(TimeValue.parseTimeValue(timeout, null, "timeout"))); } } diff --git a/core/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java b/core/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java index 1418f476e00..155363f72a7 100644 --- a/core/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java +++ b/core/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java @@ -594,9 +594,9 @@ public class DecayFunctionScoreIT extends ESIntegTestCase { searchRequest().searchType(SearchType.QUERY_THEN_FETCH).source( searchSource().query( functionScoreQuery(QueryBuilders.matchAllQuery(), new FilterFunctionBuilder[]{ - new FilterFunctionBuilder(linearDecayFunction("num1", null, "1000w")), + new FilterFunctionBuilder(linearDecayFunction("num1", null, "7000d")), new FilterFunctionBuilder(gaussDecayFunction("num1", null, "1d")), - new FilterFunctionBuilder(exponentialDecayFunction("num1", null, "1000w")) + new FilterFunctionBuilder(exponentialDecayFunction("num1", null, "7000d")) }).scoreMode(FiltersFunctionScoreQuery.ScoreMode.MULTIPLY)))); SearchResponse sr = response.actionGet(); diff --git a/core/src/test/java/org/elasticsearch/versioning/SimpleVersioningIT.java b/core/src/test/java/org/elasticsearch/versioning/SimpleVersioningIT.java index 2356395219f..74b910bf2b4 100644 --- a/core/src/test/java/org/elasticsearch/versioning/SimpleVersioningIT.java +++ b/core/src/test/java/org/elasticsearch/versioning/SimpleVersioningIT.java @@ -220,7 +220,7 @@ public class SimpleVersioningIT extends ESIntegTestCase { fail("did not hit expected exception"); } catch (IllegalArgumentException iae) { // expected - assertTrue(iae.getMessage().contains("Failed to parse setting [index.gc_deletes] with value [42] as a time value: unit is missing or unrecognized")); + assertTrue(iae.getMessage().contains("failed to parse setting [index.gc_deletes] with value [42] as a time value: unit is missing or unrecognized")); } } diff --git a/docs/reference/migration/migrate_5_0/settings.asciidoc b/docs/reference/migration/migrate_5_0/settings.asciidoc index be578b00c3b..8a7c386acdb 100644 --- a/docs/reference/migration/migrate_5_0/settings.asciidoc +++ b/docs/reference/migration/migrate_5_0/settings.asciidoc @@ -286,3 +286,11 @@ The setting `bootstrap.mlockall` has been renamed to The default setting `include_global_state` for restoring snapshots has been changed from `true` to `false`. It has not been changed for taking snapshots and still defaults to `true` in that case. + +==== Time value parsing + +The unit 'w' representing weeks is no longer supported. + +Fractional time values (e.g., 0.5s) are no longer supported. For +example, this means when setting timeouts "0.5s" will be rejected and +should instead be input as "500ms". diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java index 860f133a453..d04d12304de 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -413,7 +413,7 @@ public abstract class ESTestCase extends LuceneTestCase { return generateRandomStringArray(maxArraySize, maxStringSize, allowNull, true); } - private static String[] TIME_SUFFIXES = new String[]{"d", "H", "ms", "s", "S", "w"}; + private static String[] TIME_SUFFIXES = new String[]{"d", "h", "ms", "s", "m"}; private static String randomTimeValue(int lower, int upper) { return randomIntBetween(lower, upper) + randomFrom(TIME_SUFFIXES); diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java index 025740dbe36..9a00fbc4557 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java @@ -410,12 +410,12 @@ public final class InternalTestCluster extends TestCluster { builder.put("cache.recycler.page.type", RandomPicks.randomFrom(random, PageCacheRecycler.Type.values())); } if (random.nextInt(10) == 0) { // 10% of the nodes have a very frequent check interval - builder.put(SearchService.KEEPALIVE_INTERVAL_SETTING.getKey(), TimeValue.timeValueMillis(10 + random.nextInt(2000))); + builder.put(SearchService.KEEPALIVE_INTERVAL_SETTING.getKey(), TimeValue.timeValueMillis(10 + random.nextInt(2000)).getStringRep()); } else if (random.nextInt(10) != 0) { // 90% of the time - 10% of the time we don't set anything - builder.put(SearchService.KEEPALIVE_INTERVAL_SETTING.getKey(), TimeValue.timeValueSeconds(10 + random.nextInt(5 * 60))); + builder.put(SearchService.KEEPALIVE_INTERVAL_SETTING.getKey(), TimeValue.timeValueSeconds(10 + random.nextInt(5 * 60)).getStringRep()); } if (random.nextBoolean()) { // sometimes set a - builder.put(SearchService.DEFAULT_KEEPALIVE_SETTING.getKey(), TimeValue.timeValueSeconds(100 + random.nextInt(5 * 60))); + builder.put(SearchService.DEFAULT_KEEPALIVE_SETTING.getKey(), TimeValue.timeValueSeconds(100 + random.nextInt(5 * 60)).getStringRep()); } builder.put(EsExecutors.PROCESSORS_SETTING.getKey(), 1 + random.nextInt(3)); @@ -469,7 +469,7 @@ public final class InternalTestCluster extends TestCluster { builder.put(ScriptService.SCRIPT_CACHE_SIZE_SETTING.getKey(), RandomInts.randomIntBetween(random, 0, 2000)); } if (random.nextBoolean()) { - builder.put(ScriptService.SCRIPT_CACHE_EXPIRE_SETTING.getKey(), TimeValue.timeValueMillis(RandomInts.randomIntBetween(random, 750, 10000000))); + builder.put(ScriptService.SCRIPT_CACHE_EXPIRE_SETTING.getKey(), TimeValue.timeValueMillis(RandomInts.randomIntBetween(random, 750, 10000000)).getStringRep()); } return builder.build(); diff --git a/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java b/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java index 8122abe483d..97240bd9e5e 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java +++ b/test/framework/src/main/java/org/elasticsearch/test/TestSearchContext.java @@ -28,6 +28,7 @@ import org.apache.lucene.search.Query; import org.apache.lucene.util.Counter; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.common.ParseFieldMatcher; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.analysis.AnalysisService; @@ -311,12 +312,12 @@ public class TestSearchContext extends SearchContext { } @Override - public long timeoutInMillis() { - return 0; + public TimeValue timeout() { + return TimeValue.ZERO; } @Override - public void timeoutInMillis(long timeoutInMillis) { + public void timeout(TimeValue timeout) { } @Override