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 {
