Search in sources :

Example 1 with RecoverySourceHandler

use of org.elasticsearch.indices.recovery.RecoverySourceHandler in project elasticsearch by elastic.

the class IndexShardTestCase method recoverReplica.

/**
     * 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.
     * @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 recoverReplica(final IndexShard replica, final IndexShard primary, final BiFunction<IndexShard, DiscoveryNode, RecoveryTarget> targetSupplier, final boolean markAsRecovering) 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 Store.MetadataSnapshot snapshot = getMetadataSnapshotOrEmpty(replica);
    final long startingSeqNo;
    if (snapshot.size() > 0) {
        startingSeqNo = PeerRecoveryTargetService.getStartingSeqNo(recoveryTarget);
    } else {
        startingSeqNo = SequenceNumbersService.UNASSIGNED_SEQ_NO;
    }
    final StartRecoveryRequest request = new StartRecoveryRequest(replica.shardId(), pNode, rNode, snapshot, false, 0, startingSeqNo);
    final RecoverySourceHandler recovery = new RecoverySourceHandler(primary, recoveryTarget, request, () -> 0L, e -> () -> {
    }, (int) ByteSizeUnit.MB.toBytes(1), Settings.builder().put(Node.NODE_NAME_SETTING.getKey(), pNode.getName()).build());
    recovery.recoverToTarget();
    recoveryTarget.markAsDone();
    replica.updateRoutingEntry(ShardRoutingHelper.moveToStarted(replica.routingEntry()));
}
Also used : DiscoveryNode(org.elasticsearch.cluster.node.DiscoveryNode) StartRecoveryRequest(org.elasticsearch.indices.recovery.StartRecoveryRequest) RecoverySourceHandler(org.elasticsearch.indices.recovery.RecoverySourceHandler) Store(org.elasticsearch.index.store.Store) RecoveryTarget(org.elasticsearch.indices.recovery.RecoveryTarget) RecoveryState(org.elasticsearch.indices.recovery.RecoveryState)

Example 2 with RecoverySourceHandler

use of org.elasticsearch.indices.recovery.RecoverySourceHandler 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

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