This is an automated email from the ASF dual-hosted git repository.

wyk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new cc6e7fd214 [ASTERIXDB-3275][CLUS] Download metadata partition upon 
booting
cc6e7fd214 is described below

commit cc6e7fd214ed21aea4115f04825b3db46275771f
Author: Wail Alkowaileet <[email protected]>
AuthorDate: Mon Oct 2 17:08:36 2023 -0700

    [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]>
---
 .../src/test/resources/cc-cloud-storage.conf       |  2 +-
 .../asterix/cloud/AbstractCloudIOManager.java      |  4 ++--
 .../apache/asterix/cloud/EagerCloudIOManager.java  |  2 +-
 .../apache/asterix/cloud/LazyCloudIOManager.java   | 23 +++++++++++++++++++++-
 4 files changed, 26 insertions(+), 5 deletions(-)

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 56c9edf814..719d5754f4 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 724318875b..317928060f 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 @@ public abstract class AbstractCloudIOManager extends 
IOManager implements IParti
             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 @@ public abstract class AbstractCloudIOManager extends 
IOManager implements IParti
         }
     }
 
-    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 c095d87f83..b1f88cb083 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 @@ final class EagerCloudIOManager extends 
AbstractCloudIOManager {
      */
 
     @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 6e00817de2..1a99a345a9 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 @@ final class LazyCloudIOManager extends AbstractCloudIOManager 
{
      */
 
     @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 @@ final class LazyCloudIOManager extends 
AbstractCloudIOManager {
         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 @@ final class LazyCloudIOManager extends 
AbstractCloudIOManager {
         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 {

Reply via email to