Briefly, this error occurs when Elasticsearch’s refresh operation is overwhelmed with too many requests. The refresh operation is responsible for making new data searchable. If the number of requests exceeds the available slots, it forces a refresh, causing this error. To resolve this, you can increase the refresh interval, reduce the indexing rate, or increase the capacity of your Elasticsearch cluster. Additionally, optimizing your indexing operations and ensuring your data is evenly distributed across the cluster can help prevent this error.
This guide will help you check for common problems that cause the log ” block until refresh ran out of slots and forced a refresh: [{}] ” to appear. To understand the issues related to this log, read the explanation below about the following Elasticsearch concepts: replication, refresh.
Overview
Replication refers to storing a redundant copy of the data. Starting from version 7.x, Elasticsearch creates one primary shard with a replication factor set to 1. Replicas never get assigned to the same node on which primary shards are assigned, which means you should have at least two nodes in the cluster to assign the replicas. If a primary shard goes down, the replica automatically acts as a primary shard.
What it is used for
Replicas are used to provide high availability and failover. A higher number of replicas is also helpful for faster searches.
Examples
Update replica count
PUT /api-logs/_settings?pretty { "index" : { "number_of_replicas" : 2 } }
Common problems
- By default, new replicas are not assigned to nodes with more than 85% disk usage. Instead, Elasticsearch throws a warning.
- Creating too many replicas may cause a problem if there are not enough resources available in the cluster.
Log Context
Log “block until refresh ran out of slots and forced a refresh: [{}]” classname is TransportWriteAction.java.
We extracted the following from Elasticsearch source code for those seeking an in-depth context :
ActionListenerrefreshListener = new ActionListener() { @Override public void onResponse(Boolean forceRefresh) { // TODO: Maybe move this into PostWriteRefresh if (forceRefresh && request.getRefreshPolicy() == WriteRequest.RefreshPolicy.WAIT_UNTIL) { logger.warn("block until refresh ran out of slots and forced a refresh: [{}]"; request); } refreshed.set(forceRefresh); maybeFinish(); }
[ratemypost]