Flush Synced API

edit

Flush Synced Request

edit

A SyncedFlushRequest can be applied to one or more indices, or even on _all the indices:

SyncedFlushRequest request = new SyncedFlushRequest("index1"); 
SyncedFlushRequest requestMultiple = new SyncedFlushRequest("index1", "index2"); 
SyncedFlushRequest requestAll = new SyncedFlushRequest(); 

Flush synced one index

Flush synced multiple indices

Flush synced all the indices

Optional arguments

edit
request.indicesOptions(IndicesOptions.lenientExpandOpen()); 

Setting IndicesOptions controls how unavailable indices are resolved and how wildcard expressions are expanded

Synchronous execution

edit

When executing a SyncedFlushRequest in the following manner, the client waits for the SyncedFlushResponse to be returned before continuing with code execution:

SyncedFlushResponse flushSyncedResponse = client.indices().flushSynced(request, expectWarnings(
    "Synced flush is deprecated and will be removed in 8.0. Use flush at _/flush or /{index}/_flush instead."
));

Synchronous calls may throw an IOException in case of either failing to parse the REST response in the high-level REST client, the request times out or similar cases where there is no response coming back from the server.

In cases where the server returns a 4xx or 5xx error code, the high-level client tries to parse the response body error details instead and then throws a generic ElasticsearchException and adds the original ResponseException as a suppressed exception to it.

Asynchronous execution

edit

Executing a SyncedFlushRequest can also be done in an asynchronous fashion so that the client can return directly. Users need to specify how the response or potential failures will be handled by passing the request and a listener to the asynchronous flush-synced method:

client.indices().flushSyncedAsync(request, expectWarnings(
    "Synced flush is deprecated and will be removed in 8.0. Use flush at _/flush or /{index}/_flush instead."
), listener); 

The SyncedFlushRequest to execute and the ActionListener to use when the execution completes

The asynchronous method does not block and returns immediately. Once it is completed the ActionListener is called back using the onResponse method if the execution successfully completed or using the onFailure method if it failed. Failure scenarios and expected exceptions are the same as in the synchronous execution case.

A typical listener for flush-synced looks like:

ActionListener<SyncedFlushResponse> listener = new ActionListener<SyncedFlushResponse>() {
    @Override
    public void onResponse(SyncedFlushResponse refreshResponse) {
        
    }

    @Override
    public void onFailure(Exception e) {
        
    }
};

Called when the execution is successfully completed.

Called when the whole SyncedFlushRequest fails.

Flush Synced Response

edit

The returned SyncedFlushResponse allows to retrieve information about the executed operation as follows:

int totalShards = flushSyncedResponse.totalShards(); 
int successfulShards = flushSyncedResponse.successfulShards(); 
int failedShards = flushSyncedResponse.failedShards(); 

for (Map.Entry<String, SyncedFlushResponse.IndexResult> responsePerIndexEntry:
    flushSyncedResponse.getIndexResults().entrySet()) {
    String indexName = responsePerIndexEntry.getKey(); 
    SyncedFlushResponse.IndexResult indexResult = responsePerIndexEntry.getValue();
    int totalShardsForIndex = indexResult.totalShards(); 
    int successfulShardsForIndex = indexResult.successfulShards(); 
    int failedShardsForIndex = indexResult.failedShards(); 
    if (failedShardsForIndex > 0) {
        for (SyncedFlushResponse.ShardFailure failureEntry: indexResult.failures()) {
            int shardId = failureEntry.getShardId(); 
            String failureReason = failureEntry.getFailureReason(); 
            Map<String, Object> routing = failureEntry.getRouting(); 
        }
    }
}

Total number of shards hit by the flush request

Number of shards where the flush has succeeded

Number of shards where the flush has failed

Name of the index whose results we are about to calculate.

Total number of shards for index mentioned in 4.

Successful shards for index mentioned in 4.

Failed shards for index mentioned in 4.

One of the failed shard ids of the failed index mentioned in 4.

Reason for failure of copies of the shard mentioned in 8.

JSON represented by a Map<String, Object>. Contains shard related information like id, state, version etc. for the failed shard copies. If the entire shard failed then this returns an empty map.

By default, if the indices were not found, an ElasticsearchException will be thrown:

try {
    SyncedFlushRequest request = new SyncedFlushRequest("does_not_exist");
    client.indices().flushSynced(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
    if (exception.status() == RestStatus.NOT_FOUND) {
        
    }
}

Do something if the indices to be flushed were not found