Repository: asterixdb Updated Branches: refs/heads/master 0e21afa73 -> d71214ae5
[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 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2182 Sonar-Qube: Jenkins <[email protected]> Reviewed-by: Michael Blow <[email protected]> Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/d71214ae Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/d71214ae Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/d71214ae Branch: refs/heads/master Commit: d71214ae5197df2b3e39742731b78f8109c05f61 Parents: 0e21afa Author: Murtadha Hubail <[email protected]> Authored: Thu Nov 30 05:37:29 2017 +0300 Committer: Murtadha Hubail <[email protected]> Committed: Thu Nov 30 05:01:24 2017 -0800 ---------------------------------------------------------------------- .../asterix/app/nc/NCAppRuntimeContext.java | 2 +- .../hyracks/bootstrap/NCApplication.java | 23 +-- .../asterix/test/runtime/LangExecutionUtil.java | 3 +- .../MigrateStorageResourcesTaskTest.java | 4 +- .../common/config/ClusterProperties.java | 9 - .../common/storage/ResourceReference.java | 4 +- .../asterix/common/utils/StorageConstants.java | 4 +- .../asterix/common/utils/StoragePathUtil.java | 16 +- .../asterix/event/util/PatternCreator.java | 45 ++--- .../apache/asterix/external/util/FeedUtils.java | 5 +- .../metadata/bootstrap/MetadataBootstrap.java | 6 +- .../utils/SplitsAndConstraintsUtil.java | 24 +-- .../recovery/RemoteRecoveryManager.java | 7 +- .../PersistentLocalResourceRepository.java | 196 ++++--------------- ...ersistentLocalResourceRepositoryFactory.java | 2 +- 15 files changed, 83 insertions(+), 267 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java ---------------------------------------------------------------------- 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 @@ public class NCAppRuntimeContext implements INcApplicationContext { LOGGER.log(Level.WARNING, "Deleting the storage dir. initialRun = " + initialRun + ", systemState = " + systemState); } - localResourceRepository.deleteStorageData(true); + localResourceRepository.deleteStorageData(); } datasetMemoryManager = new DatasetMemoryManager(storageProperties); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java ---------------------------------------------------------------------- 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..8b417a9 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,12 +41,12 @@ import org.apache.asterix.common.transactions.Checkpoint; 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; import org.apache.asterix.messaging.MessagingChannelInterfaceFactory; import org.apache.asterix.messaging.NCMessageBroker; -import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository; import org.apache.asterix.utils.CompatibilityUtil; import org.apache.hyracks.api.application.INCServiceContext; import org.apache.hyracks.api.application.IServiceContext; @@ -120,22 +120,13 @@ public class NCApplication extends BaseNCApplication { if (latestCheckpoint != null) { CompatibilityUtil.ensureCompatibility(controllerService, latestCheckpoint.getStorageVersion()); } - IRecoveryManager recoveryMgr = runtimeContext.getTransactionSubsystem().getRecoveryManager(); - final SystemState stateOnStartup = recoveryMgr.getSystemState(); - if (stateOnStartup == SystemState.PERMANENT_DATA_LOSS) { - if (LOGGER.isLoggable(Level.INFO)) { - LOGGER.info("System state: " + SystemState.PERMANENT_DATA_LOSS); - LOGGER.info("Node ID: " + nodeId); - 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()); + if (LOGGER.isLoggable(Level.INFO)) { + IRecoveryManager recoveryMgr = runtimeContext.getTransactionSubsystem().getRecoveryManager(); + LOGGER.info("System state: " + recoveryMgr.getSystemState()); + LOGGER.info("Node ID: " + nodeId); + LOGGER.info("Stores: " + PrintUtil.toString(metadataProperties.getStores())); } - webManager = new WebManager(); - performLocalCleanUp(); } @@ -256,7 +247,7 @@ public class NCApplication extends BaseNCApplication { 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++) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java ---------------------------------------------------------------------- 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 java.util.List; 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 @@ public class LangExecutionUtil { 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; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java ---------------------------------------------------------------------- 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 class MigrateStorageResourcesTaskTest { 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 http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java ---------------------------------------------------------------------- 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 class ClusterProperties { 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; @@ -61,14 +60,6 @@ public class ClusterProperties { 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) { Optional<Node> matchingNode = cluster.getNode().stream().filter(node -> node.getId().equals(nodeId)).findAny(); return matchingNode.isPresent() ? matchingNode.get() : null; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java ---------------------------------------------------------------------- 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.io.File; 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 @@ public class ResourceReference { 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); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java ---------------------------------------------------------------------- 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 @@ import org.apache.hyracks.storage.am.common.api.ITreeIndexFrame; */ 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..). http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java ---------------------------------------------------------------------- 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..b93ccb5 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.Level; 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 @@ public class StoragePathUtil { 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, @@ -80,12 +80,10 @@ public class StoragePathUtil { return datasetName + File.separator + rebalanceCount + File.separator + idxName; } - public static int getPartitionNumFromName(String name) { - return Integer.parseInt(name.substring(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); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java ---------------------------------------------------------------------- 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.List; 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 @@ public class PatternCreator { 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 @@ public class PatternCreator { 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 @@ public class PatternCreator { 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 @@ public class PatternCreator { 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 @@ public class PatternCreator { } } patternList.addAll(createRemoveAsterixLogDirPattern(instance).getPattern()); - patternList.addAll(createRemoveAsterixRootMetadata(instance).getPattern()); patternList.addAll(createRemoveAsterixTxnLogs(instance).getPattern()); return new Patterns(patternList); } @@ -438,24 +433,6 @@ public class PatternCreator { 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); - } - private Patterns createRemoveAsterixLogDirPattern(AsterixInstance instance) throws Exception { List<Pattern> patternList = new ArrayList<>(); Cluster cluster = instance.getCluster(); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java ---------------------------------------------------------------------- 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.List; 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 class FeedUtils { 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); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java ---------------------------------------------------------------------- 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 java.util.logging.Logger; 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 @@ public class MetadataBootstrap { } 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); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java ---------------------------------------------------------------------- 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..7ac6183 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 @@ -24,7 +24,6 @@ import java.util.List; import org.apache.asterix.common.cluster.ClusterPartition; import org.apache.asterix.common.cluster.IClusterStateManager; -import org.apache.asterix.common.config.ClusterProperties; import org.apache.asterix.common.utils.StoragePathUtil; import org.apache.asterix.metadata.MetadataManager; import org.apache.asterix.metadata.MetadataTransactionContext; @@ -42,15 +41,12 @@ public class SplitsAndConstraintsUtil { } private static FileSplit[] getDataverseSplits(IClusterStateManager clusterStateManager, String dataverseName) { - File relPathFile = new File(dataverseName); 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); + File f = new File(StoragePathUtil.prepareStoragePartitionPath(clusterPartition[j].getPartitionId()), + dataverseName); splits.add(StoragePathUtil.getFileSplitForClusterPartition(clusterPartition[j], f.getPath())); } return splits.toArray(new FileSplit[] {}); @@ -68,9 +64,8 @@ public class SplitsAndConstraintsUtil { public static FileSplit[] getIndexSplits(IClusterStateManager clusterStateManager, Dataset dataset, String indexName, List<String> nodes) { - File relPathFile = new File(StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(), - dataset.getDatasetName(), indexName, dataset.getRebalanceCount())); - String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName(); + final String relPath = StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(), + dataset.getDatasetName(), indexName, dataset.getRebalanceCount()); List<FileSplit> splits = new ArrayList<>(); for (String nd : nodes) { int numPartitions = clusterStateManager.getNodePartitionsCount(nd); @@ -81,9 +76,8 @@ public class SplitsAndConstraintsUtil { } 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()), + relPath); splits.add(StoragePathUtil.getFileSplitForClusterPartition(nodePartitions[k], f.getPath())); } } @@ -95,10 +89,4 @@ public class SplitsAndConstraintsUtil { 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); - } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java ---------------------------------------------------------------------- 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.IRemoteRecoveryManager; 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 @@ public class RemoteRecoveryManager implements IRemoteRecoveryManager { 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 @@ public class RemoteRecoveryManager implements IRemoteRecoveryManager { 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()) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java ---------------------------------------------------------------------- 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..e87a39b 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.FileOutputStream; 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.List; 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.cluster.ClusterPartition; 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 class PersistentLocalResourceRepository implements ILocalResourceReposito 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 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito 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); @@ -136,47 +118,6 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito 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 public LocalResource get(String relativePath) throws HyracksDataException { LocalResource resource = resourceCache.getIfPresent(relativePath); @@ -208,7 +149,7 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito 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 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito } 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 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito 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 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito } } return resourcesMap; - } public Map<Long, LocalResource> loadAndGetAllResources() throws HyracksDataException { @@ -300,7 +234,7 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito throw new AsterixException("Storage version mismatch."); } } catch (Exception e) { - throw new HyracksDataException(e); + throw HyracksDataException.create(e); } } @@ -323,93 +257,23 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito 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 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito /** * 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 @@ public class PersistentLocalResourceRepository implements ILocalResourceReposito final ResourceReference ref = ResourceReference.of(indexFile.toString()); return ioManager.resolve(ref.getRelativePath().toString()); } + + private void createStorageRoots() { + for (Path root : storageRoots) { + try { + Files.createDirectories(root); + } catch (IOException e) { + throw new IllegalStateException("Failed to create storage root directory at " + root, e); + } + } + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d71214ae/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java ---------------------------------------------------------------------- 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 @@ public class PersistentLocalResourceRepositoryFactory implements ILocalResourceR @Override public ILocalResourceRepository createRepository() throws HyracksDataException { - return new PersistentLocalResourceRepository(ioManager, ioManager.getIODevices(), nodeId, metadataProperties); + return new PersistentLocalResourceRepository(ioManager, nodeId, metadataProperties); } }
