Make keep alive of point in time optional in search (#62184)

A search request should not be required to extend the keep_alive of a point in time. 
This change makes that parameter optional.
This commit is contained in:
Nhat Nguyen 2020-09-09 20:07:27 -04:00
parent 3fc35aa76e
commit 2eb1e8bc84
6 changed files with 21 additions and 15 deletions

View File

@ -68,7 +68,7 @@ public final class SearchShardIterator extends PlainShardIterator {
this.clusterAlias = clusterAlias;
this.searchContextId = searchContextId;
this.searchContextKeepAlive = searchContextKeepAlive;
assert (searchContextId == null) == (searchContextKeepAlive == null);
assert searchContextKeepAlive == null || searchContextId != null;
}
/**

View File

@ -1719,33 +1719,35 @@ public final class SearchSourceBuilder implements Writeable, ToXContentObject, R
public PointInTimeBuilder(String id, TimeValue keepAlive) {
this.id = Objects.requireNonNull(id);
this.keepAlive = Objects.requireNonNull(keepAlive);
this.keepAlive = keepAlive;
}
public PointInTimeBuilder(StreamInput in) throws IOException {
id = in.readString();
keepAlive = in.readTimeValue();
keepAlive = in.readOptionalTimeValue();
}
@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeString(id);
out.writeTimeValue(keepAlive);
out.writeOptionalTimeValue(keepAlive);
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(POINT_IN_TIME.getPreferredName());
builder.field(ID_FIELD.getPreferredName(), id);
builder.field(KEEP_ALIVE_FIELD.getPreferredName(), keepAlive);
if (keepAlive != null) {
builder.field(KEEP_ALIVE_FIELD.getPreferredName(), keepAlive);
}
builder.endObject();
return builder;
}
public static PointInTimeBuilder fromXContent(XContentParser parser) throws IOException {
final XContentParams params = PARSER.parse(parser, null);
if (params.id == null || params.keepAlive == null) {
throw new IllegalArgumentException("id and keep_alive must be specified");
if (params.id == null) {
throw new IllegalArgumentException("point int time id is not provided");
}
return new PointInTimeBuilder(params.id, params.keepAlive);
}

View File

@ -179,7 +179,7 @@ public class ShardSearchRequest extends TransportRequest implements IndicesReque
this.originalIndices = originalIndices;
this.readerId = readerId;
this.keepAlive = keepAlive;
assert (readerId != null) == (keepAlive != null);
assert keepAlive == null || readerId != null : "readerId: " + readerId + " keepAlive: " + keepAlive;
}
public ShardSearchRequest(StreamInput in) throws IOException {

View File

@ -386,7 +386,8 @@ public class SearchSourceBuilderTests extends AbstractSearchTestCase {
public void testToXContentWithPointInTime() throws IOException {
XContentType xContentType = randomFrom(XContentType.values());
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.pointInTimeBuilder(new SearchSourceBuilder.PointInTimeBuilder("id", TimeValue.timeValueHours(1)));
TimeValue keepAlive = randomBoolean() ? TimeValue.timeValueHours(1) : null;
searchSourceBuilder.pointInTimeBuilder(new SearchSourceBuilder.PointInTimeBuilder("id", keepAlive));
XContentBuilder builder = XContentFactory.contentBuilder(xContentType);
searchSourceBuilder.toXContent(builder, ToXContent.EMPTY_PARAMS);
BytesReference bytes = BytesReference.bytes(builder);
@ -394,9 +395,14 @@ public class SearchSourceBuilderTests extends AbstractSearchTestCase {
assertEquals(1, sourceAsMap.size());
@SuppressWarnings("unchecked")
Map<String, Object> pit = (Map<String, Object>) sourceAsMap.get("pit");
assertEquals(2, pit.size());
assertEquals("id", pit.get("id"));
assertEquals("1h", pit.get("keep_alive"));
if (keepAlive != null) {
assertEquals("1h", pit.get("keep_alive"));
assertEquals(2, pit.size());
} else {
assertNull(pit.get("keep_alive"));
assertEquals(1, pit.size());
}
}
public void testParseIndicesBoost() throws IOException {

View File

@ -374,8 +374,8 @@ public class RandomSearchRequestGenerator {
builder.collapse(randomCollapseBuilder.get());
}
if (randomBoolean()) {
builder.pointInTimeBuilder(new SearchSourceBuilder.PointInTimeBuilder(randomAlphaOfLengthBetween(3, 10),
TimeValue.timeValueMinutes(randomIntBetween(1, 60))));
TimeValue keepAlive = randomBoolean() ? TimeValue.timeValueMinutes(randomIntBetween(1, 60)) : null;
builder.pointInTimeBuilder(new SearchSourceBuilder.PointInTimeBuilder(randomAlphaOfLengthBetween(3, 10), keepAlive));
}
return builder;
}

View File

@ -86,7 +86,6 @@ setup:
search_after: [24, 172]
pit:
id: "$point_in_time_id"
keep_alive: 1m
- match: {hits.total: 3 }
- length: {hits.hits: 1 }
@ -106,7 +105,6 @@ setup:
search_after: [18, 42]
pit:
id: "$point_in_time_id"
keep_alive: 1m
- match: {hits.total: 3}
- length: {hits.hits: 1 }