|
@@ -109,61 +109,85 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<Reque
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- submitUnbatchedTask("put-lifecycle-" + request.getPolicy().getName(), new AckedClusterStateUpdateTask(request, listener) {
|
|
|
- @Override
|
|
|
- public ClusterState execute(ClusterState currentState) throws Exception {
|
|
|
- final IndexLifecycleMetadata currentMetadata = currentState.metadata()
|
|
|
- .custom(IndexLifecycleMetadata.TYPE, IndexLifecycleMetadata.EMPTY);
|
|
|
- final LifecyclePolicyMetadata existingPolicyMetadata = currentMetadata.getPolicyMetadatas()
|
|
|
- .get(request.getPolicy().getName());
|
|
|
+ submitUnbatchedTask(
|
|
|
+ "put-lifecycle-" + request.getPolicy().getName(),
|
|
|
+ new UpdateLifecyclePolicyTask(request, listener, licenseState, filteredHeaders, xContentRegistry, client)
|
|
|
+ );
|
|
|
+ }
|
|
|
|
|
|
- // Double-check for no-op in the state update task, in case it was changed/reset in the meantime
|
|
|
- if (isNoopUpdate(existingPolicyMetadata, request.getPolicy(), filteredHeaders)) {
|
|
|
- return currentState;
|
|
|
- }
|
|
|
+ public static class UpdateLifecyclePolicyTask extends AckedClusterStateUpdateTask {
|
|
|
+ private final Request request;
|
|
|
+ private final XPackLicenseState licenseState;
|
|
|
+ private final Map<String, String> filteredHeaders;
|
|
|
+ private final NamedXContentRegistry xContentRegistry;
|
|
|
+ private final Client client;
|
|
|
|
|
|
- validatePrerequisites(request.getPolicy(), currentState);
|
|
|
+ public UpdateLifecyclePolicyTask(
|
|
|
+ Request request,
|
|
|
+ ActionListener<AcknowledgedResponse> listener,
|
|
|
+ XPackLicenseState licenseState,
|
|
|
+ Map<String, String> filteredHeaders,
|
|
|
+ NamedXContentRegistry xContentRegistry,
|
|
|
+ Client client
|
|
|
+ ) {
|
|
|
+ super(request, listener);
|
|
|
+ this.request = request;
|
|
|
+ this.licenseState = licenseState;
|
|
|
+ this.filteredHeaders = filteredHeaders;
|
|
|
+ this.xContentRegistry = xContentRegistry;
|
|
|
+ this.client = client;
|
|
|
+ }
|
|
|
|
|
|
- ClusterState.Builder stateBuilder = ClusterState.builder(currentState);
|
|
|
- long nextVersion = (existingPolicyMetadata == null) ? 1L : existingPolicyMetadata.getVersion() + 1L;
|
|
|
- SortedMap<String, LifecyclePolicyMetadata> newPolicies = new TreeMap<>(currentMetadata.getPolicyMetadatas());
|
|
|
- LifecyclePolicyMetadata lifecyclePolicyMetadata = new LifecyclePolicyMetadata(
|
|
|
- request.getPolicy(),
|
|
|
- filteredHeaders,
|
|
|
- nextVersion,
|
|
|
- Instant.now().toEpochMilli()
|
|
|
- );
|
|
|
- LifecyclePolicyMetadata oldPolicy = newPolicies.put(lifecyclePolicyMetadata.getName(), lifecyclePolicyMetadata);
|
|
|
- if (oldPolicy == null) {
|
|
|
- logger.info("adding index lifecycle policy [{}]", request.getPolicy().getName());
|
|
|
- } else {
|
|
|
- logger.info("updating index lifecycle policy [{}]", request.getPolicy().getName());
|
|
|
- }
|
|
|
- IndexLifecycleMetadata newMetadata = new IndexLifecycleMetadata(newPolicies, currentMetadata.getOperationMode());
|
|
|
- stateBuilder.metadata(
|
|
|
- Metadata.builder(currentState.getMetadata()).putCustom(IndexLifecycleMetadata.TYPE, newMetadata).build()
|
|
|
- );
|
|
|
- ClusterState nonRefreshedState = stateBuilder.build();
|
|
|
- if (oldPolicy == null) {
|
|
|
+ @Override
|
|
|
+ public ClusterState execute(ClusterState currentState) throws Exception {
|
|
|
+ final IndexLifecycleMetadata currentMetadata = currentState.metadata()
|
|
|
+ .custom(IndexLifecycleMetadata.TYPE, IndexLifecycleMetadata.EMPTY);
|
|
|
+ final LifecyclePolicyMetadata existingPolicyMetadata = currentMetadata.getPolicyMetadatas().get(request.getPolicy().getName());
|
|
|
+
|
|
|
+ // Double-check for no-op in the state update task, in case it was changed/reset in the meantime
|
|
|
+ if (isNoopUpdate(existingPolicyMetadata, request.getPolicy(), filteredHeaders)) {
|
|
|
+ return currentState;
|
|
|
+ }
|
|
|
+
|
|
|
+ validatePrerequisites(request.getPolicy(), currentState, licenseState);
|
|
|
+
|
|
|
+ ClusterState.Builder stateBuilder = ClusterState.builder(currentState);
|
|
|
+ long nextVersion = (existingPolicyMetadata == null) ? 1L : existingPolicyMetadata.getVersion() + 1L;
|
|
|
+ SortedMap<String, LifecyclePolicyMetadata> newPolicies = new TreeMap<>(currentMetadata.getPolicyMetadatas());
|
|
|
+ LifecyclePolicyMetadata lifecyclePolicyMetadata = new LifecyclePolicyMetadata(
|
|
|
+ request.getPolicy(),
|
|
|
+ filteredHeaders,
|
|
|
+ nextVersion,
|
|
|
+ Instant.now().toEpochMilli()
|
|
|
+ );
|
|
|
+ LifecyclePolicyMetadata oldPolicy = newPolicies.put(lifecyclePolicyMetadata.getName(), lifecyclePolicyMetadata);
|
|
|
+ if (oldPolicy == null) {
|
|
|
+ logger.info("adding index lifecycle policy [{}]", request.getPolicy().getName());
|
|
|
+ } else {
|
|
|
+ logger.info("updating index lifecycle policy [{}]", request.getPolicy().getName());
|
|
|
+ }
|
|
|
+ IndexLifecycleMetadata newMetadata = new IndexLifecycleMetadata(newPolicies, currentMetadata.getOperationMode());
|
|
|
+ stateBuilder.metadata(Metadata.builder(currentState.getMetadata()).putCustom(IndexLifecycleMetadata.TYPE, newMetadata).build());
|
|
|
+ ClusterState nonRefreshedState = stateBuilder.build();
|
|
|
+ if (oldPolicy == null) {
|
|
|
+ return nonRefreshedState;
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ return updateIndicesForPolicy(
|
|
|
+ nonRefreshedState,
|
|
|
+ xContentRegistry,
|
|
|
+ client,
|
|
|
+ oldPolicy.getPolicy(),
|
|
|
+ lifecyclePolicyMetadata,
|
|
|
+ licenseState
|
|
|
+ );
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.warn(() -> "unable to refresh indices phase JSON for updated policy [" + oldPolicy.getName() + "]", e);
|
|
|
+ // Revert to the non-refreshed state
|
|
|
return nonRefreshedState;
|
|
|
- } else {
|
|
|
- try {
|
|
|
- return updateIndicesForPolicy(
|
|
|
- nonRefreshedState,
|
|
|
- xContentRegistry,
|
|
|
- client,
|
|
|
- oldPolicy.getPolicy(),
|
|
|
- lifecyclePolicyMetadata,
|
|
|
- licenseState
|
|
|
- );
|
|
|
- } catch (Exception e) {
|
|
|
- logger.warn(() -> "unable to refresh indices phase JSON for updated policy [" + oldPolicy.getName() + "]", e);
|
|
|
- // Revert to the non-refreshed state
|
|
|
- return nonRefreshedState;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@SuppressForbidden(reason = "legacy usage of unbatched task") // TODO add support for batching here
|
|
@@ -193,7 +217,7 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<Reque
|
|
|
* @param policy The lifecycle policy
|
|
|
* @param state The cluster state
|
|
|
*/
|
|
|
- private void validatePrerequisites(LifecyclePolicy policy, ClusterState state) {
|
|
|
+ private static void validatePrerequisites(LifecyclePolicy policy, ClusterState state, XPackLicenseState licenseState) {
|
|
|
List<Phase> phasesWithSearchableSnapshotActions = policy.getPhases()
|
|
|
.values()
|
|
|
.stream()
|