>From Ritik Raj <[email protected]>: Ritik Raj has submitted this change. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20513?usp=email )
Change subject: [NO ISSUE][CLOUD] Use Azure async parallel downloader APIs ...................................................................... [NO ISSUE][CLOUD] Use Azure async parallel downloader APIs - user model changes: no - storage format changes: no - interface changes: no Details: Introduced async apis for parallel downloading the files Ext-ref:MB-69079 Change-Id: Iaab692c8d70019175738fdb39699796cf9ef72b8 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20513 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- M asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageClientConfig.java M asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageCloudClient.java M asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzureParallelDownloader.java M asterixdb/asterix-cloud/src/test/java/org/apache/asterix/cloud/azure/LSMAzBlobStorageTest.java M asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CloudProperties.java M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IFileDeviceResolver.java M hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java M hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/DefaultDeviceResolver.java M hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java 9 files changed, 146 insertions(+), 82 deletions(-) Approvals: Ali Alsuliman: Looks good to me, approved Anon. E. Moose #1000171: Jenkins: Verified; Verified diff --git a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageClientConfig.java b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageClientConfig.java index 9abfbcc..548ad04 100644 --- a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageClientConfig.java +++ b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageClientConfig.java @@ -46,18 +46,23 @@ private final int writeMaxRequestsPerSeconds; private final int readMaxRequestsPerSeconds; private final boolean storageDisableSSLVerify; + private final int requestsMaxHttpConnections; + private final int requestsMaxPendingHttpConnections; + private final int requestsHttpConnectionAcquireTimeout; private final AccessTier accessTier; public AzBlobStorageClientConfig(String region, String endpoint, String prefix, boolean anonymousAuth, long profilerLogInterval, String bucket, int writeBufferSize) { this(region, endpoint, prefix, anonymousAuth, profilerLogInterval, bucket, 1, 0, 0, writeBufferSize, false, - null); + null, CloudProperties.MAX_HTTP_CONNECTIONS, CloudProperties.MAX_PENDING_HTTP_CONNECTIONS, + CloudProperties.HTTP_CONNECTION_ACQUIRE_TIMEOUT); } public AzBlobStorageClientConfig(String region, String endpoint, String prefix, boolean anonymousAuth, long profilerLogInterval, String bucket, long tokenAcquireTimeout, int writeMaxRequestsPerSeconds, - int readMaxRequestsPerSeconds, int writeBufferSize, boolean storageDisableSSLVerify, - AccessTier accessTier) { + int readMaxRequestsPerSeconds, int writeBufferSize, boolean storageDisableSSLVerify, AccessTier accessTier, + int requestsMaxHttpConnections, int requestsMaxPendingHttpConnections, + int requestsHttpConnectionAcquireTimeout) { this.region = Objects.requireNonNull(region, "region"); this.endpoint = endpoint; this.prefix = Objects.requireNonNull(prefix, "prefix"); @@ -69,6 +74,10 @@ this.readMaxRequestsPerSeconds = readMaxRequestsPerSeconds; this.writeBufferSize = writeBufferSize; this.storageDisableSSLVerify = storageDisableSSLVerify; + this.requestsMaxHttpConnections = requestsMaxHttpConnections; + this.requestsMaxPendingHttpConnections = + getRequestsMaxPendingHttpConnections(requestsMaxPendingHttpConnections); + this.requestsHttpConnectionAcquireTimeout = requestsHttpConnectionAcquireTimeout; this.accessTier = accessTier; } @@ -78,7 +87,9 @@ cloudProperties.getProfilerLogInterval(), cloudProperties.getStorageBucket(), cloudProperties.getTokenAcquireTimeout(), cloudProperties.getWriteMaxRequestsPerSecond(), cloudProperties.getReadMaxRequestsPerSecond(), cloudProperties.getWriteBufferSize(), - cloudProperties.isStorageDisableSSLVerify(), INTERNAL_STORAGE_ACCESS_TIER); + cloudProperties.isStorageDisableSSLVerify(), INTERNAL_STORAGE_ACCESS_TIER, + cloudProperties.getRequestsMaxHttpConnections(), cloudProperties.getRequestsMaxPendingHttpConnections(), + cloudProperties.getRequestsHttpConnectionAcquireTimeout()); } public static AzBlobStorageClientConfig of(Map<String, String> configuration, int writeBufferSize) { @@ -148,4 +159,23 @@ public AccessTier getAccessTier() { return accessTier; } + + public int getRequestsMaxHttpConnections() { + return requestsMaxHttpConnections; + } + + public int getRequestsMaxPendingHttpConnections() { + return requestsMaxPendingHttpConnections; + } + + public int getRequestsHttpConnectionAcquireTimeout() { + return requestsHttpConnectionAcquireTimeout; + } + + private static int getRequestsMaxPendingHttpConnections(int requestsMaxPendingHttpConnections) { + if (requestsMaxPendingHttpConnections <= 0) { + throw new IllegalArgumentException("requestsMaxPendingHttpConnections must be greater than 0"); + } + return requestsMaxPendingHttpConnections; + } } diff --git a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageCloudClient.java b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageCloudClient.java index 43e5fd2..293907f 100644 --- a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageCloudClient.java +++ b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzBlobStorageCloudClient.java @@ -19,8 +19,6 @@ package org.apache.asterix.cloud.clients.azure.blobstorage; -import static org.apache.asterix.cloud.clients.azure.blobstorage.AzBlobStorageClientConfig.MAX_CONCURRENT_REQUESTS; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FilenameFilter; @@ -299,7 +297,8 @@ } try { - Flux.fromIterable(deleteMonos).flatMap(mono -> mono, MAX_CONCURRENT_REQUESTS).then().block(); + Flux.fromIterable(deleteMonos).flatMap(mono -> mono, config.getRequestsMaxPendingHttpConnections()).then() + .block(); } catch (Exception ex) { throw new RuntimeDataException(ErrorCode.CLOUD_IO_FAILURE, "DELETE", ex, paths.toString()); } @@ -354,7 +353,7 @@ @Override public IParallelDownloader createParallelDownloader(String bucket, IOManager ioManager) { - return new AzureParallelDownloader(ioManager, blobContainerClient, profiler, config); + return new AzureParallelDownloader(ioManager, blobContainerAsyncClient, profiler, config); } @Override diff --git a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzureParallelDownloader.java b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzureParallelDownloader.java index 4980587..25bc217 100644 --- a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzureParallelDownloader.java +++ b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/azure/blobstorage/AzureParallelDownloader.java @@ -19,129 +19,150 @@ package org.apache.asterix.cloud.clients.azure.blobstorage; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.apache.asterix.cloud.clients.IParallelDownloader; import org.apache.asterix.cloud.clients.profiler.IRequestProfilerLimiter; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.io.FileReference; +import org.apache.hyracks.api.util.ExceptionUtils; import org.apache.hyracks.control.nc.io.IOManager; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import com.azure.core.http.rest.PagedIterable; -import com.azure.storage.blob.BlobClient; -import com.azure.storage.blob.BlobContainerClient; +import com.azure.storage.blob.BlobAsyncClient; +import com.azure.storage.blob.BlobContainerAsyncClient; import com.azure.storage.blob.models.BlobItem; import com.azure.storage.blob.models.ListBlobsOptions; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + public class AzureParallelDownloader implements IParallelDownloader { public static final String STORAGE_SUB_DIR = "storage"; private final IOManager ioManager; - private final BlobContainerClient blobContainerClient; + private final BlobContainerAsyncClient blobContainerAsyncClient; private final IRequestProfilerLimiter profiler; private final AzBlobStorageClientConfig config; - private static final Logger LOGGER = LogManager.getLogger(); - public AzureParallelDownloader(IOManager ioManager, BlobContainerClient blobContainerClient, + public AzureParallelDownloader(IOManager ioManager, BlobContainerAsyncClient blobContainerAsyncClient, IRequestProfilerLimiter profiler, AzBlobStorageClientConfig config) { this.ioManager = ioManager; - this.blobContainerClient = blobContainerClient; + this.blobContainerAsyncClient = blobContainerAsyncClient; this.profiler = profiler; this.config = config; } @Override public void downloadFiles(Collection<FileReference> toDownload) throws HyracksDataException { - for (FileReference fileReference : toDownload) { - BlobClient blobClient = - blobContainerClient.getBlobClient(config.getPrefix() + fileReference.getRelativePath()); - Path absPath = Path.of(fileReference.getAbsolutePath()); - Path parentPath = absPath.getParent(); - OutputStream fileOutputStream = null; - try { - createDirectories(parentPath); - fileOutputStream = Files.newOutputStream(absPath); - blobClient.downloadStream(fileOutputStream); - fileOutputStream.close(); - } catch (IOException e) { - throw HyracksDataException.create(e); - } finally { - closeOutputStream(fileOutputStream); - } + try { + downloadFilesAndWait(toDownload); + } catch (IOException e) { + throw HyracksDataException.create(e); } } - private static void closeOutputStream(OutputStream fileOutputStream) throws HyracksDataException { - if (fileOutputStream != null) { - try { - fileOutputStream.close(); - } catch (IOException e) { - throw HyracksDataException.create(e); + private void downloadFilesAndWait(Collection<FileReference> toDownload) throws IOException { + List<Mono<Void>> downloads = new ArrayList<>(); + int maxConcurrent = config.getRequestsMaxPendingHttpConnections(); + + for (FileReference fileReference : toDownload) { + profiler.objectGet(); + + Path absPath = Path.of(fileReference.getAbsolutePath()); + Path parentPath = absPath.getParent(); + createDirectories(parentPath); + + BlobAsyncClient blobAsyncClient = + blobContainerAsyncClient.getBlobAsyncClient(config.getPrefix() + fileReference.getRelativePath()); + + Mono<Void> downloadTask = blobAsyncClient.downloadToFile(absPath.toString()).then(); + downloads.add(downloadTask); + + if (maxConcurrent > 0 && downloads.size() >= maxConcurrent) { + waitForFileDownloads(downloads); + downloads.clear(); } } + + if (!downloads.isEmpty()) { + waitForFileDownloads(downloads); + } + } + + private void waitForFileDownloads(List<Mono<Void>> downloads) throws HyracksDataException { + runBlockingWithExceptionHandling( + () -> Flux.fromIterable(downloads).flatMap(mono -> mono, downloads.size()).then().block()); } @Override public Collection<FileReference> downloadDirectories(Collection<FileReference> directories) throws HyracksDataException { + Set<FileReference> failedFiles = new HashSet<>(); + List<Mono<Void>> directoryDownloads = new ArrayList<>(); + for (FileReference directory : directories) { - PagedIterable<BlobItem> blobsInDir = getBlobItems(directory); - for (BlobItem blobItem : blobsInDir) { - profiler.objectGet(); - download(blobItem, failedFiles); - } + Mono<Void> directoryTask = downloadDirectoryAsync(directory, failedFiles).onErrorResume(e -> Mono.empty()); // Continue even if a directory fails + directoryDownloads.add(directoryTask); } + + runBlockingWithExceptionHandling(() -> Flux.fromIterable(directoryDownloads) + .flatMap(mono -> mono, config.getRequestsMaxPendingHttpConnections()).then().block()); + return failedFiles; } - private void download(BlobItem blobItem, Set<FileReference> failedFiles) throws HyracksDataException { - BlobClient blobClient = blobContainerClient.getBlobClient(blobItem.getName()); - FileReference diskDestFile = ioManager.resolve(createDiskSubPath(blobItem.getName())); - Path absDiskBlobPath = getDiskDestPath(diskDestFile); - Path parentDiskPath = absDiskBlobPath.getParent(); - createDirectories(parentDiskPath); - FileOutputStream outputStreamToDest = getOutputStreamToDest(diskDestFile); + private Mono<Void> downloadDirectoryAsync(FileReference directory, Set<FileReference> failedFiles) { + return getBlobItems(directory).flatMap(blobItem -> { + profiler.objectGet(); + return downloadBlobAsync(blobItem, failedFiles); + }, config.getRequestsMaxPendingHttpConnections()).then().doOnError(error -> failedFiles.add(directory)); // Record directory failure + } + + private Mono<Void> downloadBlobAsync(BlobItem blobItem, Set<FileReference> failedFiles) { try { - blobClient.downloadStream(outputStreamToDest); + // Resolve destination path + FileReference diskDestFile = ioManager.resolve(createDiskSubPath(blobItem.getName())); + Path absDiskBlobPath = getDiskDestPath(diskDestFile); + Path parentDiskPath = absDiskBlobPath.getParent(); + + createDirectories(parentDiskPath); + + BlobAsyncClient blobAsyncClient = blobContainerAsyncClient.getBlobAsyncClient(blobItem.getName()); + + return blobAsyncClient.downloadToFile(absDiskBlobPath.toString()).doOnError(error -> { + FileReference failedFile = ioManager.resolve(blobItem.getName()); + failedFiles.add(failedFile); + }).then(); } catch (Exception e) { - FileReference failedFile = ioManager.resolve(blobItem.getName()); - failedFiles.add(failedFile); + failedFiles.add(ioManager.resolve(blobItem.getName())); + return Mono.error(HyracksDataException.create(e)); } } private String createDiskSubPath(String blobName) { - if (!blobName.startsWith(STORAGE_SUB_DIR)) { - blobName = blobName.substring(blobName.indexOf(STORAGE_SUB_DIR)); + int idx = blobName.indexOf(STORAGE_SUB_DIR); + if (idx >= 0) { + return blobName.substring(idx); } return blobName; } - private FileOutputStream getOutputStreamToDest(FileReference destFile) throws HyracksDataException { - try { - return new FileOutputStream(destFile.getAbsolutePath()); - } catch (FileNotFoundException ex) { - throw HyracksDataException.create(ex); - } - } - private void createDirectories(Path parentPath) throws HyracksDataException { - if (Files.notExists(parentPath)) + if (Files.notExists(parentPath)) { try { Files.createDirectories(parentPath); } catch (IOException ex) { throw HyracksDataException.create(ex); } + } } private Path getDiskDestPath(FileReference destFile) throws HyracksDataException { @@ -152,10 +173,10 @@ } } - private PagedIterable<BlobItem> getBlobItems(FileReference directoryToDownload) { + private Flux<BlobItem> getBlobItems(FileReference directoryToDownload) { ListBlobsOptions listBlobsOptions = new ListBlobsOptions().setPrefix(config.getPrefix() + directoryToDownload.getRelativePath()); - return blobContainerClient.listBlobs(listBlobsOptions, null); + return blobContainerAsyncClient.listBlobs(listBlobsOptions); } @Override @@ -165,4 +186,15 @@ // Ref: https://github.com/Azure/azure-sdk-for-java/issues/17903 // Hence this implementation is a no op. } -} + + private static void runBlockingWithExceptionHandling(Runnable runnable) throws HyracksDataException { + try { + runnable.run(); + } catch (Exception e) { + if (ExceptionUtils.causedByInterrupt(e)) { + Thread.currentThread().interrupt(); + } + throw HyracksDataException.create(e); + } + } +} \ No newline at end of file diff --git a/asterixdb/asterix-cloud/src/test/java/org/apache/asterix/cloud/azure/LSMAzBlobStorageTest.java b/asterixdb/asterix-cloud/src/test/java/org/apache/asterix/cloud/azure/LSMAzBlobStorageTest.java index d9424a8..fcd6e17 100644 --- a/asterixdb/asterix-cloud/src/test/java/org/apache/asterix/cloud/azure/LSMAzBlobStorageTest.java +++ b/asterixdb/asterix-cloud/src/test/java/org/apache/asterix/cloud/azure/LSMAzBlobStorageTest.java @@ -35,6 +35,7 @@ import org.apache.asterix.cloud.clients.ICloudGuardian; import org.apache.asterix.cloud.clients.azure.blobstorage.AzBlobStorageClientConfig; import org.apache.asterix.cloud.clients.azure.blobstorage.AzBlobStorageCloudClient; +import org.apache.asterix.common.config.CloudProperties; import org.apache.hyracks.util.StorageUtil; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; @@ -117,7 +118,8 @@ URI blobStore = URI.create(blobServiceClient.getAccountUrl()); String endpoint = blobStore.getScheme() + "://" + blobStore.getAuthority() + "/devstoreaccount1"; AzBlobStorageClientConfig config = new AzBlobStorageClientConfig(MOCK_SERVER_REGION, endpoint, "", false, 0, - PLAYGROUND_CONTAINER, 1, 0, 0, writeBufferSize, true, null); + PLAYGROUND_CONTAINER, 1, 0, 0, writeBufferSize, true, null, CloudProperties.MAX_HTTP_CONNECTIONS, + CloudProperties.MAX_PENDING_HTTP_CONNECTIONS, CloudProperties.HTTP_CONNECTION_ACQUIRE_TIMEOUT); CLOUD_CLIENT = new AzBlobStorageCloudClient(config, ICloudGuardian.NoOpCloudGuardian.INSTANCE); } diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CloudProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CloudProperties.java index 392282f..4b6c928 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CloudProperties.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CloudProperties.java @@ -39,6 +39,10 @@ public class CloudProperties extends AbstractProperties { + public static final int MAX_HTTP_CONNECTIONS = 1000; + public static final int MAX_PENDING_HTTP_CONNECTIONS = 10000; + public static final int HTTP_CONNECTION_ACQUIRE_TIMEOUT = 120; + public CloudProperties(PropertiesAccessor accessor) { super(accessor); } @@ -67,9 +71,9 @@ getRangedIntegerType(5, Integer.MAX_VALUE), StorageUtil.getIntSizeInBytes(8, StorageUtil.StorageUnit.MEGABYTE)), CLOUD_EVICTION_PLAN_REEVALUATE_THRESHOLD(POSITIVE_INTEGER, 50), - CLOUD_REQUESTS_MAX_HTTP_CONNECTIONS(POSITIVE_INTEGER, 1000), - CLOUD_REQUESTS_MAX_PENDING_HTTP_CONNECTIONS(POSITIVE_INTEGER, 10000), - CLOUD_REQUESTS_HTTP_CONNECTION_ACQUIRE_TIMEOUT(POSITIVE_INTEGER, 120), + CLOUD_REQUESTS_MAX_HTTP_CONNECTIONS(POSITIVE_INTEGER, MAX_HTTP_CONNECTIONS), + CLOUD_REQUESTS_MAX_PENDING_HTTP_CONNECTIONS(POSITIVE_INTEGER, MAX_PENDING_HTTP_CONNECTIONS), + CLOUD_REQUESTS_HTTP_CONNECTION_ACQUIRE_TIMEOUT(POSITIVE_INTEGER, HTTP_CONNECTION_ACQUIRE_TIMEOUT), CLOUD_STORAGE_FORCE_PATH_STYLE(BOOLEAN, false), CLOUD_STORAGE_DISABLE_SSL_VERIFY(BOOLEAN, false), CLOUD_STORAGE_LIST_EVENTUALLY_CONSISTENT(BOOLEAN, false), diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IFileDeviceResolver.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IFileDeviceResolver.java index 2598caf..4db5400 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IFileDeviceResolver.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IFileDeviceResolver.java @@ -20,8 +20,6 @@ import java.util.List; -import org.apache.hyracks.api.exceptions.HyracksDataException; - /** * Resolves the device destination for a file from its relative path */ @@ -35,6 +33,6 @@ * a relative file path. * @return the resident IO device of the file. */ - IODeviceHandle resolve(String relativePath, List<IODeviceHandle> devices) throws HyracksDataException; + IODeviceHandle resolve(String relativePath, List<IODeviceHandle> devices); } diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java index 75cd23d..93232d2 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IIOManager.java @@ -181,7 +181,7 @@ * @param path relative path * @return A file reference based on the mounting point of {@code ioDeviceId} and the passed {@code Path} */ - FileReference resolve(String path) throws HyracksDataException; + FileReference resolve(String path); /** * Gets a file reference from an absolute path diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/DefaultDeviceResolver.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/DefaultDeviceResolver.java index 61a1cd8..420ff2d 100644 --- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/DefaultDeviceResolver.java +++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/DefaultDeviceResolver.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.io.IFileDeviceResolver; import org.apache.hyracks.api.io.IODeviceHandle; @@ -30,7 +29,7 @@ private AtomicInteger next = new AtomicInteger(0); @Override - public IODeviceHandle resolve(String relPath, List<IODeviceHandle> devices) throws HyracksDataException { + public IODeviceHandle resolve(String relPath, List<IODeviceHandle> devices) { int numDevices = devices.size(); String path = relPath; // if number of devices is 1, we return the device diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java index 37e1477..17a5f03 100644 --- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java +++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java @@ -433,7 +433,7 @@ } @Override - public FileReference resolve(String path) throws HyracksDataException { + public FileReference resolve(String path) { return new FileReference(deviceComputer.resolve(path, getIODevices()), path); } -- To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20513?usp=email To unsubscribe, or for help writing mail filters, visit https://asterix-gerrit.ics.uci.edu/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: asterixdb Gerrit-Branch: phoenix Gerrit-Change-Id: Iaab692c8d70019175738fdb39699796cf9ef72b8 Gerrit-Change-Number: 20513 Gerrit-PatchSet: 7 Gerrit-Owner: Ritik Raj <[email protected]> Gerrit-Reviewer: Ali Alsuliman <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Murtadha Hubail <[email protected]> Gerrit-Reviewer: Ritik Raj <[email protected]>
