Browse Source

Remove endpoint for freezing indices (#78918)

Dan Hermann 4 years ago
parent
commit
4a36d5cd79
35 changed files with 205 additions and 770 deletions
  1. 4 25
      client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java
  2. 6 91
      client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java
  3. 8 0
      docs/java-rest/redirects.asciidoc
  4. 0 1
      docs/reference/data-streams/data-streams.asciidoc
  5. 0 34
      docs/reference/ilm/actions/ilm-freeze.asciidoc
  6. 1 1
      docs/reference/ilm/actions/ilm-searchable-snapshot.asciidoc
  7. 0 4
      docs/reference/ilm/ilm-actions.asciidoc
  8. 0 1
      docs/reference/ilm/ilm-index-lifecycle.asciidoc
  9. 5 6
      docs/reference/ilm/ilm-overview.asciidoc
  10. 3 5
      docs/reference/indices.asciidoc
  11. 0 62
      docs/reference/indices/apis/freeze.asciidoc
  12. 13 9
      docs/reference/indices/apis/unfreeze.asciidoc
  13. 3 5
      docs/reference/indices/index-mgmt.asciidoc
  14. 0 3
      docs/reference/indices/resolve.asciidoc
  15. 0 7
      docs/reference/mapping/params/eager-global-ordinals.asciidoc
  16. 26 10
      docs/reference/redirects.asciidoc
  17. 1 2
      docs/reference/search/search-your-data/long-running-searches.asciidoc
  18. 1 2
      docs/reference/search/search-your-data/search-your-data.asciidoc
  19. 1 1
      docs/reference/sql/endpoints/jdbc.asciidoc
  20. 3 3
      docs/reference/sql/language/indices.asciidoc
  21. 0 67
      rest-api-spec/src/main/resources/rest-api-spec/api/indices.freeze.json
  22. 5 0
      x-pack/plugin/build.gradle
  23. 2 6
      x-pack/plugin/frozen-indices/src/main/java/org/elasticsearch/xpack/frozen/rest/action/RestFreezeIndexAction.java
  24. 1 37
      x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java
  25. 2 0
      x-pack/plugin/sql/qa/server/multi-cluster-with-security/build.gradle
  26. 1 0
      x-pack/plugin/sql/qa/server/multi-node/build.gradle
  27. 1 0
      x-pack/plugin/sql/qa/server/security/build.gradle
  28. 2 0
      x-pack/plugin/sql/qa/server/single-node/build.gradle
  29. 0 8
      x-pack/plugin/sql/qa/server/src/main/java/org/elasticsearch/xpack/sql/qa/jdbc/DataLoader.java
  30. 0 186
      x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/indices.freeze/10_basic.yml
  31. 0 67
      x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/indices.freeze/20_stats.yml
  32. 0 65
      x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/indices.freeze/30_usage.yml
  33. 25 0
      x-pack/qa/freeze-plugin/build.gradle
  34. 85 0
      x-pack/qa/freeze-plugin/src/main/java/org/elasticsearch/plugin/freeze/FreezeIndexPlugin.java
  35. 6 62
      x-pack/qa/full-cluster-restart/src/test/java/org/elasticsearch/xpack/restart/FullClusterRestartIT.java

+ 4 - 25
client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java

@@ -42,7 +42,6 @@ import org.elasticsearch.action.support.IndicesOptions;
 import org.elasticsearch.action.support.WriteRequest;
 import org.elasticsearch.action.support.broadcast.BroadcastResponse;
 import org.elasticsearch.action.support.master.AcknowledgedResponse;
-import org.elasticsearch.client.core.ShardsAcknowledgedResponse;
 import org.elasticsearch.client.indices.AnalyzeRequest;
 import org.elasticsearch.client.indices.AnalyzeResponse;
 import org.elasticsearch.client.indices.CloseIndexRequest;
@@ -58,7 +57,6 @@ import org.elasticsearch.client.indices.DataStreamsStatsResponse.DataStreamStats
 import org.elasticsearch.client.indices.DeleteAliasRequest;
 import org.elasticsearch.client.indices.DeleteComposableIndexTemplateRequest;
 import org.elasticsearch.client.indices.DeleteDataStreamRequest;
-import org.elasticsearch.client.indices.FreezeIndexRequest;
 import org.elasticsearch.client.indices.GetComposableIndexTemplateRequest;
 import org.elasticsearch.client.indices.GetComposableIndexTemplatesResponse;
 import org.elasticsearch.client.indices.GetDataStreamRequest;
@@ -80,7 +78,6 @@ import org.elasticsearch.client.indices.ReloadAnalyzersRequest;
 import org.elasticsearch.client.indices.ReloadAnalyzersResponse;
 import org.elasticsearch.client.indices.SimulateIndexTemplateRequest;
 import org.elasticsearch.client.indices.SimulateIndexTemplateResponse;
-import org.elasticsearch.client.indices.UnfreezeIndexRequest;
 import org.elasticsearch.client.indices.rollover.RolloverRequest;
 import org.elasticsearch.client.indices.rollover.RolloverResponse;
 import org.elasticsearch.cluster.metadata.AliasMetadata;
@@ -95,16 +92,16 @@ import org.elasticsearch.common.settings.Setting;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.unit.ByteSizeUnit;
 import org.elasticsearch.common.unit.ByteSizeValue;
-import org.elasticsearch.core.TimeValue;
-import org.elasticsearch.xcontent.XContentBuilder;
-import org.elasticsearch.xcontent.XContentType;
-import org.elasticsearch.xcontent.json.JsonXContent;
 import org.elasticsearch.common.xcontent.support.XContentMapValues;
+import org.elasticsearch.core.TimeValue;
 import org.elasticsearch.index.IndexSettings;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.rest.RestStatus;
 import org.elasticsearch.rest.action.admin.indices.RestPutIndexTemplateAction;
+import org.elasticsearch.xcontent.XContentBuilder;
+import org.elasticsearch.xcontent.XContentType;
+import org.elasticsearch.xcontent.json.JsonXContent;
 
 import java.io.IOException;
 import java.util.Arrays;
@@ -1535,24 +1532,6 @@ public class IndicesClientIT extends ESRestHighLevelClientTestCase {
         assertNotNull(detailsResponse.detail());
     }
 
-    public void testFreezeAndUnfreeze() throws IOException {
-        createIndex("test", Settings.EMPTY);
-        RestHighLevelClient client = highLevelClient();
-
-        final RequestOptions freezeIndexOptions = RequestOptions.DEFAULT.toBuilder()
-            .setWarningsHandler(warnings -> List.of(FROZEN_INDICES_DEPRECATION_WARNING).equals(warnings) == false).build();
-
-        ShardsAcknowledgedResponse freeze = execute(new FreezeIndexRequest("test"), client.indices()::freeze,
-            client.indices()::freezeAsync, freezeIndexOptions);
-        assertTrue(freeze.isShardsAcknowledged());
-        assertTrue(freeze.isAcknowledged());
-
-        ShardsAcknowledgedResponse unfreeze = execute(new UnfreezeIndexRequest("test"), client.indices()::unfreeze,
-            client.indices()::unfreezeAsync, freezeIndexOptions);
-        assertTrue(unfreeze.isShardsAcknowledged());
-        assertTrue(unfreeze.isAcknowledged());
-    }
-
     public void testReloadAnalyzer() throws IOException {
         createIndex("test", Settings.EMPTY);
         RestHighLevelClient client = highLevelClient();

+ 6 - 91
client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java

@@ -55,22 +55,21 @@ import org.elasticsearch.client.indices.CreateIndexResponse;
 import org.elasticsearch.client.indices.DeleteAliasRequest;
 import org.elasticsearch.client.indices.DeleteComposableIndexTemplateRequest;
 import org.elasticsearch.client.indices.DetailAnalyzeResponse;
-import org.elasticsearch.client.indices.FreezeIndexRequest;
+import org.elasticsearch.client.indices.GetComposableIndexTemplateRequest;
+import org.elasticsearch.client.indices.GetComposableIndexTemplatesResponse;
 import org.elasticsearch.client.indices.GetFieldMappingsRequest;
 import org.elasticsearch.client.indices.GetFieldMappingsResponse;
 import org.elasticsearch.client.indices.GetIndexRequest;
 import org.elasticsearch.client.indices.GetIndexResponse;
-import org.elasticsearch.client.indices.GetComposableIndexTemplateRequest;
 import org.elasticsearch.client.indices.GetIndexTemplatesRequest;
 import org.elasticsearch.client.indices.GetIndexTemplatesResponse;
-import org.elasticsearch.client.indices.GetComposableIndexTemplatesResponse;
 import org.elasticsearch.client.indices.GetMappingsRequest;
 import org.elasticsearch.client.indices.GetMappingsResponse;
 import org.elasticsearch.client.indices.IndexTemplateMetadata;
 import org.elasticsearch.client.indices.IndexTemplatesExistRequest;
 import org.elasticsearch.client.indices.PutComponentTemplateRequest;
-import org.elasticsearch.client.indices.PutIndexTemplateRequest;
 import org.elasticsearch.client.indices.PutComposableIndexTemplateRequest;
+import org.elasticsearch.client.indices.PutIndexTemplateRequest;
 import org.elasticsearch.client.indices.PutMappingRequest;
 import org.elasticsearch.client.indices.ReloadAnalyzersRequest;
 import org.elasticsearch.client.indices.ReloadAnalyzersResponse;
@@ -90,13 +89,13 @@ import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.unit.ByteSizeUnit;
 import org.elasticsearch.common.unit.ByteSizeValue;
 import org.elasticsearch.core.TimeValue;
-import org.elasticsearch.xcontent.XContentBuilder;
-import org.elasticsearch.xcontent.XContentFactory;
-import org.elasticsearch.xcontent.XContentType;
 import org.elasticsearch.index.IndexSettings;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.rest.RestStatus;
+import org.elasticsearch.xcontent.XContentBuilder;
+import org.elasticsearch.xcontent.XContentFactory;
+import org.elasticsearch.xcontent.XContentType;
 
 import java.io.IOException;
 import java.util.Collections;
@@ -108,7 +107,6 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 import static org.elasticsearch.client.IndicesClientIT.FROZEN_INDICES_DEPRECATION_WARNING;
-import static org.elasticsearch.client.IndicesClientIT.IGNORE_THROTTLED_DEPRECATION_WARNING;
 import static org.elasticsearch.client.IndicesClientIT.LEGACY_TEMPLATE_OPTIONS;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.equalTo;
@@ -2874,89 +2872,6 @@ public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase
 
     }
 
-    public void testFreezeIndex() throws Exception {
-        RestHighLevelClient client = highLevelClient();
-
-        {
-            CreateIndexResponse createIndexResponse = client.indices().create(new CreateIndexRequest("index"), RequestOptions.DEFAULT);
-            assertTrue(createIndexResponse.isAcknowledged());
-        }
-
-        {
-            // tag::freeze-index-request
-            FreezeIndexRequest request = new FreezeIndexRequest("index"); // <1>
-            // end::freeze-index-request
-
-            // tag::freeze-index-request-timeout
-            request.setTimeout(TimeValue.timeValueMinutes(2)); // <1>
-            // end::freeze-index-request-timeout
-            // tag::freeze-index-request-masterTimeout
-            request.setMasterTimeout(TimeValue.timeValueMinutes(1)); // <1>
-            // end::freeze-index-request-masterTimeout
-            // tag::freeze-index-request-waitForActiveShards
-            request.setWaitForActiveShards(ActiveShardCount.DEFAULT); // <1>
-            // end::freeze-index-request-waitForActiveShards
-
-            // tag::freeze-index-request-indicesOptions
-            request.setIndicesOptions(IndicesOptions.strictExpandOpen()); // <1>
-            // end::freeze-index-request-indicesOptions
-
-            final RequestOptions freezeIndexOptions = RequestOptions.DEFAULT.toBuilder()
-                .setWarningsHandler(
-                    warnings -> List.of(FROZEN_INDICES_DEPRECATION_WARNING, IGNORE_THROTTLED_DEPRECATION_WARNING).equals(warnings) == false
-                ).build();
-
-            // tag::freeze-index-execute
-            ShardsAcknowledgedResponse openIndexResponse = client.indices().freeze(request, freezeIndexOptions);
-            // end::freeze-index-execute
-
-            // tag::freeze-index-response
-            boolean acknowledged = openIndexResponse.isAcknowledged(); // <1>
-            boolean shardsAcked = openIndexResponse.isShardsAcknowledged(); // <2>
-            // end::freeze-index-response
-            assertTrue(acknowledged);
-            assertTrue(shardsAcked);
-
-            // tag::freeze-index-execute-listener
-            ActionListener<ShardsAcknowledgedResponse> listener =
-                new ActionListener<ShardsAcknowledgedResponse>() {
-                    @Override
-                    public void onResponse(ShardsAcknowledgedResponse freezeIndexResponse) {
-                        // <1>
-                    }
-
-                    @Override
-                    public void onFailure(Exception e) {
-                        // <2>
-                    }
-                };
-            // end::freeze-index-execute-listener
-
-            // Replace the empty listener by a blocking listener in test
-            final CountDownLatch latch = new CountDownLatch(1);
-            listener = new LatchedActionListener<>(listener, latch);
-
-            // tag::freeze-index-execute-async
-            client.indices().freezeAsync(request, RequestOptions.DEFAULT, listener); // <1>
-            // end::freeze-index-execute-async
-
-            assertTrue(latch.await(30L, TimeUnit.SECONDS));
-        }
-
-        {
-            // tag::freeze-index-notfound
-            try {
-                FreezeIndexRequest request = new FreezeIndexRequest("does_not_exist");
-                client.indices().freeze(request, RequestOptions.DEFAULT);
-            } catch (ElasticsearchException exception) {
-                if (exception.status() == RestStatus.BAD_REQUEST) {
-                    // <1>
-                }
-            }
-            // end::freeze-index-notfound
-        }
-    }
-
     public void testUnfreezeIndex() throws Exception {
         RestHighLevelClient client = highLevelClient();
 

+ 8 - 0
docs/java-rest/redirects.asciidoc

@@ -47,3 +47,11 @@ See <<java-rest-high-start-transform>>.
 === Stop {transform} API
 
 See <<java-rest-high-stop-transform>>.
+
+[role="exclude",id="java-rest-high-freeze-index"]
+=== Freeze index API
+
+The freeze index API was removed in 8.0. Frozen indices are no longer useful due
+to
+https://www.elastic.co/blog/significantly-decrease-your-elasticsearch-heap-memory-usage[recent
+improvements in heap memory usage].

+ 0 - 1
docs/reference/data-streams/data-streams.asciidoc

@@ -67,7 +67,6 @@ such as:
 
 * <<indices-clone-index,Clone>>
 * <<indices-delete-index,Delete>>
-* <<freeze-index-api,Freeze>>
 * <<indices-shrink-index,Shrink>>
 * <<indices-split-index,Split>>
 

+ 0 - 34
docs/reference/ilm/actions/ilm-freeze.asciidoc

@@ -1,34 +0,0 @@
-[role="xpack"]
-[[ilm-freeze]]
-=== Freeze
-
-Phases allowed: cold.
-
-<<freeze-index-api, Freezes>> an index.
-
-deprecated[7.x,"The ILM Freeze action was deprecated in 7.x and will be treated as a no-op in 8.0+."]
-
-[[ilm-freeze-options]]
-==== Options
-
-None.
-
-[[ilm-freeze-ex]]
-==== Example
-
-[source,console]
---------------------------------------------------
-PUT _ilm/policy/my_policy
-{
-  "policy": {
-    "phases": {
-      "cold": {
-        "actions": {
-          "freeze" : { }
-        }
-      }
-    }
-  }
-}
---------------------------------------------------
-

+ 1 - 1
docs/reference/ilm/actions/ilm-searchable-snapshot.asciidoc

@@ -18,7 +18,7 @@ index>> to the frozen tier. In other phases, the action mounts a
 <<fully-mounted,fully mounted index>> to the corresponding data tier.
 
 If the `searchable_snapshot` action is used in the hot phase the subsequent
-phases cannot include the `shrink`, `forcemerge`, or `freeze` actions.
+phases cannot include the `shrink` or `forcemerge` actions.
 
 This action cannot be performed on a data stream's write index. Attempts to do
 so will fail. To convert the index to a searchable snapshot, first

+ 0 - 4
docs/reference/ilm/ilm-actions.asciidoc

@@ -14,9 +14,6 @@ Permanently remove the index.
 Reduce the number of index segments and purge deleted documents.
 Makes the index read-only.
 
-<<ilm-freeze,Freeze>>::
-Freeze the index to minimize its memory footprint.
-
 <<ilm-migrate,Migrate>>::
 Move the index shards to the <<data-tiers, data tier>> that corresponds
 to the current {ilm-init} phase.
@@ -49,7 +46,6 @@ Ensure that a snapshot exists before deleting the index.
 include::actions/ilm-allocate.asciidoc[]
 include::actions/ilm-delete.asciidoc[]
 include::actions/ilm-forcemerge.asciidoc[]
-include::actions/ilm-freeze.asciidoc[]
 include::actions/ilm-migrate.asciidoc[]
 include::actions/ilm-readonly.asciidoc[]
 include::actions/ilm-rollover.asciidoc[]

+ 0 - 1
docs/reference/ilm/ilm-index-lifecycle.asciidoc

@@ -106,7 +106,6 @@ actions in the order listed.
   - <<ilm-searchable-snapshot, Searchable Snapshot>>
   - <<ilm-allocate,Allocate>>
   - <<ilm-migrate,Migrate>>
-  - <<ilm-freeze,Freeze>>
 * Frozen
   - <<ilm-searchable-snapshot, Searchable Snapshot>>
 * Delete

+ 5 - 6
docs/reference/ilm/ilm-overview.asciidoc

@@ -7,8 +7,8 @@
 <titleabbrev>Overview</titleabbrev>
 ++++
 
-You can create and apply {ilm-cap} ({ilm-init}) policies to automatically manage your indices 
-according to your performance, resiliency, and retention requirements. 
+You can create and apply {ilm-cap} ({ilm-init}) policies to automatically manage your indices
+according to your performance, resiliency, and retention requirements.
 
 Index lifecycle policies can trigger actions such as:
 
@@ -17,7 +17,6 @@ size, number of docs, or age.
 * **Shrink**: Reduces the number of primary shards in an index.
 * **Force merge**: Triggers a <<indices-forcemerge,force merge>> to reduce the
 number of segments in an index's shards.
-* **Freeze**: <<freeze-index-api, Freezes>> an index and makes it read-only.
 * **Delete**: Permanently remove an index, including all of its data and
 metadata.
 
@@ -48,9 +47,9 @@ hardware.
 
 [IMPORTANT]
 ===========================
-To use {ilm-init}, all nodes in a cluster must run the same version. 
-Although it might be possible to create and apply policies in a mixed-version cluster, 
+To use {ilm-init}, all nodes in a cluster must run the same version.
+Although it might be possible to create and apply policies in a mixed-version cluster,
 there is no guarantee they will work as intended.
 Attempting to use a policy that contains actions that aren't
-supported on all nodes in a cluster will cause errors. 
+supported on all nodes in a cluster will cause errors.
 ===========================

+ 3 - 5
docs/reference/indices.asciidoc

@@ -18,7 +18,6 @@ index settings, aliases, mappings, and index templates.
 * <<indices-split-index>>
 * <<indices-clone-index>>
 * <<indices-rollover-index>>
-* <<freeze-index-api>>
 * <<unfreeze-index-api>>
 * <<indices-resolve-index-api>>
 
@@ -53,9 +52,9 @@ index settings, aliases, mappings, and index templates.
 === Index templates:
 
 Index templates automatically apply settings, mappings, and aliases to new indices.
-They are most often used to configure rolling indices for time series data to 
-ensure that each new index has the same configuration as the previous one. 
-The index template associated with a data stream configures its backing indices. 
+They are most often used to configure rolling indices for time series data to
+ensure that each new index has the same configuration as the previous one.
+The index template associated with a data stream configures its backing indices.
 For more information, see <<index-templates, Index Templates>>.
 
 * <<indices-put-template>>
@@ -113,7 +112,6 @@ include::indices/indices-exists.asciidoc[]
 include::indices/field-usage-stats.asciidoc[]
 include::indices/flush.asciidoc[]
 include::indices/forcemerge.asciidoc[]
-include::indices/apis/freeze.asciidoc[]
 include::indices/get-alias.asciidoc[]
 include::indices/get-component-template.asciidoc[]
 include::indices/get-field-mapping.asciidoc[]

+ 0 - 62
docs/reference/indices/apis/freeze.asciidoc

@@ -1,62 +0,0 @@
-[role="xpack"]
-[testenv="basic"]
-[[freeze-index-api]]
-=== Freeze index API
-++++
-<titleabbrev>Freeze index</titleabbrev>
-++++
-
-// tag::freeze-api-dep[]
-deprecated::[7.14, Frozen indices are no longer useful due to https://www.elastic.co/blog/significantly-decrease-your-elasticsearch-heap-memory-usage[recent improvements in heap memory usage].]
-// end::freeze-api-dep[]
-
-Freezes an index.
-
-[[freeze-index-api-request]]
-==== {api-request-title}
-
-`POST /<index>/_freeze`
-
-[[freeze-index-api-prereqs]]
-==== {api-prereq-title}
-
-* If the {es} {security-features} are enabled, you must have the `manage`
-<<privileges-list-indices,index privilege>> for the target index or index alias.
-
-[[freeze-index-api-desc]]
-==== {api-description-title}
-
-A frozen index has almost no overhead on the cluster (except for maintaining its
-metadata in memory) and is read-only. Read-only indices are blocked for write
-operations, such as <<indexing,docs-index_>> or <<indices-forcemerge,force
-merges>>. See <<unfreeze-index-api>>.
-
-The current write index on a data stream cannot be frozen. In order to freeze
-the current write index, the data stream must first be
-<<data-streams-rollover,rolled over>> so that a new write index is created
-and then the previous write index can be frozen.
-
-IMPORTANT: Freezing an index will close the index and reopen it within the same
-API call. This causes primaries to not be allocated for a short amount of time
-and causes the cluster to go red until the primaries are allocated again. This
-limitation might be removed in the future.
-
-[[freeze-index-api-path-parms]]
-==== {api-path-parms-title}
-
-`<index>`::
-  (Required, string) Identifier for the index.
-
-[[freeze-index-api-examples]]
-==== {api-examples-title}
-
-The following example freezes and unfreezes an index:
-
-[source,console]
---------------------------------------------------
-POST /my-index-000001/_freeze
-POST /my-index-000001/_unfreeze
---------------------------------------------------
-// TEST[skip:unable to ignore deprecation warning]
-// TEST[s/^/PUT my-index-000001\n/]
-

+ 13 - 9
docs/reference/indices/apis/unfreeze.asciidoc

@@ -6,7 +6,17 @@
 <titleabbrev>Unfreeze index</titleabbrev>
 ++++
 
-deprecated::[7.14, Frozen indices are no longer useful due to https://www.elastic.co/blog/significantly-decrease-your-elasticsearch-heap-memory-usage[recent improvements in heap memory usage].]
+[WARNING]
+.Deprecated in 7.14
+====
+In 8.0, we removed the ability to freeze an index. In previous versions,
+freezing an index reduced its memory overhead. However, frozen indices are no
+longer useful due to
+https://www.elastic.co/blog/significantly-decrease-your-elasticsearch-heap-memory-usage[recent
+improvements in heap memory usage].
+You can use this API to unfreeze indices that were frozen in 7.x. Frozen indices
+are not related to the frozen data tier.
+====
 
 Unfreezes an index.
 
@@ -25,12 +35,7 @@ Unfreezes an index.
 ==== {api-description-title}
 
 When a frozen index is unfrozen, the index goes through the normal recovery
-process and becomes writeable again. See <<freeze-index-api>>.
-
-IMPORTANT: Freezing an index will close the index and reopen it within the same
-API call. This causes primaries to not be allocated for a short amount of time
-and causes the cluster to go red until the primaries are allocated again. This
-limitation might be removed in the future.
+process and becomes writeable again.
 
 [[unfreeze-index-api-path-parms]]
 ==== {api-path-parms-title}
@@ -41,11 +46,10 @@ limitation might be removed in the future.
 [[unfreeze-index-api-examples]]
 ==== {api-examples-title}
 
-The following example freezes and unfreezes an index:
+The following example unfreezes an index:
 
 [source,console]
 --------------------------------------------------
-POST /my-index-000001/_freeze
 POST /my-index-000001/_unfreeze
 --------------------------------------------------
 // TEST[s/^/PUT my-index-000001\n/]

+ 3 - 5
docs/reference/indices/index-mgmt.asciidoc

@@ -15,7 +15,7 @@ You'll learn how to:
 
 * View and edit index settings.
 * View mappings and statistics for an index.
-* Perform index-level operations, such as refreshes and freezes.
+* Perform index-level operations, such as refreshes.
 * View and manage data streams.
 * Create index templates to automatically configure new data streams and indices.
 
@@ -43,9 +43,8 @@ Open {kib}'s main menu and click *Stack Management > Index Management*.
 image::images/index-mgmt/management_index_labels.png[Index Management UI]
 
 The *Index Management* page contains an overview of your indices.
-Badges indicate if an index is <<freeze-index-api,frozen>>, a
-<<ccr-put-follow,follower index>>, or a
-<<rollup-get-rollup-index-caps,rollup index>>.
+Badges indicate if an index is a <<ccr-put-follow,follower index>>, a
+<<rollup-get-rollup-index-caps,rollup index>>, or <<unfreeze-index-api,frozen>>.
 
 Clicking a badge narrows the list to only indices of that type.
 You can also filter indices using the search bar.
@@ -68,7 +67,6 @@ indices on the overview page. The menu includes the following actions:
 * <<indices-forcemerge,*Force merge index*>>
 * <<indices-refresh,*Refresh index*>>
 * <<indices-flush,*Flush index*>>
-* <<freeze-index-api,*Freeze index*>>
 * <<indices-delete-index,*Delete index*>>
 * *Add* <<set-up-lifecycle-policy,*lifecycle policy*>>
 

+ 0 - 3
docs/reference/indices/resolve.asciidoc

@@ -18,8 +18,6 @@ PUT /remotecluster-bar-01
 
 PUT /freeze-index
 
-POST /freeze-index/_freeze
-
 PUT /my-index-000001
 
 PUT /freeze-index/_alias/f-alias
@@ -110,7 +108,6 @@ The API returns the following response:
         "f-alias"
       ],
       "attributes": [
-        "frozen",
         "open"
       ]
     },

+ 0 - 7
docs/reference/mapping/params/eager-global-ordinals.asciidoc

@@ -85,13 +85,6 @@ PUT my-index-000001/_mapping
 ------------
 // TEST[continued]
 
-IMPORTANT: On a <<freeze-index-api,frozen index>>, global ordinals are discarded
-after each search and rebuilt again when they're requested. This means that
-`eager_global_ordinals` should not be used on frozen indices: it would
-cause global ordinals to be reloaded on every search. Instead, the index should
-be force-merged to a single segment before being frozen. This avoids building
-global ordinals altogether (more details can be found in the next section).
-
 ==== Avoiding global ordinal loading
 
 Usually, global ordinals do not present a large overhead in terms of their

+ 26 - 10
docs/reference/redirects.asciidoc

@@ -52,6 +52,28 @@ Refer to <<remote-clusters-settings,Remote clusters settings>>.
 
 See <<restore-entire-cluster>>.
 
+[role="exclude",id="freeze-index-api"]
+=== Freeze index API
+
+The freeze index API was removed in 8.0.
+// tag::frozen-removal-explanation[]
+Frozen indices are no longer useful due to
+https://www.elastic.co/blog/significantly-decrease-your-elasticsearch-heap-memory-usage[recent
+improvements in heap memory usage].
+// end::frozen-removal-explanation[]
+
+[role="exclude",id="ilm-freeze"]
+=== Freeze {ilm-init} action
+
+The freeze {ilm-init} action was removed in 8.0.
+include::redirects.asciidoc[tag=frozen-removal-explanation]
+
+[role="exclude",id="ilm-freeze-action"]
+=== Freeze {ilm-init} action
+
+The freeze {ilm-init} action was removed in 8.0.
+include::redirects.asciidoc[tag=frozen-removal-explanation]
+
 [role="exclude",id="alias"]
 === Aliases
 
@@ -1039,11 +1061,6 @@ See <<ilm-delete>>.
 
 See <<ilm-forcemerge>>.
 
-[role="exclude",id="ilm-freeze-action"]
-==== Freeze action
-
-See <<ilm-freeze>>.
-
 [role="exclude",id="ilm-migrate-action"]
 ==== Migrate action
 
@@ -1636,9 +1653,8 @@ See <<search-terms-enum>>.
 === Frozen indices
 
 // tag::frozen-index-redirect[]
-include::{es-repo-dir}/indices/apis/freeze.asciidoc[tag=freeze-api-dep]
 
-For API documentation, see <<freeze-index-api>> and <<unfreeze-index-api>>.
+For API documentation, see <<unfreeze-index-api>>.
 // end::frozen-index-redirect[]
 
 [role="exclude",id="best_practices"]
@@ -1663,16 +1679,16 @@ See the {glossary}/terms.html[Elastic glossary].
 [role="exclude",id="multi-index"]
 === Multi-target syntax
 
-See <<api-multi-index>>. 
+See <<api-multi-index>>.
 
 [float]
 [[hidden]]
 ==== Hidden data streams and indices
 
-See <<multi-hidden>>. 
+See <<multi-hidden>>.
 
 [role="exclude",id="date-math-index-names"]
-=== Date math support in system and index alias names 
+=== Date math support in system and index alias names
 
 See <<api-date-math-index-names>>.
 

+ 1 - 2
docs/reference/search/search-your-data/long-running-searches.asciidoc

@@ -5,8 +5,7 @@
 
 {es} generally allows you to quickly search across big amounts of data. There are
 situations where a search executes on many shards, possibly against
-<<freeze-index-api,frozen indices>> and spanning multiple
-<<remote-clusters,remote clusters>>, for which
+large data sets or multiple <<remote-clusters,remote clusters>>, for which
 results are not expected to be returned in milliseconds. When you need to
 execute long-running searches, synchronously
 waiting for its results to be returned is not ideal. Instead, Async search lets

+ 1 - 2
docs/reference/search/search-your-data/search-your-data.asciidoc

@@ -220,8 +220,7 @@ _synchronous_ by default. The search request waits for complete results before
 returning a response.
 
 However, complete results can take longer for searches across
-<<freeze-index-api,frozen indices>> or <<modules-cross-cluster-search,multiple
-clusters>>.
+large data sets or <<modules-cross-cluster-search,multiple clusters>>.
 
 To avoid long waits, you can run an _asynchronous_, or _async_, search
 instead. An <<async-search-intro,async search>> lets you retrieve partial

+ 1 - 1
docs/reference/sql/endpoints/jdbc.asciidoc

@@ -145,7 +145,7 @@ will be - typically the first in natural ascending order) for fields with multip
 
 [discrete]
 ==== Index
-`index.include.frozen` (default `false`):: Whether to include <<freeze-index-api, frozen-indices>> in the query execution or not (default).
+`index.include.frozen` (default `false`):: Whether to include frozen indices in the query execution or not (default).
 
 [discrete]
 ==== Additional

+ 3 - 3
docs/reference/sql/language/indices.asciidoc

@@ -49,7 +49,7 @@ Using `SHOW TABLES` command again:
 include-tagged::{sql-specs}/docs/docs.csv-spec[showTablesLikeWildcard]
 ----
 
-The pattern matches all tables that start with `emp`. 
+The pattern matches all tables that start with `emp`.
 
 This command supports _escaping_ as well, for example:
 
@@ -88,7 +88,7 @@ requires the keyword `LIKE` for SQL `LIKE` pattern.
 [[sql-index-frozen]]
 === Frozen Indices
 
-By default, {es-sql} doesn't search <<freeze-index-api,frozen indices>>. To
+By default, {es-sql} doesn't search <<unfreeze-index-api,frozen indices>>. To
 search frozen indices, use one of the following features:
 
 dedicated configuration parameter::
@@ -108,4 +108,4 @@ include-tagged::{sql-specs}/docs/docs.csv-spec[showTablesIncludeFrozen]
 include-tagged::{sql-specs}/docs/docs.csv-spec[fromTableIncludeFrozen]
 ----
 
-Unless enabled, frozen indices are completely ignored; it is as if they do not exist and as such, queries ran against them are likely to fail.
+Unless enabled, frozen indices are completely ignored; it is as if they do not exist and as such, queries ran against them are likely to fail.

+ 0 - 67
rest-api-spec/src/main/resources/rest-api-spec/api/indices.freeze.json

@@ -1,67 +0,0 @@
-{
-  "indices.freeze":{
-    "documentation":{
-      "url":"https://www.elastic.co/guide/en/elasticsearch/reference/current/freeze-index-api.html",
-      "description":"Freezes an index. A frozen index has almost no overhead on the cluster (except for maintaining its metadata in memory) and is read-only."
-    },
-    "stability":"stable",
-    "visibility":"public",
-    "headers":{
-      "accept": [ "application/json"]
-    },
-    "url":{
-      "paths":[
-        {
-          "path":"/{index}/_freeze",
-          "methods":[
-            "POST"
-          ],
-          "parts":{
-            "index":{
-              "type":"string",
-              "description":"The name of the index to freeze"
-            }
-          },
-          "deprecated":{
-            "version":"7.14.0",
-            "description":"Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-          }
-        }
-      ]
-    },
-    "params":{
-      "timeout":{
-        "type":"time",
-        "description":"Explicit operation timeout"
-      },
-      "master_timeout":{
-        "type":"time",
-        "description":"Specify timeout for connection to master"
-      },
-      "ignore_unavailable":{
-        "type":"boolean",
-        "description":"Whether specified concrete indices should be ignored when unavailable (missing or closed)"
-      },
-      "allow_no_indices":{
-        "type":"boolean",
-        "description":"Whether to ignore if a wildcard indices expression resolves into no concrete indices. (This includes `_all` string or when no indices have been specified)"
-      },
-      "expand_wildcards":{
-        "type":"enum",
-        "options":[
-          "open",
-          "closed",
-          "hidden",
-          "none",
-          "all"
-        ],
-        "default":"closed",
-        "description":"Whether to expand wildcard expression to concrete indices that are open, closed or both."
-      },
-      "wait_for_active_shards":{
-        "type":"string",
-        "description":"Sets the number of active shards to wait for before the operation returns."
-      }
-    }
-  }
-}

+ 5 - 0
x-pack/plugin/build.gradle

@@ -108,6 +108,11 @@ tasks.named("yamlRestTestV7CompatTransform").configure{ task ->
   task.skipTest("rollup/put_job/Test basic put_job", "rollup was an experimental feature, also see #41227")
   task.skipTest("rollup/start_job/Test start job twice", "rollup was an experimental feature, also see #41227")
   task.skipTest("ml/trained_model_cat_apis/Test cat trained models", "A type field was added to cat.ml_trained_models #73660, this is a backwards compatible change. Still this is a cat api, and we don't support them with rest api compatibility. (the test would be very hard to transform too)")
+  task.skipTest("api_key/10_basic/Test invalidate api keys with single id", "waiting for https://github.com/elastic/elasticsearch/pull/78664")
+  task.skipTest("indices.freeze/30_usage/Usage stats on frozen indices", "#70192 -- the freeze index API is removed from 8.0")
+  task.skipTest("indices.freeze/20_stats/Translog stats on frozen indices", "#70192 -- the freeze index API is removed from 8.0")
+  task.skipTest("indices.freeze/10_basic/Basic", "#70192 -- the freeze index API is removed from 8.0")
+  task.skipTest("indices.freeze/10_basic/Test index options", "#70192 -- the freeze index API is removed from 8.0")
   task.skipTest("ml/categorization_agg/Test categorization aggregation with poor settings", "https://github.com/elastic/elasticsearch/pull/79586")
 
   task.replaceValueInMatch("_type", "_doc")

+ 2 - 6
x-pack/plugin/frozen-indices/src/main/java/org/elasticsearch/xpack/frozen/rest/action/RestFreezeIndexAction.java

@@ -29,15 +29,11 @@ public final class RestFreezeIndexAction extends BaseRestHandler {
 
     @Override
     public List<Route> routes() {
-        return List.of(
-            Route.builder(POST, "/{index}/_freeze").deprecated(DEPRECATION_WARNING, DEPRECATION_VERSION).build(),
-            Route.builder(POST, "/{index}/_unfreeze").deprecated(DEPRECATION_WARNING, DEPRECATION_VERSION).build()
-        );
+        return List.of(Route.builder(POST, "/{index}/_unfreeze").deprecated(DEPRECATION_WARNING, DEPRECATION_VERSION).build());
     }
 
     @Override
     protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) {
-        boolean freeze = request.path().endsWith("/_freeze");
         FreezeRequest freezeRequest = new FreezeRequest(Strings.splitStringByCommaToArray(request.param("index")));
         freezeRequest.timeout(request.paramAsTime("timeout", freezeRequest.timeout()));
         freezeRequest.masterNodeTimeout(request.paramAsTime("master_timeout", freezeRequest.masterNodeTimeout()));
@@ -46,7 +42,7 @@ public final class RestFreezeIndexAction extends BaseRestHandler {
         if (waitForActiveShards != null) {
             freezeRequest.waitForActiveShards(ActiveShardCount.parseString(waitForActiveShards));
         }
-        freezeRequest.setFreeze(freeze);
+        freezeRequest.setFreeze(false);
         return channel -> client.execute(FreezeIndexAction.INSTANCE, freezeRequest, new RestToXContentListener<>(channel));
     }
 

+ 1 - 37
x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java

@@ -44,13 +44,9 @@ import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.nullValue;
 
 public abstract class AbstractSearchableSnapshotsRestTestCase extends ESRestTestCase {
 
-    public static final String FROZEN_INDICES_WARNING = "Frozen indices are deprecated because they provide no benefit given "
-        + "improvements in heap memory utilization. They will be removed in a future release.";
-
     private static final String WRITE_REPOSITORY_NAME = "repository";
     private static final String READ_REPOSITORY_NAME = "read-repository";
     private static final String SNAPSHOT_NAME = "searchable-snapshot";
@@ -179,30 +175,6 @@ public abstract class AbstractSearchableSnapshotsRestTestCase extends ESRestTest
         });
     }
 
-    public void testSearchResultsWhenFrozen() throws Exception {
-        runSearchableSnapshotsTest((restoredIndexName, numDocs) -> {
-            final Request freezeRequest = new Request(HttpPost.METHOD_NAME, restoredIndexName + "/_freeze");
-            freezeRequest.setOptions(expectWarnings(FROZEN_INDICES_WARNING));
-            assertOK(client().performRequest(freezeRequest));
-            ensureGreen(restoredIndexName);
-            assertSearchResults(restoredIndexName, numDocs, Boolean.FALSE);
-            final Map<String, Object> frozenIndexSettings = indexSettings(restoredIndexName);
-            assertThat(Boolean.valueOf(extractValue(frozenIndexSettings, "index.frozen")), equalTo(true));
-            assertThat(Boolean.valueOf(extractValue(frozenIndexSettings, "index.search.throttled")), equalTo(true));
-            assertThat(Boolean.valueOf(extractValue(frozenIndexSettings, "index.blocks.write")), equalTo(true));
-
-            final Request unfreezeRequest = new Request(HttpPost.METHOD_NAME, restoredIndexName + "/_unfreeze");
-            unfreezeRequest.setOptions(expectWarnings(FROZEN_INDICES_WARNING));
-            assertOK(client().performRequest(unfreezeRequest));
-            ensureGreen(restoredIndexName);
-            assertSearchResults(restoredIndexName, numDocs, Boolean.FALSE);
-            final Map<String, Object> unfrozenIndexSettings = indexSettings(restoredIndexName);
-            assertThat(extractValue(unfrozenIndexSettings, "index.frozen"), nullValue());
-            assertThat(extractValue(unfrozenIndexSettings, "index.search.throttled"), nullValue());
-            assertThat(Boolean.valueOf(extractValue(frozenIndexSettings, "index.blocks.write")), equalTo(true));
-        });
-    }
-
     public void testSourceOnlyRepository() throws Exception {
         runSearchableSnapshotsTest((indexName, numDocs) -> {
             for (int i = 0; i < 10; i++) {
@@ -292,14 +264,6 @@ public abstract class AbstractSearchableSnapshotsRestTestCase extends ESRestTest
     public void testSnapshotOfSearchableSnapshot() throws Exception {
         runSearchableSnapshotsTest((restoredIndexName, numDocs) -> {
 
-            final boolean frozen = randomBoolean();
-            if (frozen) {
-                logger.info("--> freezing index [{}]", restoredIndexName);
-                final Request freezeRequest = new Request(HttpPost.METHOD_NAME, restoredIndexName + "/_freeze");
-                freezeRequest.setOptions(expectWarnings(FROZEN_INDICES_WARNING));
-                assertOK(client().performRequest(freezeRequest));
-            }
-
             if (randomBoolean()) {
                 logger.info("--> closing index [{}]", restoredIndexName);
                 final Request closeRequest = new Request(HttpPost.METHOD_NAME, restoredIndexName + "/_close");
@@ -347,7 +311,7 @@ public abstract class AbstractSearchableSnapshotsRestTestCase extends ESRestTest
 
             deleteSnapshot(snapshot2Name, false);
 
-            assertSearchResults(restoredIndexName, numDocs, frozen ? Boolean.FALSE : randomFrom(Boolean.TRUE, Boolean.FALSE, null));
+            assertSearchResults(restoredIndexName, numDocs, randomFrom(Boolean.TRUE, Boolean.FALSE, null));
         });
     }
 

+ 2 - 0
x-pack/plugin/sql/qa/server/multi-cluster-with-security/build.gradle

@@ -18,6 +18,7 @@ def remoteClusterReg = testClusters.register('remote-cluster') {
   setting 'xpack.security.autoconfiguration.enabled', 'false'
 
   user username: "test_user", password: "x-pack-test-password"
+  plugin ':x-pack:qa:freeze-plugin'
 }
 
 def integTestClusterReg = testClusters.register('integTest') {
@@ -33,6 +34,7 @@ def integTestClusterReg = testClusters.register('integTest') {
   setting 'xpack.security.autoconfiguration.enabled', 'false'
 
   user username: "test_user", password: "x-pack-test-password"
+  plugin ':x-pack:qa:freeze-plugin'
 }
 
 tasks.register("startRemoteCluster", DefaultTestClustersTask.class) {

+ 1 - 0
x-pack/plugin/sql/qa/server/multi-node/build.gradle

@@ -10,4 +10,5 @@ testClusters.matching { it.name == "integTest" }.configureEach {
   numberOfNodes = 2
   setting 'xpack.security.enabled', 'false'
   setting 'xpack.license.self_generated.type', 'trial'
+  plugin ':x-pack:qa:freeze-plugin'
 }

+ 1 - 0
x-pack/plugin/sql/qa/server/security/build.gradle

@@ -36,6 +36,7 @@ subprojects {
     user username: "user1", password: 'x-pack-test-password', role: "user1"
     user username: "user2", password: 'x-pack-test-password', role: "user2"
     user username: "manage_user", password: 'x-pack-test-password', role: "manage_user"
+    plugin ':x-pack:qa:freeze-plugin'
   }
 
   File testArtifactsDir = project.file("$buildDir/testArtifacts")

+ 2 - 0
x-pack/plugin/sql/qa/server/single-node/build.gradle

@@ -1,4 +1,6 @@
 testClusters.matching { it.name == "integTest" }.configureEach {
+  testDistribution = 'DEFAULT'
   setting 'xpack.security.enabled', 'false'
   setting 'xpack.license.self_generated.type', 'trial'
+  plugin ':x-pack:qa:freeze-plugin'
 }

+ 0 - 8
x-pack/plugin/sql/qa/server/src/main/java/org/elasticsearch/xpack/sql/qa/jdbc/DataLoader.java

@@ -28,8 +28,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import static org.elasticsearch.test.rest.ESRestTestCase.expectWarnings;
-
 public class DataLoader {
 
     public static void main(String[] args) throws Exception {
@@ -405,12 +403,6 @@ public class DataLoader {
     protected static void freeze(RestClient client, String... indices) throws Exception {
         for (String index : indices) {
             Request freezeRequest = new Request("POST", "/" + index + "/_freeze");
-            freezeRequest.setOptions(
-                expectWarnings(
-                    "Frozen indices are deprecated because they provide no benefit given improvements in "
-                        + "heap memory utilization. They will be removed in a future release."
-                )
-            );
             client.performRequest(freezeRequest);
         }
     }

+ 0 - 186
x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/indices.freeze/10_basic.yml

@@ -1,186 +0,0 @@
----
-"Basic":
-- skip:
-    features: [ "warnings" ]
-
-- do:
-    index:
-      index: test
-      id:    "1"
-      body:  { "foo": "Hello: 1" }
-- do:
-    index:
-      index: test
-      id:    "2"
-      body:  { "foo": "Hello: 2" }
-
-- do:
-    warnings:
-      - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-    indices.freeze:
-      index: test
-
-- do:
-    warnings:
-      - "[ignore_throttled] parameter is deprecated because frozen indices have been deprecated. Consider cold or frozen tiers in place of frozen indices."
-      - "Searching frozen indices [test] is deprecated. Consider cold or frozen tiers in place of frozen indices. The frozen feature will be removed in a feature release."
-    search:
-      rest_total_hits_as_int: true
-      index: test
-      ignore_throttled: false
-      body:
-        query:
-          match:
-            foo: hello
-
-- match: {hits.total: 2}
-
-# unfreeze
-- do:
-    warnings:
-      - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-    indices.unfreeze:
-      index: test
-
-- do:
-    search:
-      rest_total_hits_as_int: true
-      index: _all
-      body:
-        query:
-          match:
-            foo: hello
-
-- match: {hits.total: 2}
-
-- do:
-    index:
-      index: test-01
-      id:    "1"
-      body:  { "foo": "Hello: 01" }
-
-
-- do:
-    warnings:
-      - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-    indices.freeze:
-      index: test*
-
-- do:
-    warnings:
-      - "[ignore_throttled] parameter is deprecated because frozen indices have been deprecated. Consider cold or frozen tiers in place of frozen indices."
-      - "Searching frozen indices [test,test-01] is deprecated. Consider cold or frozen tiers in place of frozen indices. The frozen feature will be removed in a feature release."
-    search:
-      rest_total_hits_as_int: true
-      index: _all
-      ignore_throttled: false
-      body:
-        query:
-          match:
-            foo: hello
-
-- match: {hits.total: 3}
-
-- do:
-    search:
-      rest_total_hits_as_int: true
-      index: _all
-      body:
-        query:
-          match:
-            foo: hello
-
-- match: {hits.total: 0}
-
----
-"Test index options":
-- skip:
-    features: ["allowed_warnings", "warnings"]
-
-- do:
-    index:
-      index: test
-      id:    "1"
-      body:  { "foo": "Hello: 1" }
-
-- do:
-    index:
-      index: test-close
-      id:    "1"
-      body:  { "foo": "Hello: 1" }
-
-- do:
-    indices.close:
-      index: test-close
-    allowed_warnings:
-      - "the default value for the ?wait_for_active_shards parameter will change from '0' to 'index-setting' in version 8; specify '?wait_for_active_shards=index-setting' to adopt the future default behaviour, or '?wait_for_active_shards=0' to preserve today's behaviour"
-
-- do:
-    warnings:
-      - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-    indices.freeze:
-      index: test*,not_available
-      ignore_unavailable: true
-
-- do:
-    search:
-      rest_total_hits_as_int: true
-      index: _all
-      body:
-        query:
-          match:
-            foo: hello
-
-- match: {hits.total: 0}
-
-- do:
-    warnings:
-      - "[ignore_throttled] parameter is deprecated because frozen indices have been deprecated. Consider cold or frozen tiers in place of frozen indices."
-      - "Searching frozen indices [test] is deprecated. Consider cold or frozen tiers in place of frozen indices. The frozen feature will be removed in a feature release."
-    search:
-      rest_total_hits_as_int: true
-      index: _all
-      ignore_throttled: false
-      body:
-        query:
-          match:
-            foo: hello
-
-- match: {hits.total: 1}
-
----
-"Cannot freeze write index for data stream":
-  - skip:
-      version: " - 7.9.99"
-      reason: "enable in 7.9+ when backported"
-      features: allowed_warnings
-
-  - do:
-      allowed_warnings:
-        - "index template [my-template1] has index patterns [simple-data-stream1] matching patterns from existing older templates [global] with patterns (global => [*]); this template [my-template1] will take precedence during new index creation"
-      indices.put_index_template:
-        name: my-template1
-        body:
-          index_patterns: [simple-data-stream1]
-          template:
-            mappings:
-              properties:
-                '@timestamp':
-                  type: date
-          data_stream: {}
-
-  - do:
-      indices.create_data_stream:
-        name: simple-data-stream1
-  - is_true: acknowledged
-
-  - do:
-      catch: bad_request
-      indices.freeze:
-        index: ".ds-simple-data-stream1-*000001"
-
-  - do:
-      indices.delete_data_stream:
-        name: simple-data-stream1
-  - is_true: acknowledged
-

+ 0 - 67
x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/indices.freeze/20_stats.yml

@@ -1,67 +0,0 @@
----
-setup:
-  - do:
-      indices.create:
-          index: test
-  - do:
-      cluster.health:
-        wait_for_no_initializing_shards: true
-
----
-"Translog stats on frozen indices":
-  - skip:
-      features: warnings
-      version: " - 7.3.99"
-      reason:  "start ignoring translog retention policy with soft-deletes enabled in 7.4"
-
-  - do:
-      index:
-        index: test
-        id:    1
-        body:  { "foo": "bar" }
-
-  - do:
-      index:
-        index: test
-        id:    2
-        body:  { "foo": "bar" }
-
-  - do:
-      index:
-        index: test
-        id:    3
-        body:  { "foo": "bar" }
-
-  - do:
-      indices.stats:
-        metric: [ translog ]
-  - match: { indices.test.primaries.translog.operations: 3 }
-  - match: { indices.test.primaries.translog.uncommitted_operations: 3 }
-
-  # freeze index
-  - do:
-      warnings:
-        - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-      indices.freeze:
-        index: test
-  - is_true: acknowledged
-
-  - do:
-      indices.stats:
-        metric: [ translog ]
-  - match: { indices.test.primaries.translog.operations: 0 }
-  - match: { indices.test.primaries.translog.uncommitted_operations: 0 }
-
-  # unfreeze index
-  - do:
-      warnings:
-        - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-      indices.unfreeze:
-        index: test
-  - is_true: acknowledged
-
-  - do:
-      indices.stats:
-        metric: [ translog ]
-  - match: { indices.test.primaries.translog.operations: 0 }
-  - match: { indices.test.primaries.translog.uncommitted_operations: 0 }

+ 0 - 65
x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/indices.freeze/30_usage.yml

@@ -1,65 +0,0 @@
----
-setup:
-  - do:
-      indices.create:
-        index: test
-  - do:
-      cluster.health:
-        wait_for_no_initializing_shards: true
-
----
-"Usage stats on frozen indices":
-  - skip:
-      features: [ "warnings" ]
-      version: " - 7.3.99"
-      reason:  "frozen indices have usage stats starting in version 7.4"
-
-  - do:
-      index:
-        index: test
-        id:    1
-        body:  { "foo": "bar" }
-
-  - do:
-      index:
-        index: test
-        id:    2
-        body:  { "foo": "bar" }
-
-  - do:
-      index:
-        index: test
-        id:    3
-        body:  { "foo": "bar" }
-
-  - do: {xpack.usage: {}}
-  - match: { frozen_indices.available: true }
-  - match: { frozen_indices.enabled: true }
-  - match: { frozen_indices.indices_count: 0 }
-
-  # freeze index
-  - do:
-      warnings:
-        - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-      indices.freeze:
-        index: test
-  - is_true: acknowledged
-
-
-  - do: {xpack.usage: {}}
-  - match: { frozen_indices.available: true }
-  - match: { frozen_indices.enabled: true }
-  - match: { frozen_indices.indices_count: 1 }
-
-  # unfreeze index
-  - do:
-      warnings:
-        - "Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release."
-      indices.unfreeze:
-        index: test
-  - is_true: acknowledged
-
-  - do: {xpack.usage: {}}
-  - match: { frozen_indices.available: true }
-  - match: { frozen_indices.enabled: true }
-  - match: { frozen_indices.indices_count: 0 }

+ 25 - 0
x-pack/qa/freeze-plugin/build.gradle

@@ -0,0 +1,25 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+
+apply plugin: 'elasticsearch.internal-es-plugin'
+
+
+esplugin {
+  name = 'freeze-plugin'
+  description = 'Provides freeze-index endpoint for testing purposes only'
+  classname = 'org.elasticsearch.plugin.freeze.FreezeIndexPlugin'
+  extendedPlugins = ['x-pack-core']
+}
+
+dependencies {
+  compileOnly project(":server")
+  compileOnly project(path: xpackModule('core'))
+}
+
+//this plugin is only for testing purposes -- there are no unit tests
+tasks.named("testingConventions").configure { enabled = false }

+ 85 - 0
x-pack/qa/freeze-plugin/src/main/java/org/elasticsearch/plugin/freeze/FreezeIndexPlugin.java

@@ -0,0 +1,85 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+package org.elasticsearch.plugin.freeze;
+
+import org.elasticsearch.action.support.ActiveShardCount;
+import org.elasticsearch.action.support.IndicesOptions;
+import org.elasticsearch.client.node.NodeClient;
+import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
+import org.elasticsearch.cluster.node.DiscoveryNodes;
+import org.elasticsearch.common.Strings;
+import org.elasticsearch.common.settings.ClusterSettings;
+import org.elasticsearch.common.settings.IndexScopedSettings;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.settings.SettingsFilter;
+import org.elasticsearch.plugins.ActionPlugin;
+import org.elasticsearch.plugins.Plugin;
+import org.elasticsearch.protocol.xpack.frozen.FreezeRequest;
+import org.elasticsearch.rest.BaseRestHandler;
+import org.elasticsearch.rest.RestController;
+import org.elasticsearch.rest.RestHandler;
+import org.elasticsearch.rest.RestRequest;
+import org.elasticsearch.rest.action.RestToXContentListener;
+import org.elasticsearch.xpack.core.frozen.action.FreezeIndexAction;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static org.elasticsearch.rest.RestRequest.Method.POST;
+
+/**
+ * Restores the REST endpoint for freezing indices so that the JDBC tests can still freeze indices
+ * for testing purposes until frozen indices are no longer supported.
+ */
+public class FreezeIndexPlugin extends Plugin implements ActionPlugin {
+
+    @Override
+    public List<RestHandler> getRestHandlers(
+        Settings settings,
+        RestController restController,
+        ClusterSettings clusterSettings,
+        IndexScopedSettings indexScopedSettings,
+        SettingsFilter settingsFilter,
+        IndexNameExpressionResolver indexNameExpressionResolver,
+        Supplier<DiscoveryNodes> nodesInCluster
+    ) {
+        return List.of(new FreezeIndexRestEndpoint());
+    }
+
+    /**
+     * Used by the {@link FreezeIndexPlugin} above.
+     */
+    static class FreezeIndexRestEndpoint extends BaseRestHandler {
+        @Override
+        public String getName() {
+            return "freeze-for-testing-only";
+        }
+
+        @Override
+        public List<Route> routes() {
+            return List.of(new Route(POST, "/{index}/_freeze"));
+        }
+
+        @Override
+        protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
+            boolean freeze = request.path().endsWith("/_freeze");
+            FreezeRequest freezeRequest = new FreezeRequest(Strings.splitStringByCommaToArray(request.param("index")));
+            freezeRequest.timeout(request.paramAsTime("timeout", freezeRequest.timeout()));
+            freezeRequest.masterNodeTimeout(request.paramAsTime("master_timeout", freezeRequest.masterNodeTimeout()));
+            freezeRequest.indicesOptions(IndicesOptions.fromRequest(request, freezeRequest.indicesOptions()));
+            String waitForActiveShards = request.param("wait_for_active_shards");
+            if (waitForActiveShards != null) {
+                freezeRequest.waitForActiveShards(ActiveShardCount.parseString(waitForActiveShards));
+            }
+            freezeRequest.setFreeze(freeze);
+            return channel -> client.execute(FreezeIndexAction.INSTANCE, freezeRequest, new RestToXContentListener<>(channel));
+        }
+    }
+
+}

+ 6 - 62
x-pack/qa/full-cluster-restart/src/test/java/org/elasticsearch/xpack/restart/FullClusterRestartIT.java

@@ -19,6 +19,12 @@ import org.elasticsearch.cluster.metadata.DataStreamTestHelper;
 import org.elasticsearch.common.Strings;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.util.concurrent.ThreadContext;
+import org.elasticsearch.common.xcontent.support.XContentMapValues;
+import org.elasticsearch.rest.RestStatus;
+import org.elasticsearch.rest.action.search.RestSearchAction;
+import org.elasticsearch.test.StreamsUtils;
+import org.elasticsearch.test.rest.ESRestTestCase;
+import org.elasticsearch.upgrades.AbstractFullClusterRestartTestCase;
 import org.elasticsearch.xcontent.DeprecationHandler;
 import org.elasticsearch.xcontent.NamedXContentRegistry;
 import org.elasticsearch.xcontent.ObjectPath;
@@ -26,13 +32,6 @@ import org.elasticsearch.xcontent.XContentBuilder;
 import org.elasticsearch.xcontent.XContentParser;
 import org.elasticsearch.xcontent.XContentType;
 import org.elasticsearch.xcontent.json.JsonXContent;
-import org.elasticsearch.common.xcontent.support.XContentMapValues;
-import org.elasticsearch.index.IndexSettings;
-import org.elasticsearch.rest.RestStatus;
-import org.elasticsearch.rest.action.search.RestSearchAction;
-import org.elasticsearch.test.StreamsUtils;
-import org.elasticsearch.test.rest.ESRestTestCase;
-import org.elasticsearch.upgrades.AbstractFullClusterRestartTestCase;
 import org.elasticsearch.xpack.core.slm.SnapshotLifecyclePolicy;
 import org.elasticsearch.xpack.core.slm.SnapshotLifecycleStats;
 import org.hamcrest.Matcher;
@@ -703,61 +702,6 @@ public class FullClusterRestartIT extends AbstractFullClusterRestartTestCase {
         return null;
     }
 
-    public void testFrozenIndexAfterRestarted() throws Exception {
-        final String index = "test_frozen_index";
-        if (isRunningAgainstOldCluster()) {
-            Settings.Builder settings = Settings.builder();
-            if (minimumNodeVersion().before(Version.V_8_0_0) && randomBoolean()) {
-                settings.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), randomBoolean());
-            }
-            String mappings = randomBoolean() ? "\"_source\": { \"enabled\": false}" : null;
-            createIndex(index, settings.build(), mappings);
-            ensureGreen(index);
-            int numDocs = randomIntBetween(10, 500);
-            for (int i = 0; i < numDocs; i++) {
-                int id = randomIntBetween(0, 100);
-                final Request indexRequest = new Request("POST", "/" + index + "/" + "_doc/" + id);
-                indexRequest.setJsonEntity(Strings.toString(JsonXContent.contentBuilder().startObject().field("f", "v").endObject()));
-                assertOK(client().performRequest(indexRequest));
-                if (rarely()) {
-                    flush(index, randomBoolean());
-                }
-            }
-        } else {
-            ensureGreen(index);
-            final int totalHits = (int) XContentMapValues.extractValue("hits.total.value",
-                entityAsMap(client().performRequest(new Request("GET", "/" + index + "/_search"))));
-            Request freezeRequest = new Request("POST", index + "/_freeze");
-            freezeRequest.setOptions(
-                expectWarnings(
-                    "Frozen indices are deprecated because they provide no benefit given "
-                        + "improvements in heap memory utilization. They will be removed in a future release."
-                )
-            );
-            assertOK(client().performRequest(freezeRequest));
-            ensureGreen(index);
-            assertNoFileBasedRecovery(index, n -> true);
-            final Request request = new Request("GET", "/" + index + "/_search");
-            request.setOptions(expectWarnings("[ignore_throttled] parameter is deprecated because frozen " +
-                "indices have been deprecated. Consider cold or frozen tiers in place of frozen indices.",
-                "Searching frozen indices [" + index + "] is deprecated. " +
-                    "Consider cold or frozen tiers in place of frozen indices. The frozen feature will be removed in a feature release."));
-            request.addParameter("ignore_throttled", "false");
-            assertThat(XContentMapValues.extractValue("hits.total.value", entityAsMap(client().performRequest(request))),
-                equalTo(totalHits));
-            final Request unfreezeRequest = new Request("POST", index + "/_unfreeze");
-            unfreezeRequest.setOptions(
-                expectWarnings(
-                    "Frozen indices are deprecated because they provide no benefit given "
-                        + "improvements in heap memory utilization. They will be removed in a future release."
-                )
-            );
-            assertOK(client().performRequest(unfreezeRequest));
-            ensureGreen(index);
-            assertNoFileBasedRecovery(index, n -> true);
-        }
-    }
-
     @SuppressWarnings("unchecked")
     public void testDataStreams() throws Exception {
         assumeTrue("no data streams in versions before " + Version.V_7_9_0, getOldClusterVersion().onOrAfter(Version.V_7_9_0));