Package org.apache.solr.client.solrj.impl

# Class CloudSolrClient

java.lang.Object
org.apache.solr.client.solrj.SolrClient
org.apache.solr.client.solrj.impl.CloudSolrClient

All Implemented Interfaces:
  `Closeable`, `Serializable`, `AutoCloseable`

Direct Known Subclasses:
  `CloudHttp2SolrClient`

public abstract class CloudSolrClient extends SolrClient
A `SolrClient` that routes requests to ideal nodes, including splitting update batches to the correct shards. It uses `LBSolrClient` as well, thus offering fail-over abilities if a core or node becomes unavailable. It's able to know where to route requests due to its knowledge of the SolrCloud "cluster state".

See Also:
  - Serialized Form

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`static class`
`CloudSolrClient.Builder`
Constructs `CloudSolrClient` instances from provided configuration.
`static class`
`CloudSolrClient.RouteException`
`static class`
`CloudSolrClient.RouteResponse<T extends LBSolrClient.Req>`
`protected static class`
`CloudSolrClient.StateCache`

## Nested classes/interfaces inherited from class org.apache.solr.client.solrj.SolrClient

`SolrClient.SolrClientFunction<C extends SolrClient,R>`

## Field Summary

Fields
Modifier and Type
Field
Description
`protected final CloudSolrClient.StateCache`
`collectionStateCache`
`protected long`
`retryExpiryTimeNano`
`static final String`
`STATE_VERSION`

### Fields inherited from class org.apache.solr.client.solrj.SolrClient

`defaultCollection`

## Constructor Summary

Constructors
Modifier
Constructor
Description
`protected`
`CloudSolrClient(boolean updatesToLeaders, boolean parallelUpdates, boolean directUpdatesToLeadersOnly)`
`protected`
`CloudSolrClient(boolean updatesToLeaders, boolean parallelUpdates, boolean directUpdatesToLeadersOnly, int stateRefreshThreads)`

## Method Summary

Modifier and Type
Method
Description
`void`
`close()`
`CloudSolrClient.RouteResponse`
`condenseResponse(NamedList<?> response, int timeMillis)`
`protected <T extends CloudSolrClient.RouteResponse<?>>
T`
`condenseResponse(NamedList<?> response, int timeMillis, Supplier<T> supplier)`
`void`
`connect()`
Deprecated.
Call `ClusterStateProvider.getLiveNodes()` instead.
`void`
`connect(long duration, TimeUnit timeUnit)`
Deprecated.
`protected Map<String,? extends LBSolrClient.Req>`
`createRoutes(UpdateRequest updateRequest, ModifiableSolrParams routableParams, DocCollection col, DocRouter router, Map<String,List<String>> urlMap, String routeField)`
`ClusterState`
`getClusterState()`
Deprecated.
problematic as a 'get' method, since one implementation will do a remote request each time this is called, potentially return lots of data that isn't even needed.
`abstract ClusterStateProvider`
`getClusterStateProvider()`
`protected DocCollection`
`getDocCollection(String collection, Integer expectedVersion)`
`protected abstract LBSolrClient`
`getLbClient()`
`int`
`getMinAchievedReplicationFactor(String collection, NamedList<?> resp)`
Useful for determining the minimum achieved replication factor across all shards involved in processing an update request, typically useful for gauging the replication factor of a batch.
`ResponseParser`
`getParser()`
`RequestWriter`
`getRequestWriter()`
`protected CloudSolrClient.RouteException`
`getRouteException(SolrException.ErrorCode serverError, NamedList<Throwable> exceptions, Map<String,? extends LBSolrClient.Req> routes)`
`Map<String,Integer>`
`getShardReplicationFactor(String collection, NamedList<?> resp)`
Walks the NamedList response after performing an update request looking for the replication factor that was achieved in each shard involved in the request.
`protected int`
`getStateRefreshParallelism()`
Visible for tests so they can assert the configured refresh parallelism.
`boolean`
`isDirectUpdatesToLeadersOnly()`
If true, this client has been configured such that "direct updates" will only be sent to the current leader of the corresponding shard, and will not be retried with other replicas.
`boolean`
`isParallelUpdates()`
Gets whether direct updates are sent in parallel
`boolean`
`isUpdatesToLeaders()`
If true, this client has been configured such that it will generally prefer to send `SolrRequest.SolrRequestType.UPDATE` requests to a shard leader, if and only if `UpdateRequest.isSendToLeaders()` is also true.
`NamedList<Object>`
`request(SolrRequest<?> request, String collection)`
Execute a request against a Solr server for a given collection
`protected NamedList<Object>`
`requestWithRetryOnStaleState(SolrRequest<?> request, int retryCount, List<String> inputCollections, boolean skipStateVersion, Map<String,CompletableFuture<DocCollection>> pendingRefreshes, boolean waitedForRefresh)`
As this class doesn't watch external collections on the client side, there's a chance that the request will fail due to cached stale state, which means the state must be refreshed from ZK and retried.
`protected NamedList<Object>`
`sendRequest(SolrRequest<?> request, List<String> inputCollections)`
`protected boolean`
`wasCommError(Throwable t)`
Is this a communication error? We will retry if so.

### Methods inherited from class org.apache.solr.client.solrj.SolrClient

`add, add, add, add, add, add, add, add, add, add, addBean, addBean, addBean, addBean, addBeans, addBeans, addBeans, addBeans, addBeans, addBeans, commit, commit, commit, commit, commit, commit, deleteById, deleteById, deleteById, deleteById, deleteById, deleteById, deleteById, deleteById, deleteByQuery, deleteByQuery, deleteByQuery, deleteByQuery, getById, getById, getById, getById, getById, getById, getById, getById, getContext, getDefaultCollection, optimize, optimize, optimize, optimize, optimize, optimize, ping, ping, query, query, query, query, queryAndStreamResponse, queryAndStreamResponse, queryAndStreamResponse, request, rollback, rollback`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### STATE_VERSION

public static final String STATE_VERSION

See Also:
  - Constant Field Values

### retryExpiryTimeNano

protected long retryExpiryTimeNano

### collectionStateCache

protected final CloudSolrClient.StateCache collectionStateCache

## Constructor Details

### CloudSolrClient

protected CloudSolrClient(boolean updatesToLeaders, boolean parallelUpdates, boolean directUpdatesToLeadersOnly)

### CloudSolrClient

protected CloudSolrClient(boolean updatesToLeaders, boolean parallelUpdates, boolean directUpdatesToLeadersOnly, int stateRefreshThreads)

## Method Details

### getLbClient

protected abstract LBSolrClient getLbClient()

### getClusterStateProvider

public abstract ClusterStateProvider getClusterStateProvider()

### getClusterState

@Deprecated public ClusterState getClusterState()
Deprecated.
problematic as a 'get' method, since one implementation will do a remote request each time this is called, potentially return lots of data that isn't even needed.

### wasCommError

protected boolean wasCommError(Throwable t)
Is this a communication error? We will retry if so.

### close

public void close()

### getParser

public ResponseParser getParser()

### getRequestWriter

public RequestWriter getRequestWriter()

### isParallelUpdates

public boolean isParallelUpdates()
Gets whether direct updates are sent in parallel

### connect

@Deprecated public void connect()
Deprecated.
Call `ClusterStateProvider.getLiveNodes()` instead.
Connect to the zookeeper ensemble. This is an optional method that may be used to force a connection before any other requests are sent.

### connect

@Deprecated public void connect(long duration, TimeUnit timeUnit) throws TimeoutException, InterruptedException
Deprecated.
Connect to a cluster. If the cluster is not ready, retry connection up to a given timeout.

Parameters:
  `duration` - the timeout
  `timeUnit` - the units of the timeout
Throws:
  `TimeoutException` - if the cluster is not ready after the timeout
  `InterruptedException` - if the wait is interrupted

### getRouteException

protected CloudSolrClient.RouteException getRouteException(SolrException.ErrorCode serverError, NamedList<Throwable> exceptions, Map<String,? extends LBSolrClient.Req> routes)

### createRoutes

protected Map<String,? extends LBSolrClient.Req> createRoutes(UpdateRequest updateRequest, ModifiableSolrParams routableParams, DocCollection col, DocRouter router, Map<String,List<String>> urlMap, String routeField)

### condenseResponse

protected <T extends CloudSolrClient.RouteResponse<?>> T condenseResponse(NamedList<?> response, int timeMillis, Supplier<T> supplier)

### condenseResponse

public CloudSolrClient.RouteResponse condenseResponse(NamedList<?> response, int timeMillis)

### request

public NamedList<Object> request(SolrRequest<?> request, String collection) throws SolrServerException, IOException
Description copied from class: `SolrClient`
Execute a request against a Solr server for a given collection

Specified by:
  `request` in class `SolrClient`
Parameters:
  `request` - the request to execute
  `collection` - the collection to execute the request against
Returns:
  a `NamedList` containing the response from the server
Throws:
  `SolrServerException` - if there is an error on the server
  `IOException` - If there is a low-level I/O error.

### requestWithRetryOnStaleState

protected NamedList<Object> requestWithRetryOnStaleState(SolrRequest<?> request, int retryCount, List<String> inputCollections, boolean skipStateVersion, Map<String,CompletableFuture<DocCollection>> pendingRefreshes, boolean waitedForRefresh) throws SolrServerException, IOException
As this class doesn't watch external collections on the client side, there's a chance that the request will fail due to cached stale state, which means the state must be refreshed from ZK and retried.

Throws:
  `SolrServerException`
  `IOException`

### sendRequest

protected NamedList<Object> sendRequest(SolrRequest<?> request, List<String> inputCollections) throws SolrServerException, IOException

Throws:
  `SolrServerException`
  `IOException`

### isUpdatesToLeaders

public boolean isUpdatesToLeaders()
If true, this client has been configured such that it will generally prefer to send `SolrRequest.SolrRequestType.UPDATE` requests to a shard leader, if and only if `UpdateRequest.isSendToLeaders()` is also true. If false, then this client has been configured to obey normal routing preferences when dealing with `SolrRequest.SolrRequestType.UPDATE` requests.

See Also:
  - `isDirectUpdatesToLeadersOnly()`

### isDirectUpdatesToLeadersOnly

public boolean isDirectUpdatesToLeadersOnly()
If true, this client has been configured such that "direct updates" will only be sent to the current leader of the corresponding shard, and will not be retried with other replicas. This method has no effect if `isUpdatesToLeaders()` or `UpdateRequest.isSendToLeaders()` returns false.

A "direct update" is any update that can be sent directly to a single shard, and does not need to be broadcast to every shard. (Example: document updates or "delete by id" when using the default router; non-direct updates are things like commits and "delete by query").

NOTE: If a single `UpdateRequest` contains multiple "direct updates" for different shards, this client may break the request up and merge the responses.

Returns:
  true if direct updates are sent to shard leaders only

### getStateRefreshParallelism

protected int getStateRefreshParallelism()
Visible for tests so they can assert the configured refresh parallelism.

### getDocCollection

protected DocCollection getDocCollection(String collection, Integer expectedVersion) throws SolrException

Throws:
  `SolrException`

### getMinAchievedReplicationFactor

public int getMinAchievedReplicationFactor(String collection, NamedList<?> resp)
Useful for determining the minimum achieved replication factor across all shards involved in processing an update request, typically useful for gauging the replication factor of a batch.

### getShardReplicationFactor

public Map<String,Integer> getShardReplicationFactor(String collection, NamedList<?> resp)
Walks the NamedList response after performing an update request looking for the replication factor that was achieved in each shard involved in the request. For single doc updates, there will be only one shard in the return value.