>From Wail Alkowaileet <[email protected]>: Wail Alkowaileet has submitted this change. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17831 )
Change subject: [ASTERIXDB-3275][CLUS] Download metadata partition upon booting ...................................................................... [ASTERIXDB-3275][CLUS] Download metadata partition upon booting - user model changes: no - storage format changes: no - interface changes: no Details: When booting in a cloud deployment and when using a lazy policy, we should download the entire metadata partition instead of downloading its indexes one by one to improve the booting/resuming time. Change-Id: I27b007269fd61bb777dc023baefc1f7ee7f71a54 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17831 Integration-Tests: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> Tested-by: Jenkins <[email protected]> --- M asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/LazyCloudIOManager.java M asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/EagerCloudIOManager.java M asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf M asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/AbstractCloudIOManager.java 4 files changed, 48 insertions(+), 5 deletions(-) Approvals: Murtadha Hubail: Looks good to me, approved Jenkins: Verified; Verified Objections: Anon. E. Moose #1000171: Violations found diff --git a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf index 56c9edf..719d575 100644 --- a/asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf +++ b/asterixdb/asterix-app/src/test/resources/cc-cloud-storage.conf @@ -18,7 +18,7 @@ [nc/asterix_nc1] txn.log.dir=target/tmp/asterix_nc1/txnlog core.dump.dir=target/tmp/asterix_nc1/coredump -iodevices=target/tmp/asterix_nc1/iodevice1, +iodevices=target/tmp/asterix_nc1/iodevice1 iodevices=../asterix-server/target/tmp/asterix_nc1/iodevice2 nc.api.port=19004 #jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006 diff --git a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/AbstractCloudIOManager.java b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/AbstractCloudIOManager.java index 7243188..3179280 100644 --- a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/AbstractCloudIOManager.java +++ b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/AbstractCloudIOManager.java @@ -114,7 +114,7 @@ cleanupLocalFiles(); } // Has different implementations depending on the caching policy - downloadPartitions(); + downloadPartitions(metadataNode, metadataPartition); } private void deleteUnkeptPartitionDirs(List<FileReference> currentOnDiskPartitions) throws HyracksDataException { @@ -146,7 +146,7 @@ } } - protected abstract void downloadPartitions() throws HyracksDataException; + protected abstract void downloadPartitions(boolean metadataNode, int metadataPartition) throws HyracksDataException; /* * ****************************************************************** diff --git a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/EagerCloudIOManager.java b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/EagerCloudIOManager.java index c095d87..b1f88cb 100644 --- a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/EagerCloudIOManager.java +++ b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/EagerCloudIOManager.java @@ -55,7 +55,7 @@ */ @Override - protected void downloadPartitions() throws HyracksDataException { + protected void downloadPartitions(boolean metadataNode, int metadataPartition) throws HyracksDataException { IParallelDownloader downloader = cloudClient.createParallelDownloader(bucket, localIoManager); LOGGER.info("Downloading all files located in {}", partitionPaths); downloader.downloadDirectories(partitionPaths); diff --git a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/LazyCloudIOManager.java b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/LazyCloudIOManager.java index 6e00817..1a99a34 100644 --- a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/LazyCloudIOManager.java +++ b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/LazyCloudIOManager.java @@ -18,10 +18,13 @@ */ package org.apache.asterix.cloud; +import static org.apache.asterix.common.utils.StorageConstants.PARTITION_DIR_PREFIX; import static org.apache.asterix.common.utils.StorageConstants.STORAGE_ROOT_DIR_NAME; +import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -76,7 +79,7 @@ */ @Override - protected void downloadPartitions() throws HyracksDataException { + protected void downloadPartitions(boolean metadataNode, int metadataPartition) throws HyracksDataException { // Get the files in all relevant partitions from the cloud Set<String> cloudFiles = cloudClient.listObjects(bucket, STORAGE_ROOT_DIR_NAME, IoUtil.NO_OP_FILTER).stream() .filter(f -> partitions.contains(StoragePathUtil.getPartitionNumFromRelativePath(f))) @@ -96,8 +99,13 @@ cloudFiles.removeAll(localFiles); int remainingUncachedFiles = cloudFiles.size(); if (remainingUncachedFiles > 0) { + // Get list of FileReferences from the list of cloud (i.e., resolve each path's string to FileReference) List<FileReference> uncachedFiles = resolve(cloudFiles); + // Create a parallel downloader using the given cloudClient IParallelDownloader downloader = cloudClient.createParallelDownloader(bucket, localIoManager); + // Download metadata partition (if this node is a metadata node) + downloadMetadataPartition(downloader, uncachedFiles, metadataNode, metadataPartition); + // Create a parallel cacher which download and monitor all uncached files ParallelCacher cacher = new ParallelCacher(downloader, uncachedFiles); // Local cache misses some files, cloud-based accessor is needed for read operations accessor = new ReplaceableCloudAccessor(cloudClient, bucket, localIoManager, partitions, replacer, cacher); @@ -109,6 +117,19 @@ LOGGER.info("The number of uncached files: {}. Uncached files: {}", remainingUncachedFiles, cloudFiles); } + private void downloadMetadataPartition(IParallelDownloader downloader, List<FileReference> uncachedFiles, + boolean metadataNode, int metadataPartition) throws HyracksDataException { + String partitionDir = PARTITION_DIR_PREFIX + metadataPartition; + if (metadataNode && uncachedFiles.stream().anyMatch(f -> f.getRelativePath().contains(partitionDir))) { + LOGGER.info("Downloading metadata partition {}, Current uncached files: {}", metadataPartition, + uncachedFiles); + FileReference metadataDir = resolve(STORAGE_ROOT_DIR_NAME + File.separator + partitionDir); + downloader.downloadDirectories(Collections.singleton(metadataDir)); + uncachedFiles.removeIf(f -> f.getRelativePath().contains(partitionDir)); + LOGGER.info("Finished downloading metadata partition. Current uncached files: {}", uncachedFiles); + } + } + @Override protected void onOpen(CloudFileHandle fileHandle, FileReadWriteMode rwMode, FileSyncMode syncMode) throws HyracksDataException { -- To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17831 To unsubscribe, or for help writing mail filters, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Change-Id: I27b007269fd61bb777dc023baefc1f7ee7f71a54 Gerrit-Change-Number: 17831 Gerrit-PatchSet: 2 Gerrit-Owner: Wail Alkowaileet <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Murtadha Hubail <[email protected]> Gerrit-Reviewer: Wail Alkowaileet <[email protected]> Gerrit-MessageType: merged
