Skip to content

Commit 4b7b97a

Browse files
authored
Fix some lazy rollover code (#124153) (#124307)
The main goal of the PR is to fix the "rollover failed" log in the `IndexTemplateRegistry`. We were logging this on every upgrade because `rolloverResponse.isRolledOver()` is always `false` when we do a lazy rollover request - which is the default for index template updates. While I was looking at this, I noticed we don't actually return early when we process a lazy rollover _dry run_. The end result happened to be ok (i.e. side-effects and response), but I figured I might as well fix the behavior to return early. Finally, we add an `INFO` log in the lazy rollover action to aid the debugging process. (cherry picked from commit 9544204) # Conflicts: # server/src/main/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverAction.java
1 parent 2512d66 commit 4b7b97a

File tree

4 files changed

+103
-54
lines changed

4 files changed

+103
-54
lines changed

server/src/main/java/org/elasticsearch/action/admin/indices/rollover/LazyRolloverAction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,11 @@ public ClusterState executeTask(
257257

258258
final var rolloverIndexName = rolloverResult.rolloverIndexName();
259259
final var sourceIndexName = rolloverResult.sourceIndexName();
260+
logger.info(
261+
"rolling over data stream [{}] to index [{}] because it was marked for lazy rollover",
262+
dataStream.getName(),
263+
rolloverIndexName
264+
);
260265

261266
final var waitForActiveShardsTimeout = rolloverRequest.masterNodeTimeout().millis() < 0
262267
? null

server/src/main/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverAction.java

Lines changed: 62 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -212,44 +212,17 @@ protected void masterOperation(
212212
final String trialRolloverIndexName = trialRolloverNames.rolloverName();
213213
MetadataCreateIndexService.validateIndexName(trialRolloverIndexName, metadata, clusterState.routingTable());
214214

215-
boolean isDataStream = metadata.dataStreams().containsKey(resolvedRolloverTarget.resource());
216215
if (rolloverRequest.isLazy()) {
217-
if (isDataStream == false || rolloverRequest.getConditions().hasConditions()) {
218-
String message;
219-
if (isDataStream) {
220-
message = "Lazy rollover can be used only without any conditions."
221-
+ " Please remove the conditions from the request body or the query parameter 'lazy'.";
222-
} else if (rolloverRequest.getConditions().hasConditions() == false) {
223-
message = "Lazy rollover can be applied only on a data stream." + " Please remove the query parameter 'lazy'.";
224-
} else {
225-
message = "Lazy rollover can be applied only on a data stream with no conditions."
226-
+ " Please remove the query parameter 'lazy'.";
227-
}
228-
listener.onFailure(new IllegalArgumentException(message));
229-
return;
230-
}
231-
if (rolloverRequest.isDryRun() == false) {
232-
metadataDataStreamsService.setRolloverOnWrite(
233-
resolvedRolloverTarget.resource(),
234-
true,
235-
targetFailureStore,
236-
rolloverRequest.ackTimeout(),
237-
rolloverRequest.masterNodeTimeout(),
238-
listener.map(
239-
response -> new RolloverResponse(
240-
trialSourceIndexName,
241-
trialRolloverIndexName,
242-
Map.of(),
243-
false,
244-
false,
245-
response.isAcknowledged(),
246-
false,
247-
response.isAcknowledged()
248-
)
249-
)
250-
);
251-
return;
252-
}
216+
markForLazyRollover(
217+
rolloverRequest,
218+
listener,
219+
metadata,
220+
resolvedRolloverTarget,
221+
targetFailureStore,
222+
trialSourceIndexName,
223+
trialRolloverIndexName
224+
);
225+
return;
253226
}
254227

255228
final IndexAbstraction rolloverTargetAbstraction = clusterState.metadata()
@@ -345,7 +318,7 @@ protected void masterOperation(
345318
false,
346319
false,
347320
false,
348-
rolloverRequest.isLazy()
321+
false
349322
);
350323

351324
// If this is a dry run, return with the results without invoking a cluster state update
@@ -373,6 +346,57 @@ protected void masterOperation(
373346
);
374347
}
375348

349+
private void markForLazyRollover(
350+
RolloverRequest rolloverRequest,
351+
ActionListener<RolloverResponse> listener,
352+
Metadata metadata,
353+
ResolvedExpression resolvedRolloverTarget,
354+
boolean targetFailureStore,
355+
String trialSourceIndexName,
356+
String trialRolloverIndexName
357+
) {
358+
boolean isDataStream = metadata.dataStreams().containsKey(resolvedRolloverTarget.resource());
359+
if (isDataStream == false || rolloverRequest.getConditions().hasConditions()) {
360+
String message;
361+
if (isDataStream) {
362+
message = "Lazy rollover can be used only without any conditions."
363+
+ " Please remove the conditions from the request body or the query parameter 'lazy'.";
364+
} else if (rolloverRequest.getConditions().hasConditions() == false) {
365+
message = "Lazy rollover can be applied only on a data stream. Please remove the query parameter 'lazy'.";
366+
} else {
367+
message = "Lazy rollover can be applied only on a data stream with no conditions."
368+
+ " Please remove the query parameter 'lazy'.";
369+
}
370+
listener.onFailure(new IllegalArgumentException(message));
371+
return;
372+
}
373+
if (rolloverRequest.isDryRun()) {
374+
listener.onResponse(
375+
new RolloverResponse(trialSourceIndexName, trialRolloverIndexName, Map.of(), true, false, false, false, true)
376+
);
377+
return;
378+
}
379+
metadataDataStreamsService.setRolloverOnWrite(
380+
resolvedRolloverTarget.resource(),
381+
true,
382+
targetFailureStore,
383+
rolloverRequest.ackTimeout(),
384+
rolloverRequest.masterNodeTimeout(),
385+
listener.map(
386+
response -> new RolloverResponse(
387+
trialSourceIndexName,
388+
trialRolloverIndexName,
389+
Map.of(),
390+
false,
391+
false,
392+
response.isAcknowledged(),
393+
false,
394+
true
395+
)
396+
)
397+
);
398+
}
399+
376400
private void initializeFailureStore(
377401
RolloverRequest rolloverRequest,
378402
ActionListener<RolloverResponse> listener,

server/src/test/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverActionTests.java

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -464,19 +464,39 @@ public void testLazyRollover() throws Exception {
464464
mockMetadataDataStreamService,
465465
dataStreamAutoShardingService
466466
);
467-
final PlainActionFuture<RolloverResponse> future = new PlainActionFuture<>();
468-
RolloverRequest rolloverRequest = new RolloverRequest("logs-ds", null);
469-
rolloverRequest.lazy(true);
470-
transportRolloverAction.masterOperation(mock(CancellableTask.class), rolloverRequest, stateBefore, future);
471-
RolloverResponse rolloverResponse = future.actionGet();
472-
assertThat(rolloverResponse.getOldIndex(), equalTo(".ds-logs-ds-000001"));
473-
assertThat(rolloverResponse.getNewIndex(), Matchers.startsWith(".ds-logs-ds-"));
474-
assertThat(rolloverResponse.getNewIndex(), Matchers.endsWith("-000002"));
475-
assertThat(rolloverResponse.isLazy(), equalTo(true));
476-
assertThat(rolloverResponse.isDryRun(), equalTo(false));
477-
assertThat(rolloverResponse.isRolledOver(), equalTo(false));
478-
assertThat(rolloverResponse.getConditionStatus().size(), equalTo(0));
479-
assertThat(rolloverResponse.isAcknowledged(), is(true));
467+
{
468+
// Regular lazy rollover
469+
final PlainActionFuture<RolloverResponse> future = new PlainActionFuture<>();
470+
RolloverRequest rolloverRequest = new RolloverRequest("logs-ds", null);
471+
rolloverRequest.lazy(true);
472+
transportRolloverAction.masterOperation(mock(CancellableTask.class), rolloverRequest, stateBefore, future);
473+
RolloverResponse rolloverResponse = future.actionGet();
474+
assertThat(rolloverResponse.getOldIndex(), equalTo(".ds-logs-ds-000001"));
475+
assertThat(rolloverResponse.getNewIndex(), Matchers.startsWith(".ds-logs-ds-"));
476+
assertThat(rolloverResponse.getNewIndex(), Matchers.endsWith("-000002"));
477+
assertThat(rolloverResponse.isLazy(), equalTo(true));
478+
assertThat(rolloverResponse.isDryRun(), equalTo(false));
479+
assertThat(rolloverResponse.isRolledOver(), equalTo(false));
480+
assertThat(rolloverResponse.getConditionStatus().size(), equalTo(0));
481+
assertThat(rolloverResponse.isAcknowledged(), is(true));
482+
}
483+
{
484+
// Dry-run lazy rollover
485+
final PlainActionFuture<RolloverResponse> future = new PlainActionFuture<>();
486+
RolloverRequest rolloverRequest = new RolloverRequest("logs-ds", null);
487+
rolloverRequest.lazy(true);
488+
rolloverRequest.dryRun(true);
489+
transportRolloverAction.masterOperation(mock(CancellableTask.class), rolloverRequest, stateBefore, future);
490+
RolloverResponse rolloverResponse = future.actionGet();
491+
assertThat(rolloverResponse.getOldIndex(), equalTo(".ds-logs-ds-000001"));
492+
assertThat(rolloverResponse.getNewIndex(), Matchers.startsWith(".ds-logs-ds-"));
493+
assertThat(rolloverResponse.getNewIndex(), Matchers.endsWith("-000002"));
494+
assertThat(rolloverResponse.isLazy(), equalTo(true));
495+
assertThat(rolloverResponse.isDryRun(), equalTo(true));
496+
assertThat(rolloverResponse.isRolledOver(), equalTo(false));
497+
assertThat(rolloverResponse.getConditionStatus().size(), equalTo(0));
498+
assertThat(rolloverResponse.isAcknowledged(), is(false));
499+
}
480500
}
481501

482502
public void testLazyRolloverFails() throws Exception {

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/template/IndexTemplateRegistry.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.elasticsearch.cluster.metadata.Template;
3535
import org.elasticsearch.cluster.node.DiscoveryNode;
3636
import org.elasticsearch.cluster.service.ClusterService;
37+
import org.elasticsearch.common.Strings;
3738
import org.elasticsearch.common.regex.Regex;
3839
import org.elasticsearch.common.settings.Settings;
3940
import org.elasticsearch.core.Nullable;
@@ -842,9 +843,8 @@ public void onFailure(Exception e) {
842843

843844
void onRolloversBulkResponse(Collection<RolloverResponse> rolloverResponses) {
844845
for (RolloverResponse rolloverResponse : rolloverResponses) {
845-
if (rolloverResponse.isRolledOver() == false) {
846-
logger.warn("rollover of the [{}] index [{}] failed", getOrigin(), rolloverResponse.getOldIndex());
847-
}
846+
assert rolloverResponse.isLazy() && rolloverResponse.isRolledOver() == false
847+
: Strings.format("Expected rollover of the [%s] index [%s] to be lazy", getOrigin(), rolloverResponse.getOldIndex());
848848
}
849849
}
850850

0 commit comments

Comments
 (0)