mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-04-24 15:17:30 -04:00
Do not fail the transform if pit search fails with index not found as a result of an index that got deleted via ILM, if that index is part of a search that selects indices using a wildcard, e.g. logs-*. If pit search fails, the search is retried using search without a pit context. The 2nd search might fail if the source targets an explicit index. In addition the usage of the pit API can not be disabled by transform. fixes elastic#81252 relates elastic#81256
This commit is contained in:
parent
5e0003fe66
commit
969e5655ef
15 changed files with 372 additions and 40 deletions
|
@ -26,6 +26,7 @@ public class SettingsConfig implements ToXContentObject {
|
|||
private static final ParseField DOCS_PER_SECOND = new ParseField("docs_per_second");
|
||||
private static final ParseField DATES_AS_EPOCH_MILLIS = new ParseField("dates_as_epoch_millis");
|
||||
private static final ParseField ALIGN_CHECKPOINTS = new ParseField("align_checkpoints");
|
||||
private static final ParseField USE_PIT = new ParseField("use_point_in_time");
|
||||
private static final int DEFAULT_MAX_PAGE_SEARCH_SIZE = -1;
|
||||
private static final float DEFAULT_DOCS_PER_SECOND = -1F;
|
||||
|
||||
|
@ -35,15 +36,19 @@ public class SettingsConfig implements ToXContentObject {
|
|||
// use an integer as we need to code 4 states: true, false, null (unchanged), default (defined server side)
|
||||
private static final int DEFAULT_ALIGN_CHECKPOINTS = -1;
|
||||
|
||||
// use an integer as we need to code 4 states: true, false, null (unchanged), default (defined server side)
|
||||
private static final int DEFAULT_USE_PIT = -1;
|
||||
|
||||
private final Integer maxPageSearchSize;
|
||||
private final Float docsPerSecond;
|
||||
private final Integer datesAsEpochMillis;
|
||||
private final Integer alignCheckpoints;
|
||||
private final Integer usePit;
|
||||
|
||||
private static final ConstructingObjectParser<SettingsConfig, Void> PARSER = new ConstructingObjectParser<>(
|
||||
"settings_config",
|
||||
true,
|
||||
args -> new SettingsConfig((Integer) args[0], (Float) args[1], (Integer) args[2], (Integer) args[3])
|
||||
args -> new SettingsConfig((Integer) args[0], (Float) args[1], (Integer) args[2], (Integer) args[3], (Integer) args[4])
|
||||
);
|
||||
|
||||
static {
|
||||
|
@ -63,17 +68,25 @@ public class SettingsConfig implements ToXContentObject {
|
|||
ALIGN_CHECKPOINTS,
|
||||
ValueType.BOOLEAN_OR_NULL
|
||||
);
|
||||
// this boolean requires 4 possible values: true, false, not_specified, default, therefore using a custom parser
|
||||
PARSER.declareField(
|
||||
optionalConstructorArg(),
|
||||
p -> p.currentToken() == XContentParser.Token.VALUE_NULL ? DEFAULT_USE_PIT : p.booleanValue() ? 1 : 0,
|
||||
USE_PIT,
|
||||
ValueType.BOOLEAN_OR_NULL
|
||||
);
|
||||
}
|
||||
|
||||
public static SettingsConfig fromXContent(final XContentParser parser) {
|
||||
return PARSER.apply(parser, null);
|
||||
}
|
||||
|
||||
SettingsConfig(Integer maxPageSearchSize, Float docsPerSecond, Integer datesAsEpochMillis, Integer alignCheckpoints) {
|
||||
SettingsConfig(Integer maxPageSearchSize, Float docsPerSecond, Integer datesAsEpochMillis, Integer alignCheckpoints, Integer usePit) {
|
||||
this.maxPageSearchSize = maxPageSearchSize;
|
||||
this.docsPerSecond = docsPerSecond;
|
||||
this.datesAsEpochMillis = datesAsEpochMillis;
|
||||
this.alignCheckpoints = alignCheckpoints;
|
||||
this.usePit = usePit;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -107,6 +120,13 @@ public class SettingsConfig implements ToXContentObject {
|
|||
builder.field(ALIGN_CHECKPOINTS.getPreferredName(), alignCheckpoints > 0 ? true : false);
|
||||
}
|
||||
}
|
||||
if (usePit != null) {
|
||||
if (usePit.equals(DEFAULT_USE_PIT)) {
|
||||
builder.field(USE_PIT.getPreferredName(), (Boolean) null);
|
||||
} else {
|
||||
builder.field(USE_PIT.getPreferredName(), usePit > 0 ? true : false);
|
||||
}
|
||||
}
|
||||
builder.endObject();
|
||||
return builder;
|
||||
}
|
||||
|
@ -127,6 +147,10 @@ public class SettingsConfig implements ToXContentObject {
|
|||
return alignCheckpoints != null ? alignCheckpoints > 0 : null;
|
||||
}
|
||||
|
||||
public Boolean getUsePit() {
|
||||
return usePit != null ? usePit > 0 : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (other == this) {
|
||||
|
@ -140,12 +164,13 @@ public class SettingsConfig implements ToXContentObject {
|
|||
return Objects.equals(maxPageSearchSize, that.maxPageSearchSize)
|
||||
&& Objects.equals(docsPerSecond, that.docsPerSecond)
|
||||
&& Objects.equals(datesAsEpochMillis, that.datesAsEpochMillis)
|
||||
&& Objects.equals(alignCheckpoints, that.alignCheckpoints);
|
||||
&& Objects.equals(alignCheckpoints, that.alignCheckpoints)
|
||||
&& Objects.equals(usePit, that.usePit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(maxPageSearchSize, docsPerSecond, datesAsEpochMillis, alignCheckpoints);
|
||||
return Objects.hash(maxPageSearchSize, docsPerSecond, datesAsEpochMillis, alignCheckpoints, usePit);
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
|
@ -157,6 +182,7 @@ public class SettingsConfig implements ToXContentObject {
|
|||
private Float docsPerSecond;
|
||||
private Integer datesAsEpochMillis;
|
||||
private Integer alignCheckpoints;
|
||||
private Integer usePit;
|
||||
|
||||
/**
|
||||
* Sets the paging maximum paging maxPageSearchSize that transform can use when
|
||||
|
@ -215,8 +241,23 @@ public class SettingsConfig implements ToXContentObject {
|
|||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the point in time API should be used for search.
|
||||
* Point in time is a more resource friendly way to query. It is used by default. In case of problems
|
||||
* you can disable the point in time API usage with this setting.
|
||||
*
|
||||
* An explicit `null` resets to default.
|
||||
*
|
||||
* @param usePit true if the point in time API should be used.
|
||||
* @return the {@link Builder} with usePit set.
|
||||
*/
|
||||
public Builder setUsePit(Boolean usePit) {
|
||||
this.usePit = usePit == null ? DEFAULT_USE_PIT : usePit ? 1 : 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SettingsConfig build() {
|
||||
return new SettingsConfig(maxPageSearchSize, docsPerSecond, datesAsEpochMillis, alignCheckpoints);
|
||||
return new SettingsConfig(maxPageSearchSize, docsPerSecond, datesAsEpochMillis, alignCheckpoints, usePit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@ public class SettingsConfigTests extends AbstractXContentTestCase<SettingsConfig
|
|||
randomBoolean() ? null : randomIntBetween(10, 10_000),
|
||||
randomBoolean() ? null : randomFloat(),
|
||||
randomBoolean() ? null : randomIntBetween(-1, 1),
|
||||
randomBoolean() ? null : randomIntBetween(-1, 1),
|
||||
randomBoolean() ? null : randomIntBetween(-1, 1)
|
||||
);
|
||||
}
|
||||
|
@ -74,6 +75,7 @@ public class SettingsConfigTests extends AbstractXContentTestCase<SettingsConfig
|
|||
assertNull(settingsAsMap.getOrDefault("docs_per_second", "not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("dates_as_epoch_millis", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("align_checkpoints", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("use_point_in_time", "not_set"), equalTo("not_set"));
|
||||
|
||||
config = fromString("{\"dates_as_epoch_millis\" : null}");
|
||||
assertFalse(config.getDatesAsEpochMillis());
|
||||
|
@ -83,6 +85,7 @@ public class SettingsConfigTests extends AbstractXContentTestCase<SettingsConfig
|
|||
assertThat(settingsAsMap.getOrDefault("docs_per_second", "not_set"), equalTo("not_set"));
|
||||
assertNull(settingsAsMap.getOrDefault("dates_as_epoch_millis", "not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("align_checkpoints", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("use_point_in_time", "not_set"), equalTo("not_set"));
|
||||
|
||||
config = fromString("{\"align_checkpoints\" : null}");
|
||||
assertFalse(config.getAlignCheckpoints());
|
||||
|
@ -92,6 +95,10 @@ public class SettingsConfigTests extends AbstractXContentTestCase<SettingsConfig
|
|||
assertThat(settingsAsMap.getOrDefault("docs_per_second", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("dates_as_epoch_millis", "not_set"), equalTo("not_set"));
|
||||
assertNull(settingsAsMap.getOrDefault("align_checkpoints", "not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("use_point_in_time", "not_set"), equalTo("not_set"));
|
||||
|
||||
config = fromString("{\"use_point_in_time\" : null}");
|
||||
assertFalse(config.getUsePit());
|
||||
}
|
||||
|
||||
public void testExplicitNullOnWriteBuilder() throws IOException {
|
||||
|
@ -104,6 +111,7 @@ public class SettingsConfigTests extends AbstractXContentTestCase<SettingsConfig
|
|||
assertThat(settingsAsMap.getOrDefault("docs_per_second", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("dates_as_epoch_millis", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("align_checkpoints", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("use_point_in_time", "not_set"), equalTo("not_set"));
|
||||
|
||||
SettingsConfig emptyConfig = new SettingsConfig.Builder().build();
|
||||
assertNull(emptyConfig.getMaxPageSearchSize());
|
||||
|
@ -121,6 +129,7 @@ public class SettingsConfigTests extends AbstractXContentTestCase<SettingsConfig
|
|||
assertNull(settingsAsMap.getOrDefault("docs_per_second", "not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("dates_as_epoch_millis", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("align_checkpoints", "not_set"), equalTo("not_set"));
|
||||
assertThat(settingsAsMap.getOrDefault("use_point_in_time", "not_set"), equalTo("not_set"));
|
||||
|
||||
config = new SettingsConfig.Builder().setDatesAsEpochMillis(null).build();
|
||||
// returns false, however it's `null` as in "use default", checked next
|
||||
|
|
|
@ -24,6 +24,7 @@ public class SettingsConfigTests extends AbstractResponseTestCase<
|
|||
randomBoolean() ? null : randomIntBetween(10, 10_000),
|
||||
randomBoolean() ? null : randomFloat(),
|
||||
randomBoolean() ? null : randomIntBetween(0, 1),
|
||||
randomBoolean() ? null : randomIntBetween(0, 1),
|
||||
randomBoolean() ? null : randomIntBetween(0, 1)
|
||||
);
|
||||
}
|
||||
|
@ -36,6 +37,7 @@ public class SettingsConfigTests extends AbstractResponseTestCase<
|
|||
assertEquals(serverTestInstance.getDocsPerSecond(), clientInstance.getDocsPerSecond());
|
||||
assertEquals(serverTestInstance.getDatesAsEpochMillis(), clientInstance.getDatesAsEpochMillis());
|
||||
assertEquals(serverTestInstance.getAlignCheckpoints(), clientInstance.getAlignCheckpoints());
|
||||
assertEquals(serverTestInstance.getUsePit(), clientInstance.getUsePit());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue