@@ -940,69 +940,142 @@ public void testILMRolloverRetriesOnReadOnlyBlock() throws Exception {
940
940
assertBusy (() -> assertThat (getStepKeyForIndex (firstIndex ), equalTo (TerminalPolicyStep .KEY )));
941
941
}
942
942
943
- public void testILMRolloverOnManuallyRolledIndex () throws Exception {
944
- String originalIndex = index + "-000001" ;
945
- String secondIndex = index + "-000002" ;
946
- String thirdIndex = index + "-000003" ;
947
-
948
- // Set up a policy with rollover
949
- createNewSingletonPolicy ("hot" , new RolloverAction (null , null , 2L ));
950
- Request createIndexTemplate = new Request ("PUT" , "_template/rolling_indexes" );
951
- createIndexTemplate .setJsonEntity ("{" +
952
- "\" index_patterns\" : [\" " + index + "-*\" ], \n " +
953
- " \" settings\" : {\n " +
954
- " \" number_of_shards\" : 1,\n " +
955
- " \" number_of_replicas\" : 0,\n " +
956
- " \" index.lifecycle.name\" : \" " + policy + "\" , \n " +
957
- " \" index.lifecycle.rollover_alias\" : \" alias\" \n " +
958
- " }\n " +
959
- "}" );
960
- client ().performRequest (createIndexTemplate );
961
-
962
- createIndexWithSettings (
963
- originalIndex ,
964
- Settings .builder ().put (IndexMetaData .SETTING_NUMBER_OF_SHARDS , 1 )
965
- .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 0 ),
966
- true
967
- );
968
-
969
- // Index a document
970
- index (client (), originalIndex , "1" , "foo" , "bar" );
971
- Request refreshOriginalIndex = new Request ("POST" , "/" + originalIndex + "/_refresh" );
972
- client ().performRequest (refreshOriginalIndex );
973
-
974
- // Manual rollover
975
- Request rolloverRequest = new Request ("POST" , "/alias/_rollover" );
976
- rolloverRequest .setJsonEntity ("{\n " +
977
- " \" conditions\" : {\n " +
978
- " \" max_docs\" : \" 1\" \n " +
979
- " }\n " +
980
- "}"
981
- );
982
- client ().performRequest (rolloverRequest );
983
- assertBusy (() -> assertTrue (indexExists (secondIndex )));
984
-
985
- // Index another document into the original index so the ILM rollover policy condition is met
986
- index (client (), originalIndex , "2" , "foo" , "bar" );
987
- client ().performRequest (refreshOriginalIndex );
988
-
989
- // Wait for the rollover policy to execute
990
- assertBusy (() -> assertThat (getStepKeyForIndex (originalIndex ), equalTo (TerminalPolicyStep .KEY )));
991
-
992
- // ILM should manage the second index after attempting (and skipping) rolling the original index
993
- assertBusy (() -> assertTrue ((boolean ) explainIndex (secondIndex ).getOrDefault ("managed" , true )));
994
-
995
- // index some documents to trigger an ILM rollover
996
- index (client (), "alias" , "1" , "foo" , "bar" );
997
- index (client (), "alias" , "2" , "foo" , "bar" );
998
- index (client (), "alias" , "3" , "foo" , "bar" );
999
- Request refreshSecondIndex = new Request ("POST" , "/" + secondIndex + "/_refresh" );
1000
- client ().performRequest (refreshSecondIndex ).getStatusLine ();
1001
-
1002
- // ILM should rollover the second index even though it skipped the first one
1003
- assertBusy (() -> assertThat (getStepKeyForIndex (secondIndex ), equalTo (TerminalPolicyStep .KEY )));
1004
- assertBusy (() -> assertTrue (indexExists (thirdIndex )));
1005
- }
943
+ public void testILMRolloverOnManuallyRolledIndex () throws Exception {
944
+ String originalIndex = index + "-000001" ;
945
+ String secondIndex = index + "-000002" ;
946
+ String thirdIndex = index + "-000003" ;
947
+
948
+ // Set up a policy with rollover
949
+ createNewSingletonPolicy ("hot" , new RolloverAction (null , null , 2L ));
950
+ Request createIndexTemplate = new Request ("PUT" , "_template/rolling_indexes" );
951
+ createIndexTemplate .setJsonEntity ("{" +
952
+ "\" index_patterns\" : [\" " + index + "-*\" ], \n " +
953
+ " \" settings\" : {\n " +
954
+ " \" number_of_shards\" : 1,\n " +
955
+ " \" number_of_replicas\" : 0,\n " +
956
+ " \" index.lifecycle.name\" : \" " + policy + "\" , \n " +
957
+ " \" index.lifecycle.rollover_alias\" : \" alias\" \n " +
958
+ " }\n " +
959
+ "}" );
960
+ client ().performRequest (createIndexTemplate );
961
+
962
+ createIndexWithSettings (
963
+ originalIndex ,
964
+ Settings .builder ().put (IndexMetaData .SETTING_NUMBER_OF_SHARDS , 1 )
965
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 0 ),
966
+ true
967
+ );
968
+
969
+ // Index a document
970
+ index (client (), originalIndex , "1" , "foo" , "bar" );
971
+ Request refreshOriginalIndex = new Request ("POST" , "/" + originalIndex + "/_refresh" );
972
+ client ().performRequest (refreshOriginalIndex );
973
+
974
+ // Manual rollover
975
+ Request rolloverRequest = new Request ("POST" , "/alias/_rollover" );
976
+ rolloverRequest .setJsonEntity ("{\n " +
977
+ " \" conditions\" : {\n " +
978
+ " \" max_docs\" : \" 1\" \n " +
979
+ " }\n " +
980
+ "}"
981
+ );
982
+ client ().performRequest (rolloverRequest );
983
+ assertBusy (() -> assertTrue (indexExists (secondIndex )));
984
+
985
+ // Index another document into the original index so the ILM rollover policy condition is met
986
+ index (client (), originalIndex , "2" , "foo" , "bar" );
987
+ client ().performRequest (refreshOriginalIndex );
988
+
989
+ // Wait for the rollover policy to execute
990
+ assertBusy (() -> assertThat (getStepKeyForIndex (originalIndex ), equalTo (TerminalPolicyStep .KEY )));
991
+
992
+ // ILM should manage the second index after attempting (and skipping) rolling the original index
993
+ assertBusy (() -> assertTrue ((boolean ) explainIndex (secondIndex ).getOrDefault ("managed" , true )));
994
+
995
+ // index some documents to trigger an ILM rollover
996
+ index (client (), "alias" , "1" , "foo" , "bar" );
997
+ index (client (), "alias" , "2" , "foo" , "bar" );
998
+ index (client (), "alias" , "3" , "foo" , "bar" );
999
+ Request refreshSecondIndex = new Request ("POST" , "/" + secondIndex + "/_refresh" );
1000
+ client ().performRequest (refreshSecondIndex ).getStatusLine ();
1001
+
1002
+ // ILM should rollover the second index even though it skipped the first one
1003
+ assertBusy (() -> assertThat (getStepKeyForIndex (secondIndex ), equalTo (TerminalPolicyStep .KEY )));
1004
+ assertBusy (() -> assertTrue (indexExists (thirdIndex )));
1005
+ }
1006
+
1007
+ public void testRolloverStepRetriesUntilRolledOverIndexIsDeleted () throws Exception {
1008
+ String index = this .index + "-000001" ;
1009
+ String rolledIndex = this .index + "-000002" ;
1010
+
1011
+ createNewSingletonPolicy ("hot" , new RolloverAction (null , TimeValue .timeValueSeconds (1 ), null ));
1012
+
1013
+ // create the rolled index so the rollover of the first index fails
1014
+ createIndexWithSettings (
1015
+ rolledIndex ,
1016
+ Settings .builder ().put (IndexMetaData .SETTING_NUMBER_OF_SHARDS , 1 )
1017
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 0 )
1018
+ .put (RolloverAction .LIFECYCLE_ROLLOVER_ALIAS , "alias" ),
1019
+ false
1020
+ );
1021
+
1022
+ createIndexWithSettings (
1023
+ index ,
1024
+ Settings .builder ().put (IndexMetaData .SETTING_NUMBER_OF_SHARDS , 1 )
1025
+ .put (IndexMetaData .SETTING_NUMBER_OF_REPLICAS , 0 )
1026
+ .put (LifecycleSettings .LIFECYCLE_NAME , policy )
1027
+ .put (RolloverAction .LIFECYCLE_ROLLOVER_ALIAS , "alias" ),
1028
+ true
1029
+ );
1030
+
1031
+ assertBusy (() -> assertThat ((Integer ) explainIndex (index ).get (FAILED_STEP_RETRY_COUNT_FIELD ), greaterThanOrEqualTo (1 )), 30 ,
1032
+ TimeUnit .SECONDS );
1033
+
1034
+ Request moveToStepRequest = new Request ("POST" , "_ilm/move/" + index );
1035
+ moveToStepRequest .setJsonEntity ("{\n " +
1036
+ " \" current_step\" : {\n " +
1037
+ " \" phase\" : \" hot\" ,\n " +
1038
+ " \" action\" : \" rollover\" ,\n " +
1039
+ " \" name\" : \" check-rollover-ready\" \n " +
1040
+ " },\n " +
1041
+ " \" next_step\" : {\n " +
1042
+ " \" phase\" : \" hot\" ,\n " +
1043
+ " \" action\" : \" rollover\" ,\n " +
1044
+ " \" name\" : \" attempt-rollover\" \n " +
1045
+ " }\n " +
1046
+ "}" );
1047
+
1048
+ // Using {@link #waitUntil} here as ILM moves back and forth between the {@link WaitForRolloverReadyStep} step and
1049
+ // {@link org.elasticsearch.xpack.core.ilm.ErrorStep} in order to retry the failing step. As {@link #assertBusy}
1050
+ // increases the wait time between calls exponentially, we might miss the window where the policy is on
1051
+ // {@link WaitForRolloverReadyStep} and the move to `attempt-rollover` request will not be successful.
1052
+ waitUntil (() -> {
1053
+ try {
1054
+ return client ().performRequest (moveToStepRequest ).getStatusLine ().getStatusCode () == 200 ;
1055
+ } catch (IOException e ) {
1056
+ return false ;
1057
+ }
1058
+ }, 30 , TimeUnit .SECONDS );
1059
+
1060
+ // Similar to above, using {@link #waitUntil} as we want to make sure the `attempt-rollover` step started failing and is being
1061
+ // retried (which means ILM moves back and forth between the `attempt-rollover` step and the `error` step)
1062
+ waitUntil (() -> {
1063
+ try {
1064
+ Map <String , Object > explainIndexResponse = explainIndex (index );
1065
+ String step = (String ) explainIndexResponse .get ("step" );
1066
+ Integer retryCount = (Integer ) explainIndexResponse .get (FAILED_STEP_RETRY_COUNT_FIELD );
1067
+ return step != null && step .equals ("attempt-rollover" ) && retryCount != null && retryCount >= 1 ;
1068
+ } catch (IOException e ) {
1069
+ return false ;
1070
+ }
1071
+ }, 30 , TimeUnit .SECONDS );
1072
+
1073
+ deleteIndex (rolledIndex );
1074
+
1075
+ // the rollover step should eventually succeed
1076
+ assertBusy (() -> assertThat (indexExists (rolledIndex ), is (true )));
1077
+ assertBusy (() -> assertThat (getStepKeyForIndex (index ), equalTo (TerminalPolicyStep .KEY )));
1078
+ }
1006
1079
1007
1080
public void testHistoryIsWrittenWithSuccess () throws Exception {
1008
1081
String index = "index" ;
0 commit comments