>From Wail Alkowaileet <[email protected]>:
Wail Alkowaileet has uploaded this change for review. (
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
---
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, 44 insertions(+), 5 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/31/17831/1
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: 1
Gerrit-Owner: Wail Alkowaileet <[email protected]>
Gerrit-MessageType: newchange