Murtadha Hubail has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/2182
Change subject: [ASTERIXDB-2177][STO] Use Fixed Storage Root Dir Name
......................................................................
[ASTERIXDB-2177][STO] Use Fixed Storage Root Dir Name
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Eliminate the need to read the storage root dir name
from cluster properties and use a fixed name (storage).
- Eliminate the need to maintain root_metadata file.
Change-Id: I4e9772e9da10cff33f11353610788ba541a35571
---
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
M
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
M
asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
M
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
M
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
M
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
M
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
M
asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
M
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
M
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
M
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
M
asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
M
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
M
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
15 files changed, 76 insertions(+), 247 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/82/2182/1
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
index e77d535..a3def26 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
@@ -197,7 +197,7 @@
LOGGER.log(Level.WARNING,
"Deleting the storage dir. initialRun = " + initialRun
+ ", systemState = " + systemState);
}
- localResourceRepository.deleteStorageData(true);
+ localResourceRepository.deleteStorageData();
}
datasetMemoryManager = new DatasetMemoryManager(storageProperties);
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
index 47e5ac9..47ac87a 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
@@ -41,6 +41,7 @@
import org.apache.asterix.common.transactions.IRecoveryManager;
import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
import org.apache.asterix.common.utils.PrintUtil;
+import org.apache.asterix.common.utils.StorageConstants;
import org.apache.asterix.common.utils.StoragePathUtil;
import org.apache.asterix.event.schema.cluster.Cluster;
import org.apache.asterix.event.schema.cluster.Node;
@@ -129,9 +130,6 @@
LOGGER.info("Stores: " +
PrintUtil.toString(metadataProperties.getStores()));
LOGGER.info("Root Metadata Store: " +
metadataProperties.getStores().get(nodeId)[0]);
}
- PersistentLocalResourceRepository localResourceRepository =
- (PersistentLocalResourceRepository)
runtimeContext.getLocalResourceRepository();
-
localResourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
}
webManager = new WebManager();
@@ -256,7 +254,7 @@
for (Node node : nodes) {
String ncId = asterixInstanceName + "_" + node.getId();
if (ncId.equalsIgnoreCase(nodeId)) {
- String storeDir =
ClusterProperties.INSTANCE.getStorageDirectoryName();
+ String storeDir = StorageConstants.STORAGE_ROOT_DIR_NAME;
String nodeIoDevices = node.getIodevices() == null ?
cluster.getIodevices() : node.getIodevices();
String[] ioDevicePaths = nodeIoDevices.trim().split(",");
for (int i = 0; i < ioDevicePaths.length; i++) {
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
index 78bed6a..9d73407 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
@@ -34,6 +34,7 @@
import org.apache.asterix.app.external.ExternalUDFLibrarian;
import org.apache.asterix.common.config.ClusterProperties;
import org.apache.asterix.common.library.ILibraryManager;
+import org.apache.asterix.common.utils.StorageConstants;
import org.apache.asterix.test.common.TestExecutor;
import org.apache.asterix.testframework.context.TestCaseContext;
import org.apache.commons.lang.SystemUtils;
@@ -152,7 +153,7 @@
File[] dataDirs = ioDevice.getMount().listFiles();
for (File dataDir : dataDirs) {
String dirName = dataDir.getName();
- if
(!dirName.equals(ClusterProperties.DEFAULT_STORAGE_DIR_NAME)) {
+ if (!dirName.equals(StorageConstants.STORAGE_ROOT_DIR_NAME)) {
// Skips non-storage directories.
continue;
}
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
index 5b53041..47a561a 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
@@ -59,8 +59,8 @@
public void storageStructureMigration() throws Exception {
Function<IndexPathElements, String> legacyIndexPathProvider =
(pathElements) ->
(pathElements.getRebalanceCount().equals("0") ? "" :
pathElements.getRebalanceCount() + File.separator)
- + pathElements.getDatasetName() +
StoragePathUtil.DATASET_INDEX_NAME_SEPARATOR + pathElements
- .getIndexName();
+ + pathElements.getDatasetName() +
StorageConstants.LEGACY_DATASET_INDEX_NAME_SEPARATOR
+ + pathElements.getIndexName();
StoragePathUtil.setIndexPathProvider(legacyIndexPathProvider);
integrationUtil.init(true);
// create dataset and insert data using legacy structure
diff --git
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
index 0abb92f..cc3291d 100644
---
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
+++
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
@@ -38,7 +38,6 @@
public static final ClusterProperties INSTANCE = new ClusterProperties();
public static final String CLUSTER_CONFIGURATION_FILE = "cluster.xml";
- public static final String DEFAULT_STORAGE_DIR_NAME = "storage";
private String nodeNamePrefix = StringUtils.EMPTY;
private Cluster cluster;
@@ -59,14 +58,6 @@
public Cluster getCluster() {
return cluster;
- }
-
- public String getStorageDirectoryName() {
- if (cluster != null) {
- return cluster.getStore();
- }
- // virtual cluster without cluster config file
- return DEFAULT_STORAGE_DIR_NAME;
}
public Node getNodeById(String nodeId) {
diff --git
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
index 0d65067..bd057fa 100644
---
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
+++
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
@@ -22,7 +22,7 @@
import java.nio.file.Path;
import java.nio.file.Paths;
-import org.apache.asterix.common.utils.StoragePathUtil;
+import org.apache.asterix.common.utils.StorageConstants;
public class ResourceReference {
@@ -96,7 +96,7 @@
int offset = tokens.length;
ref.name = tokens[--offset];
// split combined dataset/index name
- final String[] indexTokens =
tokens[--offset].split(StoragePathUtil.DATASET_INDEX_NAME_SEPARATOR);
+ final String[] indexTokens =
tokens[--offset].split(StorageConstants.LEGACY_DATASET_INDEX_NAME_SEPARATOR);
if (indexTokens.length != 2) {
throw new IllegalStateException("Unrecognized legacy path
structure: " + path);
}
diff --git
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
index 48769d4..6262f71 100644
---
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
+++
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
@@ -25,8 +25,10 @@
*/
public class StorageConstants {
- public static final String METADATA_ROOT = "root_metadata";
+ public static final String STORAGE_ROOT_DIR_NAME = "storage";
+ public static final String PARTITION_DIR_PREFIX = "partition_";
public static final String METADATA_FILE_NAME = ".metadata";
+ public static final String LEGACY_DATASET_INDEX_NAME_SEPARATOR = "_idx_";
/**
* The storage version of AsterixDB related artifacts (e.g. log files,
checkpoint files, etc..).
diff --git
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
index 5110d74..6487dac 100644
---
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
+++
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
@@ -37,9 +37,8 @@
import org.apache.log4j.Logger;
public class StoragePathUtil {
+
private static final Logger LOGGER =
Logger.getLogger(StoragePathUtil.class.getName());
- public static final String PARTITION_DIR_PREFIX = "partition_";
- public static final String DATASET_INDEX_NAME_SEPARATOR = "_idx_";
private static Function<IndexPathElements, String> indexPathProvider;
private StoragePathUtil() {
@@ -60,8 +59,9 @@
return new MappedFileSplit(partition.getActiveNodeId(), relativePath,
partition.getIODeviceNum());
}
- public static String prepareStoragePartitionPath(String storageDirName,
int partitonId) {
- return storageDirName + File.separator +
StoragePathUtil.PARTITION_DIR_PREFIX + partitonId;
+ public static String prepareStoragePartitionPath(int partitonId) {
+ return Paths.get(StorageConstants.STORAGE_ROOT_DIR_NAME,
StorageConstants.PARTITION_DIR_PREFIX + partitonId)
+ .toString();
}
public static String prepareDataverseIndexName(String dataverseName,
String datasetName, String idxName,
@@ -81,11 +81,11 @@
}
public static int getPartitionNumFromName(String name) {
- return Integer.parseInt(name.substring(PARTITION_DIR_PREFIX.length()));
+ return
Integer.parseInt(name.substring(StorageConstants.PARTITION_DIR_PREFIX.length()));
}
public static int getPartitionNumFromRelativePath(String relativePath) {
- int startIdx = relativePath.indexOf(PARTITION_DIR_PREFIX) +
PARTITION_DIR_PREFIX.length();
+ int startIdx =
relativePath.indexOf(StorageConstants.PARTITION_DIR_PREFIX) +
StorageConstants.PARTITION_DIR_PREFIX.length();
String partition = relativePath.substring(startIdx,
relativePath.indexOf(File.separatorChar, startIdx));
return Integer.parseInt(partition);
}
diff --git
a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
index 71cef80..c0f8f5f 100644
---
a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
+++
b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
@@ -27,7 +27,6 @@
import java.util.Map;
import java.util.Set;
-import org.apache.asterix.common.utils.StorageConstants;
import org.apache.asterix.event.driver.EventDriver;
import org.apache.asterix.event.error.VerificationUtil;
import org.apache.asterix.event.model.AsterixInstance;
@@ -142,10 +141,9 @@
for (Node node : cluster.getNode()) {
Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
iodevices = node.getIodevices() == null ?
instance.getCluster().getIodevices() : node.getIodevices();
- pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + store + " "
- + StorageConstants.METADATA_ROOT + " " +
AsterixEventServiceUtil.TXN_LOG_DIR + " "
- + backupId + " " + hdfsBackupDir + " " + "hdfs" + " " +
node.getId() + " " + hdfsUrl + " "
- + hadoopVersion;
+ pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + store + " " + " "
+ + AsterixEventServiceUtil.TXN_LOG_DIR + " " + backupId + "
" + hdfsBackupDir + " " + "hdfs" + " "
+ + node.getId() + " " + hdfsUrl + " " + hadoopVersion;
Event event = new Event("backup", nodeid, pargs);
patternList.add(new Pattern(null, 1, null, event));
}
@@ -167,9 +165,8 @@
Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
iodevices = node.getIodevices() == null ?
instance.getCluster().getIodevices() : node.getIodevices();
txnLogDir = node.getTxnLogDir() == null ?
instance.getCluster().getTxnLogDir() : node.getTxnLogDir();
- pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + store + " "
- + StorageConstants.METADATA_ROOT + " " + txnLogDir + " " +
backupId + " " + backupDir
- + " " + "local" + " " + node.getId();
+ pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + store + " " + " " + txnLogDir + " "
+ + backupId + " " + backupDir + " " + "local" + " " +
node.getId();
Event event = new Event("backup", nodeid, pargs);
patternList.add(new Pattern(null, 1, null, event));
}
@@ -190,10 +187,9 @@
for (Node node : cluster.getNode()) {
Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
String iodevices = node.getIodevices() == null ?
cluster.getIodevices() : node.getIodevices();
- pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + clusterStore + " "
- + StorageConstants.METADATA_ROOT + " " +
AsterixEventServiceUtil.TXN_LOG_DIR + " "
- + backupId + " " + " " + hdfsBackupDir + " " + "hdfs" + "
" + node.getId() + " " + hdfsUrl + " "
- + hadoopVersion;
+ pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + clusterStore + " " + " "
+ + AsterixEventServiceUtil.TXN_LOG_DIR + " " + backupId + "
" + " " + hdfsBackupDir + " " + "hdfs"
+ + " " + node.getId() + " " + hdfsUrl + " " + hadoopVersion;
Event event = new Event("restore", nodeid, pargs);
patternList.add(new Pattern(null, 1, null, event));
}
@@ -211,9 +207,9 @@
for (Node node : cluster.getNode()) {
Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
String iodevices = node.getIodevices() == null ?
cluster.getIodevices() : node.getIodevices();
- pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + clusterStore + " "
- + StorageConstants.METADATA_ROOT + " " +
AsterixEventServiceUtil.TXN_LOG_DIR + " "
- + backupId + " " + backupDir + " " + "local" + " " +
node.getId();
+ pargs = workingDir + " " + instance.getName() + " " + iodevices +
" " + clusterStore + " " + " "
+ + AsterixEventServiceUtil.TXN_LOG_DIR + " " + backupId + "
" + backupDir + " " + "local" + " "
+ + node.getId();
Event event = new Event("restore", nodeid, pargs);
patternList.add(new Pattern(null, 1, null, event));
}
@@ -285,7 +281,6 @@
}
}
patternList.addAll(createRemoveAsterixLogDirPattern(instance).getPattern());
-
patternList.addAll(createRemoveAsterixRootMetadata(instance).getPattern());
patternList.addAll(createRemoveAsterixTxnLogs(instance).getPattern());
return new Patterns(patternList);
}
@@ -435,24 +430,6 @@
patternList.add(p);
}
- return new Patterns(patternList);
- }
-
- private Patterns createRemoveAsterixRootMetadata(AsterixInstance instance)
throws Exception {
- List<Pattern> patternList = new ArrayList<>();
- Cluster cluster = instance.getCluster();
- Nodeid nodeid;
- String pargs;
- Event event;
- for (Node node : cluster.getNode()) {
- String iodevices = node.getIodevices() == null ?
cluster.getIodevices() : node.getIodevices();
- String primaryIODevice = iodevices.split(",")[0].trim();
- pargs = primaryIODevice + File.separator +
StorageConstants.METADATA_ROOT;
- nodeid = new Nodeid(new Value(null, node.getId()));
- event = new Event("file_delete", nodeid, pargs);
- patternList.add(new Pattern(null, 1, null, event));
- }
-
return new Patterns(patternList);
}
diff --git
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
index dad0d51..dc8a8aa 100644
---
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
+++
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
@@ -25,7 +25,6 @@
import java.util.Map;
import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
import org.apache.asterix.common.dataflow.ICcApplicationContext;
import org.apache.asterix.common.exceptions.AsterixException;
import org.apache.asterix.common.utils.StoragePathUtil;
@@ -78,9 +77,7 @@
public static FileSplit splitsForAdapter(String dataverseName, String
feedName, String nodeName,
ClusterPartition partition) {
File relPathFile = new File(prepareDataverseFeedName(dataverseName,
feedName));
- String storageDirName =
ClusterProperties.INSTANCE.getStorageDirectoryName();
- String storagePartitionPath =
- StoragePathUtil.prepareStoragePartitionPath(storageDirName,
partition.getPartitionId());
+ String storagePartitionPath =
StoragePathUtil.prepareStoragePartitionPath(partition.getPartitionId());
// Note: feed adapter instances in a single node share the feed logger
// format: 'storage dir name'/partition_#/dataverse/feed/node
File f = new File(storagePartitionPath + File.separator + relPathFile
+ File.separator + nodeName);
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
index 4c98904..0303392 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
@@ -28,13 +28,12 @@
import org.apache.asterix.common.api.INcApplicationContext;
import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
import org.apache.asterix.common.config.DatasetConfig.DatasetType;
import org.apache.asterix.common.config.GlobalConfig;
import org.apache.asterix.common.config.MetadataProperties;
import org.apache.asterix.common.context.AsterixVirtualBufferCacheProvider;
-import org.apache.asterix.common.context.DatasetLSMComponentIdGeneratorFactory;
import org.apache.asterix.common.context.CorrelatedPrefixMergePolicyFactory;
+import org.apache.asterix.common.context.DatasetLSMComponentIdGeneratorFactory;
import org.apache.asterix.common.context.IStorageComponentProvider;
import org.apache.asterix.common.exceptions.ACIDException;
import org.apache.asterix.common.exceptions.MetadataException;
@@ -313,8 +312,7 @@
}
ClusterPartition metadataPartition =
appContext.getMetadataProperties().getMetadataPartition();
int metadataDeviceId = metadataPartition.getIODeviceNum();
- String metadataPartitionPath =
StoragePathUtil.prepareStoragePartitionPath(
- ClusterProperties.INSTANCE.getStorageDirectoryName(),
metadataPartition.getPartitionId());
+ String metadataPartitionPath =
StoragePathUtil.prepareStoragePartitionPath(metadataPartition.getPartitionId());
String resourceName = metadataPartitionPath + File.separator +
index.getFileNameRelativePath();
FileReference file = ioManager.getFileReference(metadataDeviceId,
resourceName);
index.setFile(file);
diff --git
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
index e5f5c19..78aa944 100644
---
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
+++
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
@@ -46,11 +46,10 @@
List<FileSplit> splits = new ArrayList<>();
// get all partitions
ClusterPartition[] clusterPartition =
clusterStateManager.getClusterPartitons();
- String storageDirName =
ClusterProperties.INSTANCE.getStorageDirectoryName();
for (int j = 0; j < clusterPartition.length; j++) {
File f = new File(
-
StoragePathUtil.prepareStoragePartitionPath(storageDirName,
clusterPartition[j].getPartitionId())
- + File.separator + relPathFile);
+
StoragePathUtil.prepareStoragePartitionPath(clusterPartition[j].getPartitionId())
+ File.separator
+ + relPathFile);
splits.add(StoragePathUtil.getFileSplitForClusterPartition(clusterPartition[j],
f.getPath()));
}
return splits.toArray(new FileSplit[] {});
@@ -70,7 +69,6 @@
String indexName, List<String> nodes) {
File relPathFile = new
File(StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(),
dataset.getDatasetName(), indexName,
dataset.getRebalanceCount()));
- String storageDirName =
ClusterProperties.INSTANCE.getStorageDirectoryName();
List<FileSplit> splits = new ArrayList<>();
for (String nd : nodes) {
int numPartitions = clusterStateManager.getNodePartitionsCount(nd);
@@ -81,9 +79,9 @@
}
for (int k = 0; k < numPartitions; k++) {
- // format: 'storage dir
name'/partition_#/dataverse/dataset_idx_index
- File f = new
File(StoragePathUtil.prepareStoragePartitionPath(storageDirName,
- nodePartitions[k].getPartitionId()) + File.separator +
relPathFile);
+ File f = new File(
+
StoragePathUtil.prepareStoragePartitionPath(nodePartitions[k].getPartitionId())
+ File.separator
+ + relPathFile);
splits.add(StoragePathUtil.getFileSplitForClusterPartition(nodePartitions[k],
f.getPath()));
}
}
@@ -94,11 +92,5 @@
IClusterStateManager clusterStateManager, String dataverse) {
FileSplit[] splits = getDataverseSplits(clusterStateManager,
dataverse);
return StoragePathUtil.splitProviderAndPartitionConstraints(splits);
- }
-
- public static String getIndexPath(String partitionPath, int partition,
String dataverse, String fullIndexName) {
- String storageDirName =
ClusterProperties.INSTANCE.getStorageDirectoryName();
- return partitionPath +
StoragePathUtil.prepareStoragePartitionPath(storageDirName, partition) +
File.separator
- + StoragePathUtil.prepareDataverseIndexName(dataverse,
fullIndexName);
}
}
diff --git
a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
index df17987..f3eea32 100644
---
a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
+++
b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
@@ -39,6 +39,7 @@
import org.apache.asterix.common.replication.IReplicationManager;
import org.apache.asterix.common.transactions.ILogManager;
import org.apache.asterix.common.transactions.IRecoveryManager;
+import org.apache.asterix.common.utils.StorageConstants;
import org.apache.asterix.replication.storage.ReplicaResourcesManager;
import
org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -191,8 +192,7 @@
datasetLifeCycleManager.closeAllDatasets();
//3. remove any existing storage data and initialize storage
metadata
- resourceRepository.deleteStorageData(true);
-
resourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
+ resourceRepository.deleteStorageData();
//4. select remote replicas to recover from per lost replica
data
failbackRecoveryReplicas = constructRemoteRecoveryPlan();
@@ -295,8 +295,7 @@
datasetLifeCycleManager.closeAllDatasets();
//2. remove any existing storage data and initialize storage
metadata
- resourceRepository.deleteStorageData(true);
-
resourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
+ resourceRepository.deleteStorageData();
/*** Start Recovery Per Lost Replica ***/
for (Entry<String, Set<Integer>> remoteReplica :
recoveryPlan.entrySet()) {
diff --git
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
index 04cbef9..ccb8bc2 100644
---
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
+++
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
@@ -26,9 +26,9 @@
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -36,11 +36,8 @@
import java.util.Map;
import java.util.Optional;
import java.util.Set;
-import java.util.SortedMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -48,7 +45,6 @@
import org.apache.asterix.common.config.MetadataProperties;
import org.apache.asterix.common.dataflow.DatasetLocalResource;
import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.common.replication.IReplicationManager;
import org.apache.asterix.common.replication.ReplicationJob;
import org.apache.asterix.common.storage.DatasetResourceReference;
@@ -75,18 +71,12 @@
public static final Predicate<Path> INDEX_COMPONENTS = path ->
!path.endsWith(StorageConstants.METADATA_FILE_NAME);
// Private constants
- private static final Logger LOGGER =
Logger.getLogger(PersistentLocalResourceRepository.class.getName());
- private static final String STORAGE_METADATA_DIRECTORY =
StorageConstants.METADATA_ROOT;
- private static final String STORAGE_METADATA_FILE_NAME_PREFIX = "." +
StorageConstants.METADATA_ROOT;
private static final int MAX_CACHED_RESOURCES = 1000;
- public static final int RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT = 6;
+ private static final int RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT = 6;
// Finals
private final IIOManager ioManager;
- private final String[] mountPoints;
- private final String nodeId;
private final Cache<String, LocalResource> resourceCache;
- private final SortedMap<Integer, ClusterPartition> clusterPartitions;
private final Set<Integer> nodeOriginalPartitions;
private final Set<Integer> nodeActivePartitions;
// Mutables
@@ -94,27 +84,19 @@
private Set<String> filesToBeReplicated;
private IReplicationManager replicationManager;
private Set<Integer> nodeInactivePartitions;
+ private final Path[] storageRoots;
- public PersistentLocalResourceRepository(IIOManager ioManager,
List<IODeviceHandle> devices, String nodeId,
- MetadataProperties metadataProperties) throws HyracksDataException
{
+ public PersistentLocalResourceRepository(IIOManager ioManager, String
nodeId,
+ MetadataProperties metadataProperties) {
this.ioManager = ioManager;
- mountPoints = new String[devices.size()];
- this.nodeId = nodeId;
- this.clusterPartitions = metadataProperties.getClusterPartitions();
- for (int i = 0; i < mountPoints.length; i++) {
- String mountPoint = devices.get(i).getMount().getPath();
- File mountPointDir = new File(mountPoint);
- if (!mountPointDir.exists()) {
- throw new HyracksDataException(mountPointDir.getAbsolutePath()
+ " doesn't exist.");
- }
- if (!mountPoint.endsWith(File.separator)) {
- mountPoints[i] = mountPoint + File.separator;
- } else {
- mountPoints[i] = mountPoint;
- }
+ storageRoots = new Path[ioManager.getIODevices().size()];
+ final List<IODeviceHandle> ioDevices = ioManager.getIODevices();
+ for (int i = 0; i < ioDevices.size(); i++) {
+ storageRoots[i] =
+ Paths.get(ioDevices.get(i).getMount().getAbsolutePath(),
StorageConstants.STORAGE_ROOT_DIR_NAME);
}
+ createStorageRoots();
resourceCache =
CacheBuilder.newBuilder().maximumSize(MAX_CACHED_RESOURCES).build();
-
ClusterPartition[] nodePartitions =
metadataProperties.getNodePartitions().get(nodeId);
//initially the node active partitions are the same as the original
partitions
nodeOriginalPartitions = new HashSet<>(nodePartitions.length);
@@ -134,47 +116,6 @@
resourceCache.asMap().forEach(
(key, value) ->
aString.append(key).append("->").append(value).append(Character.LINE_SEPARATOR));
return aString.toString();
- }
-
- public void initializeNewUniverse(String storageRoot) throws
HyracksDataException {
- if (LOGGER.isLoggable(Level.INFO)) {
- LOGGER.info("Initializing local resource repository ... ");
- }
- /*
- * create storage metadata file
- * (This file is used to locate the root storage directory after
instance restarts).
- * TODO with the existing cluster configuration file being static and
distributed on all NCs
- * we can find out the storage root directory without looking at this
file.
- * This file could potentially store more information, otherwise no
need to keep it.
- */
- String storageRootDirName = storageRoot;
- while (storageRootDirName.startsWith(File.separator)) {
- storageRootDirName =
storageRootDirName.substring(File.separator.length());
- }
- for (int i = 0; i < mountPoints.length; i++) {
- FileReference storageMetadataFile =
getStorageMetadataFile(ioManager, nodeId, i);
- File storageMetadataDir =
storageMetadataFile.getFile().getParentFile();
- if (storageMetadataDir.exists()) {
- throw
HyracksDataException.create(ErrorCode.ROOT_LOCAL_RESOURCE_EXISTS,
getClass().getSimpleName(),
- storageMetadataDir.getAbsolutePath());
- }
- //make dirs for the storage metadata file
- boolean success = storageMetadataDir.mkdirs();
- if (!success) {
- throw HyracksDataException
-
.create(ErrorCode.ROOT_LOCAL_RESOURCE_COULD_NOT_BE_CREATED,
getClass().getSimpleName(),
- storageMetadataDir.getAbsolutePath());
- }
- LOGGER.log(Level.INFO,
- "created the root-metadata-file's directory: " +
storageMetadataDir.getAbsolutePath());
- try (FileOutputStream fos = new
FileOutputStream(storageMetadataFile.getFile())) {
- fos.write(storageRootDirName.getBytes(StandardCharsets.UTF_8));
- } catch (IOException e) {
- throw HyracksDataException.create(e);
- }
- LOGGER.log(Level.INFO, "created the root-metadata-file: " +
storageMetadataFile.getAbsolutePath());
- }
- LOGGER.log(Level.INFO, "Completed the initialization of the local
resource repository");
}
@Override
@@ -208,7 +149,7 @@
oosToFos.writeObject(resource);
oosToFos.flush();
} catch (IOException e) {
- throw new HyracksDataException(e);
+ throw HyracksDataException.create(e);
}
resourceCache.put(resource.getPath(), resource);
@@ -231,8 +172,7 @@
} finally {
// Regardless of successfully deleted or not, the operation
should be replicated.
//if replication enabled, delete resource from remote replicas
- if (isReplicationEnabled && !resourceFile.getFile().getName()
- .startsWith(STORAGE_METADATA_FILE_NAME_PREFIX)) {
+ if (isReplicationEnabled) {
createReplicationJob(ReplicationOperation.DELETE,
resourceFile);
}
}
@@ -247,16 +187,11 @@
String fileName = resourcePath + File.separator +
StorageConstants.METADATA_FILE_NAME;
return ioManager.resolve(fileName);
}
+
public Map<Long, LocalResource> getResources(Predicate<LocalResource>
filter) throws HyracksDataException {
Map<Long, LocalResource> resourcesMap = new HashMap<>();
- for (int i = 0; i < mountPoints.length; i++) {
- File storageRootDir = getStorageRootDirectoryIfExists(ioManager,
nodeId, i);
- if (storageRootDir == null) {
- LOGGER.log(Level.INFO, "Getting storage root dir returned
null. Returning");
- continue;
- }
- LOGGER.log(Level.INFO, "Getting storage root dir returned " +
storageRootDir.getAbsolutePath());
- try (Stream<Path> stream = Files.find(storageRootDir.toPath(),
RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT,
+ for (Path root : storageRoots) {
+ try (Stream<Path> stream = Files.find(root,
RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT,
(path, attr) ->
path.getFileName().toString().equals(StorageConstants.METADATA_FILE_NAME))) {
final List<File> resourceMetadataFiles =
stream.map(Path::toFile).collect(Collectors.toList());
for (File file : resourceMetadataFiles) {
@@ -270,7 +205,6 @@
}
}
return resourcesMap;
-
}
public Map<Long, LocalResource> loadAndGetAllResources() throws
HyracksDataException {
@@ -300,7 +234,7 @@
throw new AsterixException("Storage version mismatch.");
}
} catch (Exception e) {
- throw new HyracksDataException(e);
+ throw HyracksDataException.create(e);
}
}
@@ -323,93 +257,23 @@
try {
replicationManager.submitJob(job);
} catch (IOException e) {
- throw new HyracksDataException(e);
+ throw HyracksDataException.create(e);
}
- }
-
- public String[] getStorageMountingPoints() {
- return mountPoints;
}
/**
* Deletes physical files of all data verses.
*
- * @param deleteStorageMetadata
* @throws IOException
*/
- public void deleteStorageData(boolean deleteStorageMetadata) throws
IOException {
- for (int i = 0; i < mountPoints.length; i++) {
- File storageDir = getStorageRootDirectoryIfExists(ioManager,
nodeId, i);
- if (storageDir != null && storageDir.isDirectory()) {
- FileUtils.deleteDirectory(storageDir);
- }
- if (deleteStorageMetadata) {
- //delete the metadata root directory
- FileReference storageMetadataFile =
getStorageMetadataFile(ioManager, nodeId, i);
- File storageMetadataDir =
storageMetadataFile.getFile().getParentFile().getParentFile();
- if (storageMetadataDir.exists() &&
storageMetadataDir.isDirectory()) {
- FileUtils.deleteDirectory(storageMetadataDir);
- }
+ public void deleteStorageData() throws IOException {
+ for (Path root : storageRoots) {
+ final File rootFile = root.toFile();
+ if (rootFile.exists()) {
+ FileUtils.deleteDirectory(rootFile);
}
}
- }
-
- /**
- * @param mountPoint
- * @param nodeId
- * @param ioDeviceId
- * @return A file reference to the storage metadata file.
- */
- private static FileReference getStorageMetadataFile(IIOManager ioManager,
String nodeId, int ioDeviceId) {
- String storageMetadataFileName =
- STORAGE_METADATA_DIRECTORY + File.separator + nodeId + "_" +
"iodevice" + ioDeviceId + File.separator
- + STORAGE_METADATA_FILE_NAME_PREFIX;
- return new FileReference(ioManager.getIODevices().get(ioDeviceId),
storageMetadataFileName);
- }
-
- /**
- * @param mountPoint
- * @param nodeId
- * @param ioDeviceId
- * @return A file reference to the storage root directory if exists,
otherwise null.
- * @throws HyracksDataException
- */
- public static File getStorageRootDirectoryIfExists(IIOManager ioManager,
String nodeId, int ioDeviceId)
- throws HyracksDataException {
- try {
- FileReference storageMetadataFile =
getStorageMetadataFile(ioManager, nodeId, ioDeviceId);
- LOGGER.log(Level.INFO, "Storage metadata file is " +
storageMetadataFile.getAbsolutePath());
- if (storageMetadataFile.getFile().exists()) {
- String storageRootDirPath =
- new
String(Files.readAllBytes(storageMetadataFile.getFile().toPath()),
StandardCharsets.UTF_8);
- LOGGER.log(Level.INFO, "Storage metadata file found and root
dir is " + storageRootDirPath);
- FileReference storageRootFileRef =
- new
FileReference(ioManager.getIODevices().get(ioDeviceId), storageRootDirPath);
- if (storageRootFileRef.getFile().exists()) {
- return storageRootFileRef.getFile();
- } else {
- LOGGER.log(Level.INFO, "Storage root doesn't exist");
- }
- } else {
- LOGGER.log(Level.INFO, "Storage metadata file doesn't exist");
- }
- return null;
- } catch (IOException ioe) {
- throw HyracksDataException.create(ioe);
- }
- }
-
- /**
- * @param partition
- * @return The partition local path on this NC.
- */
- public String getPartitionPath(int partition) {
- //currently each partition is replicated on the same IO device number
on all NCs.
- return mountPoints[getIODeviceNum(partition)];
- }
-
- public int getIODeviceNum(int partition) {
- return clusterPartitions.get(partition).getIODeviceNum();
+ createStorageRoots();
}
public Set<Integer> getActivePartitions() {
@@ -439,7 +303,7 @@
/**
* Gets a set of files for the indexes in partition {@code partition}.
Each file points
- * the to where the index's files are stored.
+ * to where the index's files are stored.
*
* @param partition
* @return The set of indexes files
@@ -469,4 +333,14 @@
final ResourceReference ref =
ResourceReference.of(indexFile.toString());
return ioManager.resolve(ref.getRelativePath().toString());
}
+
+ private void createStorageRoots() {
+ try {
+ for (Path root : storageRoots) {
+ Files.createDirectories(root);
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to create storage root
directory");
+ }
+ }
}
diff --git
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
index 93a7d83..43024b6 100644
---
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
+++
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
@@ -38,6 +38,6 @@
@Override
public ILocalResourceRepository createRepository() throws
HyracksDataException {
- return new PersistentLocalResourceRepository(ioManager,
ioManager.getIODevices(), nodeId, metadataProperties);
+ return new PersistentLocalResourceRepository(ioManager, nodeId,
metadataProperties);
}
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/2182
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I4e9772e9da10cff33f11353610788ba541a35571
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Murtadha Hubail <[email protected]>