Search in sources :

Example 1 with AsyncRecoveryTarget

use of org.elasticsearch.indices.recovery.AsyncRecoveryTarget in project crate by crate.

the class IndexShardTestCase method recoverUnstartedReplica.

/**
 * Recovers a replica from the give primary, allow the user to supply a custom recovery target. A typical usage of a custom recovery
 * target is to assert things in the various stages of recovery.
 *
 * Note: this method keeps the shard in {@link IndexShardState#POST_RECOVERY} and doesn't start it.
 *
 * @param replica                the recovery target shard
 * @param primary                the recovery source shard
 * @param targetSupplier         supplies an instance of {@link RecoveryTarget}
 * @param markAsRecovering       set to {@code false} if the replica is marked as recovering
 */
protected final void recoverUnstartedReplica(final IndexShard replica, final IndexShard primary, final BiFunction<IndexShard, DiscoveryNode, RecoveryTarget> targetSupplier, final boolean markAsRecovering, final Set<String> inSyncIds, final IndexShardRoutingTable routingTable) throws IOException {
    final DiscoveryNode pNode = getFakeDiscoNode(primary.routingEntry().currentNodeId());
    final DiscoveryNode rNode = getFakeDiscoNode(replica.routingEntry().currentNodeId());
    if (markAsRecovering) {
        replica.markAsRecovering("remote", new RecoveryState(replica.routingEntry(), pNode, rNode));
    } else {
        assertEquals(replica.state(), IndexShardState.RECOVERING);
    }
    replica.prepareForIndexRecovery();
    final RecoveryTarget recoveryTarget = targetSupplier.apply(replica, pNode);
    final long startingSeqNo = recoveryTarget.indexShard().recoverLocallyUpToGlobalCheckpoint();
    final StartRecoveryRequest request = PeerRecoveryTargetService.getStartRecoveryRequest(logger, rNode, recoveryTarget, startingSeqNo);
    int fileChunkSizeInBytes = Math.toIntExact(randomBoolean() ? RecoverySettings.DEFAULT_CHUNK_SIZE.getBytes() : randomIntBetween(1, 10 * 1024 * 1024));
    final RecoverySourceHandler recovery = new RecoverySourceHandler(primary, new AsyncRecoveryTarget(recoveryTarget, threadPool.generic()), threadPool, request, fileChunkSizeInBytes, between(1, 8), between(1, 8));
    primary.updateShardState(primary.routingEntry(), primary.getPendingPrimaryTerm(), null, currentClusterStateVersion.incrementAndGet(), inSyncIds, routingTable);
    try {
        PlainActionFuture<RecoveryResponse> future = new PlainActionFuture<>();
        recovery.recoverToTarget(future);
        future.actionGet();
        recoveryTarget.markAsDone();
    } catch (Exception e) {
        recoveryTarget.fail(new RecoveryFailedException(request, e), false);
        throw e;
    }
}
Also used : DiscoveryNode(org.elasticsearch.cluster.node.DiscoveryNode) StartRecoveryRequest(org.elasticsearch.indices.recovery.StartRecoveryRequest) AsyncRecoveryTarget(org.elasticsearch.indices.recovery.AsyncRecoveryTarget) AsyncRecoveryTarget(org.elasticsearch.indices.recovery.AsyncRecoveryTarget) RecoveryTarget(org.elasticsearch.indices.recovery.RecoveryTarget) IndexNotFoundException(org.elasticsearch.index.IndexNotFoundException) RecoveryFailedException(org.elasticsearch.indices.recovery.RecoveryFailedException) IOException(java.io.IOException) RecoveryResponse(org.elasticsearch.indices.recovery.RecoveryResponse) PlainActionFuture(org.elasticsearch.action.support.PlainActionFuture) RecoverySourceHandler(org.elasticsearch.indices.recovery.RecoverySourceHandler) RecoveryFailedException(org.elasticsearch.indices.recovery.RecoveryFailedException) RecoveryState(org.elasticsearch.indices.recovery.RecoveryState)

Aggregations

IOException (java.io.IOException)1 PlainActionFuture (org.elasticsearch.action.support.PlainActionFuture)1 DiscoveryNode (org.elasticsearch.cluster.node.DiscoveryNode)1 IndexNotFoundException (org.elasticsearch.index.IndexNotFoundException)1 AsyncRecoveryTarget (org.elasticsearch.indices.recovery.AsyncRecoveryTarget)1 RecoveryFailedException (org.elasticsearch.indices.recovery.RecoveryFailedException)1 RecoveryResponse (org.elasticsearch.indices.recovery.RecoveryResponse)1 RecoverySourceHandler (org.elasticsearch.indices.recovery.RecoverySourceHandler)1 RecoveryState (org.elasticsearch.indices.recovery.RecoveryState)1 RecoveryTarget (org.elasticsearch.indices.recovery.RecoveryTarget)1 StartRecoveryRequest (org.elasticsearch.indices.recovery.StartRecoveryRequest)1