All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opensearch.gateway.remote.model.RemoteClusterStateBlobStore Maven / Gradle / Ivy

There is a newer version: 2.18.0
Show newest version
/*
 * SPDX-License-Identifier: Apache-2.0
 *
 * The OpenSearch Contributors require contributions made to
 * this file be licensed under the Apache-2.0 license or a
 * compatible open source license.
 */

package org.opensearch.gateway.remote.model;

import org.opensearch.common.blobstore.BlobPath;
import org.opensearch.common.blobstore.stream.write.WritePriority;
import org.opensearch.common.remote.AbstractRemoteWritableBlobEntity;
import org.opensearch.common.remote.RemoteWritableEntityStore;
import org.opensearch.common.remote.RemoteWriteableEntity;
import org.opensearch.core.action.ActionListener;
import org.opensearch.gateway.remote.RemoteClusterStateUtils;
import org.opensearch.index.translog.transfer.BlobStoreTransferService;
import org.opensearch.repositories.blobstore.BlobStoreRepository;
import org.opensearch.threadpool.ThreadPool;

import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;

/**
 * Abstract class for a blob type storage
 *
 * @param  The entity which can be uploaded to / downloaded from blob store
 * @param  The concrete class implementing {@link RemoteWriteableEntity} which is used as a wrapper for T entity.
 */
public class RemoteClusterStateBlobStore> implements RemoteWritableEntityStore {

    private final BlobStoreTransferService transferService;
    private final BlobStoreRepository blobStoreRepository;
    private final String clusterName;
    private final ExecutorService executorService;

    public RemoteClusterStateBlobStore(
        final BlobStoreTransferService blobStoreTransferService,
        final BlobStoreRepository blobStoreRepository,
        final String clusterName,
        final ThreadPool threadPool,
        final String executor
    ) {
        this.transferService = blobStoreTransferService;
        this.blobStoreRepository = blobStoreRepository;
        this.clusterName = clusterName;
        this.executorService = threadPool.executor(executor);
    }

    @Override
    public void writeAsync(final U entity, final ActionListener listener) {
        try {
            try (InputStream inputStream = entity.serialize()) {
                BlobPath blobPath = getBlobPathForUpload(entity);
                entity.setFullBlobName(blobPath);
                transferService.uploadBlob(
                    inputStream,
                    getBlobPathForUpload(entity),
                    entity.getBlobFileName(),
                    WritePriority.URGENT,
                    listener
                );
            }
        } catch (Exception e) {
            listener.onFailure(e);
        }
    }

    @Override
    public T read(final U entity) throws IOException {
        // TODO Add timing logs and tracing
        assert entity.getFullBlobName() != null;
        try (InputStream inputStream = transferService.downloadBlob(getBlobPathForDownload(entity), entity.getBlobFileName())) {
            return entity.deserialize(inputStream);
        }
    }

    @Override
    public void readAsync(final U entity, final ActionListener listener) {
        executorService.execute(() -> {
            try {
                listener.onResponse(read(entity));
            } catch (Exception e) {
                listener.onFailure(e);
            }
        });
    }

    private BlobPath getBlobPathForUpload(final AbstractRemoteWritableBlobEntity obj) {
        BlobPath blobPath = blobStoreRepository.basePath()
            .add(RemoteClusterStateUtils.encodeString(clusterName))
            .add("cluster-state")
            .add(obj.clusterUUID());
        for (String token : obj.getBlobPathParameters().getPathTokens()) {
            blobPath = blobPath.add(token);
        }
        return blobPath;
    }

    private BlobPath getBlobPathForDownload(final AbstractRemoteWritableBlobEntity obj) {
        String[] pathTokens = obj.getBlobPathTokens();
        BlobPath blobPath = new BlobPath();
        if (pathTokens == null || pathTokens.length < 1) {
            return blobPath;
        }
        // Iterate till second last path token to get the blob folder
        for (int i = 0; i < pathTokens.length - 1; i++) {
            blobPath = blobPath.add(pathTokens[i]);
        }
        return blobPath;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy