Search in sources :

Example 1 with SnapshotInProgressException

use of org.opensearch.snapshots.SnapshotInProgressException in project OpenSearch by opensearch-project.

the class ExceptionSerializationTests method testSnapshotInProgressException.

public void testSnapshotInProgressException() throws IOException {
    SnapshotInProgressException orig = new SnapshotInProgressException("boom");
    Version version = VersionUtils.randomIndexCompatibleVersion(random());
    SnapshotInProgressException ex = serialize(orig, version);
    assertEquals(orig.getMessage(), ex.getMessage());
}
Also used : SnapshotInProgressException(org.opensearch.snapshots.SnapshotInProgressException)

Example 2 with SnapshotInProgressException

use of org.opensearch.snapshots.SnapshotInProgressException in project OpenSearch by opensearch-project.

the class MetadataDeleteIndexService method deleteIndices.

/**
 * Delete some indices from the cluster state.
 */
public ClusterState deleteIndices(ClusterState currentState, Set<Index> indices) {
    final Metadata meta = currentState.metadata();
    final Set<Index> indicesToDelete = new HashSet<>();
    final Map<Index, DataStream> backingIndices = new HashMap<>();
    for (Index index : indices) {
        IndexMetadata im = meta.getIndexSafe(index);
        IndexAbstraction.DataStream parent = meta.getIndicesLookup().get(im.getIndex().getName()).getParentDataStream();
        if (parent != null) {
            if (parent.getWriteIndex().equals(im)) {
                throw new IllegalArgumentException("index [" + index.getName() + "] is the write index for data stream [" + parent.getName() + "] and cannot be deleted");
            } else {
                backingIndices.put(index, parent.getDataStream());
            }
        }
        indicesToDelete.add(im.getIndex());
    }
    // Check if index deletion conflicts with any running snapshots
    Set<Index> snapshottingIndices = SnapshotsService.snapshottingIndices(currentState, indicesToDelete);
    if (snapshottingIndices.isEmpty() == false) {
        throw new SnapshotInProgressException("Cannot delete indices that are being snapshotted: " + snapshottingIndices + ". Try again after snapshot finishes or cancel the currently running snapshot.");
    }
    RoutingTable.Builder routingTableBuilder = RoutingTable.builder(currentState.routingTable());
    Metadata.Builder metadataBuilder = Metadata.builder(meta);
    ClusterBlocks.Builder clusterBlocksBuilder = ClusterBlocks.builder().blocks(currentState.blocks());
    final IndexGraveyard.Builder graveyardBuilder = IndexGraveyard.builder(metadataBuilder.indexGraveyard());
    final int previousGraveyardSize = graveyardBuilder.tombstones().size();
    for (final Index index : indices) {
        String indexName = index.getName();
        logger.info("{} deleting index", index);
        routingTableBuilder.remove(indexName);
        clusterBlocksBuilder.removeIndexBlocks(indexName);
        metadataBuilder.remove(indexName);
        if (backingIndices.containsKey(index)) {
            DataStream parent = metadataBuilder.dataStream(backingIndices.get(index).getName());
            metadataBuilder.put(parent.removeBackingIndex(index));
        }
    }
    // add tombstones to the cluster state for each deleted index
    final IndexGraveyard currentGraveyard = graveyardBuilder.addTombstones(indices).build(settings);
    // the new graveyard set on the metadata
    metadataBuilder.indexGraveyard(currentGraveyard);
    logger.trace("{} tombstones purged from the cluster state. Previous tombstone size: {}. Current tombstone size: {}.", graveyardBuilder.getNumPurged(), previousGraveyardSize, currentGraveyard.getTombstones().size());
    Metadata newMetadata = metadataBuilder.build();
    ClusterBlocks blocks = clusterBlocksBuilder.build();
    // update snapshot restore entries
    ImmutableOpenMap<String, ClusterState.Custom> customs = currentState.getCustoms();
    final RestoreInProgress restoreInProgress = currentState.custom(RestoreInProgress.TYPE, RestoreInProgress.EMPTY);
    RestoreInProgress updatedRestoreInProgress = RestoreService.updateRestoreStateWithDeletedIndices(restoreInProgress, indices);
    if (updatedRestoreInProgress != restoreInProgress) {
        ImmutableOpenMap.Builder<String, ClusterState.Custom> builder = ImmutableOpenMap.builder(customs);
        builder.put(RestoreInProgress.TYPE, updatedRestoreInProgress);
        customs = builder.build();
    }
    return allocationService.reroute(ClusterState.builder(currentState).routingTable(routingTableBuilder.build()).metadata(newMetadata).blocks(blocks).customs(customs).build(), "deleted indices [" + indices + "]");
}
Also used : HashMap(java.util.HashMap) Index(org.opensearch.index.Index) ImmutableOpenMap(org.opensearch.common.collect.ImmutableOpenMap) HashSet(java.util.HashSet) ClusterBlocks(org.opensearch.cluster.block.ClusterBlocks) RestoreInProgress(org.opensearch.cluster.RestoreInProgress) RoutingTable(org.opensearch.cluster.routing.RoutingTable) SnapshotInProgressException(org.opensearch.snapshots.SnapshotInProgressException)

Example 3 with SnapshotInProgressException

use of org.opensearch.snapshots.SnapshotInProgressException in project OpenSearch by opensearch-project.

the class MetadataIndexStateService method addIndexClosedBlocks.

/**
 * Step 1 - Start closing indices by adding a write block
 *
 * This step builds the list of indices to close (the ones explicitly requested that are not in CLOSE state) and adds a unique cluster
 * block (or reuses an existing one) to every index to close in the cluster state. After the cluster state is published, the shards
 * should start to reject writing operations and we can proceed with step 2.
 */
static ClusterState addIndexClosedBlocks(final Index[] indices, final Map<Index, ClusterBlock> blockedIndices, final ClusterState currentState) {
    final Metadata.Builder metadata = Metadata.builder(currentState.metadata());
    final Set<Index> indicesToClose = new HashSet<>();
    for (Index index : indices) {
        final IndexMetadata indexMetadata = metadata.getSafe(index);
        if (indexMetadata.getState() != IndexMetadata.State.CLOSE) {
            indicesToClose.add(index);
        } else {
            logger.debug("index {} is already closed, ignoring", index);
            assert currentState.blocks().hasIndexBlock(index.getName(), INDEX_CLOSED_BLOCK);
        }
    }
    if (indicesToClose.isEmpty()) {
        return currentState;
    }
    // Check if index closing conflicts with any running restores
    Set<Index> restoringIndices = RestoreService.restoringIndices(currentState, indicesToClose);
    if (restoringIndices.isEmpty() == false) {
        throw new IllegalArgumentException("Cannot close indices that are being restored: " + restoringIndices);
    }
    // Check if index closing conflicts with any running snapshots
    Set<Index> snapshottingIndices = SnapshotsService.snapshottingIndices(currentState, indicesToClose);
    if (snapshottingIndices.isEmpty() == false) {
        throw new SnapshotInProgressException("Cannot close indices that are being snapshotted: " + snapshottingIndices + ". Try again after snapshot finishes or cancel the currently running snapshot.");
    }
    final ClusterBlocks.Builder blocks = ClusterBlocks.builder().blocks(currentState.blocks());
    final RoutingTable.Builder routingTable = RoutingTable.builder(currentState.routingTable());
    for (Index index : indicesToClose) {
        ClusterBlock indexBlock = null;
        final Set<ClusterBlock> clusterBlocks = currentState.blocks().indices().get(index.getName());
        if (clusterBlocks != null) {
            for (ClusterBlock clusterBlock : clusterBlocks) {
                if (clusterBlock.id() == INDEX_CLOSED_BLOCK_ID) {
                    // Reuse the existing index closed block
                    indexBlock = clusterBlock;
                    break;
                }
            }
        }
        if (indexBlock == null) {
            // Create a new index closed block
            indexBlock = createIndexClosingBlock();
        }
        assert Strings.hasLength(indexBlock.uuid()) : "Closing block should have a UUID";
        blocks.addIndexBlock(index.getName(), indexBlock);
        blockedIndices.put(index, indexBlock);
    }
    logger.info(() -> new ParameterizedMessage("closing indices {}", blockedIndices.keySet().stream().map(Object::toString).collect(Collectors.joining(","))));
    return ClusterState.builder(currentState).blocks(blocks).metadata(metadata).routingTable(routingTable.build()).build();
}
Also used : ClusterBlocks(org.opensearch.cluster.block.ClusterBlocks) Index(org.opensearch.index.Index) ClusterBlock(org.opensearch.cluster.block.ClusterBlock) IndexShardRoutingTable(org.opensearch.cluster.routing.IndexShardRoutingTable) IndexRoutingTable(org.opensearch.cluster.routing.IndexRoutingTable) RoutingTable(org.opensearch.cluster.routing.RoutingTable) ParameterizedMessage(org.apache.logging.log4j.message.ParameterizedMessage) SnapshotInProgressException(org.opensearch.snapshots.SnapshotInProgressException) HashSet(java.util.HashSet)

Example 4 with SnapshotInProgressException

use of org.opensearch.snapshots.SnapshotInProgressException in project OpenSearch by opensearch-project.

the class DeleteDataStreamRequestTests method testDeleteSnapshottingDataStream.

public void testDeleteSnapshottingDataStream() {
    final String dataStreamName = "my-data-stream1";
    final String dataStreamName2 = "my-data-stream2";
    final List<String> otherIndices = randomSubsetOf(Arrays.asList("foo", "bar", "baz"));
    ClusterState cs = getClusterStateWithDataStreams(Arrays.asList(new Tuple<>(dataStreamName, 2), new Tuple<>(dataStreamName2, 2)), otherIndices);
    SnapshotsInProgress snapshotsInProgress = SnapshotsInProgress.of(Arrays.asList(createEntry(dataStreamName, "repo1", false), createEntry(dataStreamName2, "repo2", true)));
    ClusterState snapshotCs = ClusterState.builder(cs).putCustom(SnapshotsInProgress.TYPE, snapshotsInProgress).build();
    DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(new String[] { dataStreamName });
    SnapshotInProgressException e = expectThrows(SnapshotInProgressException.class, () -> DeleteDataStreamAction.TransportAction.removeDataStream(getMetadataDeleteIndexService(), snapshotCs, req));
    assertThat(e.getMessage(), equalTo("Cannot delete data streams that are being snapshotted: [my-data-stream1]. Try again after " + "snapshot finishes or cancel the currently running snapshot."));
}
Also used : ClusterState(org.opensearch.cluster.ClusterState) Request(org.opensearch.action.admin.indices.datastream.DeleteDataStreamAction.Request) SnapshotsInProgress(org.opensearch.cluster.SnapshotsInProgress) Request(org.opensearch.action.admin.indices.datastream.DeleteDataStreamAction.Request) Matchers.containsString(org.hamcrest.Matchers.containsString) SnapshotInProgressException(org.opensearch.snapshots.SnapshotInProgressException) Tuple(org.opensearch.common.collect.Tuple)

Aggregations

SnapshotInProgressException (org.opensearch.snapshots.SnapshotInProgressException)4 HashSet (java.util.HashSet)2 ClusterBlocks (org.opensearch.cluster.block.ClusterBlocks)2 RoutingTable (org.opensearch.cluster.routing.RoutingTable)2 Index (org.opensearch.index.Index)2 HashMap (java.util.HashMap)1 ParameterizedMessage (org.apache.logging.log4j.message.ParameterizedMessage)1 Matchers.containsString (org.hamcrest.Matchers.containsString)1 Request (org.opensearch.action.admin.indices.datastream.DeleteDataStreamAction.Request)1 ClusterState (org.opensearch.cluster.ClusterState)1 RestoreInProgress (org.opensearch.cluster.RestoreInProgress)1 SnapshotsInProgress (org.opensearch.cluster.SnapshotsInProgress)1 ClusterBlock (org.opensearch.cluster.block.ClusterBlock)1 IndexRoutingTable (org.opensearch.cluster.routing.IndexRoutingTable)1 IndexShardRoutingTable (org.opensearch.cluster.routing.IndexShardRoutingTable)1 ImmutableOpenMap (org.opensearch.common.collect.ImmutableOpenMap)1 Tuple (org.opensearch.common.collect.Tuple)1