Search in sources :

Example 96 with Tuple

use of org.opensearch.common.collect.Tuple in project OpenSearch by opensearch-project.

the class BlobStoreRepository method cloneShardSnapshot.

@Override
public void cloneShardSnapshot(SnapshotId source, SnapshotId target, RepositoryShardId shardId, @Nullable String shardGeneration, ActionListener<String> listener) {
    if (isReadOnly()) {
        listener.onFailure(new RepositoryException(metadata.name(), "cannot clone shard snapshot on a readonly repository"));
        return;
    }
    final IndexId index = shardId.index();
    final int shardNum = shardId.shardId();
    final Executor executor = threadPool.executor(ThreadPool.Names.SNAPSHOT);
    executor.execute(ActionRunnable.supply(listener, () -> {
        final long startTime = threadPool.absoluteTimeInMillis();
        final BlobContainer shardContainer = shardContainer(index, shardNum);
        final BlobStoreIndexShardSnapshots existingSnapshots;
        final String newGen;
        final String existingShardGen;
        if (shardGeneration == null) {
            Tuple<BlobStoreIndexShardSnapshots, Long> tuple = buildBlobStoreIndexShardSnapshots(shardContainer.listBlobsByPrefix(INDEX_FILE_PREFIX).keySet(), shardContainer);
            existingShardGen = String.valueOf(tuple.v2());
            newGen = String.valueOf(tuple.v2() + 1);
            existingSnapshots = tuple.v1();
        } else {
            newGen = UUIDs.randomBase64UUID();
            existingSnapshots = buildBlobStoreIndexShardSnapshots(Collections.emptySet(), shardContainer, shardGeneration).v1();
            existingShardGen = shardGeneration;
        }
        SnapshotFiles existingTargetFiles = null;
        SnapshotFiles sourceFiles = null;
        for (SnapshotFiles existingSnapshot : existingSnapshots) {
            final String snapshotName = existingSnapshot.snapshot();
            if (snapshotName.equals(target.getName())) {
                existingTargetFiles = existingSnapshot;
            } else if (snapshotName.equals(source.getName())) {
                sourceFiles = existingSnapshot;
            }
            if (sourceFiles != null && existingTargetFiles != null) {
                break;
            }
        }
        if (sourceFiles == null) {
            throw new RepositoryException(metadata.name(), "Can't create clone of [" + shardId + "] for snapshot [" + target + "]. The source snapshot [" + source + "] was not found in the shard metadata.");
        }
        if (existingTargetFiles != null) {
            if (existingTargetFiles.isSame(sourceFiles)) {
                return existingShardGen;
            }
            throw new RepositoryException(metadata.name(), "Can't create clone of [" + shardId + "] for snapshot [" + target + "]. A snapshot by that name already exists for this shard.");
        }
        final BlobStoreIndexShardSnapshot sourceMeta = loadShardSnapshot(shardContainer, source);
        logger.trace("[{}] [{}] writing shard snapshot file for clone", shardId, target);
        INDEX_SHARD_SNAPSHOT_FORMAT.write(sourceMeta.asClone(target.getName(), startTime, threadPool.absoluteTimeInMillis() - startTime), shardContainer, target.getUUID(), compress);
        INDEX_SHARD_SNAPSHOTS_FORMAT.write(existingSnapshots.withClone(source.getName(), target.getName()), shardContainer, newGen, compress);
        return newGen;
    }));
}
Also used : BlobStoreIndexShardSnapshots(org.opensearch.index.snapshots.blobstore.BlobStoreIndexShardSnapshots) SnapshotFiles(org.opensearch.index.snapshots.blobstore.SnapshotFiles) IndexId(org.opensearch.repositories.IndexId) BlobStoreIndexShardSnapshot(org.opensearch.index.snapshots.blobstore.BlobStoreIndexShardSnapshot) Executor(java.util.concurrent.Executor) FsBlobContainer(org.opensearch.common.blobstore.fs.FsBlobContainer) BlobContainer(org.opensearch.common.blobstore.BlobContainer) RepositoryException(org.opensearch.repositories.RepositoryException) Tuple(org.opensearch.common.collect.Tuple)

Example 97 with Tuple

use of org.opensearch.common.collect.Tuple in project OpenSearch by opensearch-project.

the class BlobStoreRepository method cacheRepositoryData.

/**
 * Puts the given {@link RepositoryData} into the cache if it is of a newer generation and only if the repository is not using
 * {@link #bestEffortConsistency}. When using {@link #bestEffortConsistency} the repository is using listing to find the latest
 * {@code index-N} blob and there are no hard guarantees that a given repository generation won't be reused since an external
 * modification can lead to moving from a higher {@code N} to a lower {@code N} value which mean we can't safely assume that a given
 * generation will always contain the same {@link RepositoryData}.
 *
 * @param updated    serialized RepositoryData to cache if newer than the cache contents
 * @param generation repository generation of the given repository data
 */
private void cacheRepositoryData(BytesReference updated, long generation) {
    if (cacheRepositoryData && bestEffortConsistency == false) {
        final BytesReference serialized;
        try {
            serialized = CompressorFactory.COMPRESSOR.compress(updated);
            final int len = serialized.length();
            if (len > ByteSizeUnit.KB.toBytes(500)) {
                logger.debug("Not caching repository data of size [{}] for repository [{}] because it is larger than 500KB in" + " serialized size", len, metadata.name());
                if (len > ByteSizeUnit.MB.toBytes(5)) {
                    logger.warn("Your repository metadata blob for repository [{}] is larger than 5MB. Consider moving to a fresh" + " repository for new snapshots or deleting unneeded snapshots from your repository to ensure stable" + " repository behavior going forward.", metadata.name());
                }
                // Set empty repository data to not waste heap for an outdated cached value
                latestKnownRepositoryData.set(null);
                return;
            }
        } catch (IOException e) {
            assert false : new AssertionError("Impossible, no IO happens here", e);
            logger.warn("Failed to serialize repository data", e);
            return;
        }
        latestKnownRepositoryData.updateAndGet(known -> {
            if (known != null && known.v1() > generation) {
                return known;
            }
            return new Tuple<>(generation, serialized);
        });
    }
}
Also used : BytesReference(org.opensearch.common.bytes.BytesReference) IOException(java.io.IOException) Tuple(org.opensearch.common.collect.Tuple)

Example 98 with Tuple

use of org.opensearch.common.collect.Tuple in project OpenSearch by opensearch-project.

the class GetDataStreamsRequestTests method testGetDataStream.

public void testGetDataStream() {
    final String dataStreamName = "my-data-stream";
    ClusterState cs = getClusterStateWithDataStreams(org.opensearch.common.collect.List.of(new Tuple<>(dataStreamName, 1)), org.opensearch.common.collect.List.of());
    GetDataStreamAction.Request req = new GetDataStreamAction.Request(new String[] { dataStreamName });
    List<DataStream> dataStreams = GetDataStreamAction.TransportAction.getDataStreams(cs, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), req);
    assertThat(dataStreams.size(), equalTo(1));
    assertThat(dataStreams.get(0).getName(), equalTo(dataStreamName));
}
Also used : ClusterState(org.opensearch.cluster.ClusterState) DataStream(org.opensearch.cluster.metadata.DataStream) Request(org.opensearch.action.admin.indices.datastream.GetDataStreamAction.Request) ThreadContext(org.opensearch.common.util.concurrent.ThreadContext) Request(org.opensearch.action.admin.indices.datastream.GetDataStreamAction.Request) Matchers.containsString(org.hamcrest.Matchers.containsString) IndexNameExpressionResolver(org.opensearch.cluster.metadata.IndexNameExpressionResolver) Tuple(org.opensearch.common.collect.Tuple)

Example 99 with Tuple

use of org.opensearch.common.collect.Tuple in project OpenSearch by opensearch-project.

the class GetDataStreamsRequestTests method testGetDataStreamsWithoutWildcards.

public void testGetDataStreamsWithoutWildcards() {
    final String[] dataStreamNames = { "my-data-stream", "another-data-stream" };
    ClusterState cs = getClusterStateWithDataStreams(org.opensearch.common.collect.List.of(new Tuple<>(dataStreamNames[0], 1), new Tuple<>(dataStreamNames[1], 1)), org.opensearch.common.collect.List.of());
    GetDataStreamAction.Request req = new GetDataStreamAction.Request(new String[] { dataStreamNames[0], dataStreamNames[1] });
    List<DataStream> dataStreams = GetDataStreamAction.TransportAction.getDataStreams(cs, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), req);
    assertThat(dataStreams.size(), equalTo(2));
    assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[1]));
    assertThat(dataStreams.get(1).getName(), equalTo(dataStreamNames[0]));
    req = new GetDataStreamAction.Request(new String[] { dataStreamNames[1] });
    dataStreams = GetDataStreamAction.TransportAction.getDataStreams(cs, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), req);
    assertThat(dataStreams.size(), equalTo(1));
    assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[1]));
    req = new GetDataStreamAction.Request(new String[] { dataStreamNames[0] });
    dataStreams = GetDataStreamAction.TransportAction.getDataStreams(cs, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), req);
    assertThat(dataStreams.size(), equalTo(1));
    assertThat(dataStreams.get(0).getName(), equalTo(dataStreamNames[0]));
    GetDataStreamAction.Request req2 = new GetDataStreamAction.Request(new String[] { "foo" });
    IndexNotFoundException e = expectThrows(IndexNotFoundException.class, () -> GetDataStreamAction.TransportAction.getDataStreams(cs, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY)), req2));
    assertThat(e.getMessage(), containsString("no such index [foo]"));
}
Also used : ClusterState(org.opensearch.cluster.ClusterState) DataStream(org.opensearch.cluster.metadata.DataStream) Request(org.opensearch.action.admin.indices.datastream.GetDataStreamAction.Request) ThreadContext(org.opensearch.common.util.concurrent.ThreadContext) IndexNotFoundException(org.opensearch.index.IndexNotFoundException) Request(org.opensearch.action.admin.indices.datastream.GetDataStreamAction.Request) Matchers.containsString(org.hamcrest.Matchers.containsString) IndexNameExpressionResolver(org.opensearch.cluster.metadata.IndexNameExpressionResolver) Tuple(org.opensearch.common.collect.Tuple)

Example 100 with Tuple

use of org.opensearch.common.collect.Tuple in project OpenSearch by opensearch-project.

the class PutMappingRequestTests method testResolveIndicesWithWriteIndexOnlyAndNoSingleWriteIndex.

public void testResolveIndicesWithWriteIndexOnlyAndNoSingleWriteIndex() {
    String[] dataStreamNames = { "foo", "bar", "baz" };
    List<Tuple<String, Integer>> dsMetadata = org.opensearch.common.collect.List.of(tuple(dataStreamNames[0], randomIntBetween(1, 3)), tuple(dataStreamNames[1], randomIntBetween(1, 3)), tuple(dataStreamNames[2], randomIntBetween(1, 3)));
    ClusterState cs = DeleteDataStreamRequestTests.getClusterStateWithDataStreams(dsMetadata, org.opensearch.common.collect.List.of("index1", "index2", "index3"));
    final ClusterState cs2 = addAliases(cs, org.opensearch.common.collect.List.of(tuple("alias1", org.opensearch.common.collect.List.of(tuple("index1", false), tuple("index2", true))), tuple("alias2", org.opensearch.common.collect.List.of(tuple("index2", false), tuple("index3", true)))));
    PutMappingRequest request = new PutMappingRequest().indices("*").writeIndexOnly(true);
    IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> TransportPutMappingAction.resolveIndices(cs2, request, new IndexNameExpressionResolver(new ThreadContext(Settings.EMPTY))));
    assertThat(e.getMessage(), containsString("The index expression [*] and options provided did not point to a single write-index"));
}
Also used : ClusterState(org.opensearch.cluster.ClusterState) ThreadContext(org.opensearch.common.util.concurrent.ThreadContext) Matchers.containsString(org.hamcrest.Matchers.containsString) IndexNameExpressionResolver(org.opensearch.cluster.metadata.IndexNameExpressionResolver) Tuple(org.opensearch.common.collect.Tuple)

Aggregations

Tuple (org.opensearch.common.collect.Tuple)151 ArrayList (java.util.ArrayList)65 List (java.util.List)49 IOException (java.io.IOException)45 Collections (java.util.Collections)44 HashMap (java.util.HashMap)40 Map (java.util.Map)40 Settings (org.opensearch.common.settings.Settings)38 ClusterState (org.opensearch.cluster.ClusterState)34 HashSet (java.util.HashSet)28 ShardId (org.opensearch.index.shard.ShardId)28 Arrays (java.util.Arrays)27 Collectors (java.util.stream.Collectors)26 Set (java.util.Set)25 Index (org.opensearch.index.Index)25 BytesReference (org.opensearch.common.bytes.BytesReference)24 OpenSearchTestCase (org.opensearch.test.OpenSearchTestCase)24 CountDownLatch (java.util.concurrent.CountDownLatch)22 Version (org.opensearch.Version)21 Strings (org.opensearch.common.Strings)21