[ASTERIXDB-1953][STO] Cleanup LSM File Managers
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- use FileReference instead of String absolute path
- user error codes
Change-Id: I97bab76888790ca282ad9508ce8416f7c7a52fb7
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1849
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
BAD: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ian Maxon <imaxon@apache.org>
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
index 2e6c8a3..7dbade2 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
@@ -117,6 +117,10 @@
public static final int FILE_ALREADY_MAPPED = 81;
public static final int FILE_ALREADY_EXISTS = 82;
public static final int NO_INDEX_FOUND_WITH_RESOURCE_ID = 83;
+ public static final int FOUND_OVERLAPPING_LSM_FILES = 84;
+ public static final int FOUND_MULTIPLE_TRANSACTIONS = 85;
+ public static final int UNRECOGNIZED_INDEX_COMPONENT_FILE = 86;
+ public static final int UNEQUAL_NUM_FILTERS_TREES = 87;
// Compilation error codes.
public static final int RULECOLLECTION_NOT_INSTANCE_OF_LIST = 10000;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/FileReference.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/FileReference.java
index b48ba14..0375e9e 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/FileReference.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/FileReference.java
@@ -86,4 +86,8 @@
public String getAbsolutePath() {
return file.getAbsolutePath();
}
+
+ public FileReference getChild(String name) {
+ return new FileReference(dev, path + File.separator + name);
+ }
}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
index 6389ffa..cd38917 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
@@ -100,5 +100,9 @@
81 = File %1$s is already mapped
82 = Failed to create the file %1$s because it already exists
83 = No index found with resourceID %1$s
+84 = Files with overlapping non-contained timestamp intervals were found in %1$s
+85 = Found more than one transaction file in %1$s
+86 = Found an unrecognized index file %1$s
+87 = Unequal number of trees and filters found in %1$s
10000 = The given rule collection %1$s is not an instance of the List class.
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
index c06edfd..86d926f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
@@ -197,7 +197,7 @@
ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
ioScheduler.scheduleOperation(new LSMBTreeMergeOperation(accessor, mergingComponents, cursor,
relMergeFileRefs.getInsertIndexFileReference(), relMergeFileRefs.getBloomFilterFileReference(),
- callback, fileManager.getBaseDir()));
+ callback, fileManager.getBaseDir().getAbsolutePath()));
}
// This function should only be used when a transaction fail. it doesn't
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
index 4245687..7462c7a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
@@ -366,7 +366,8 @@
ioScheduler.scheduleOperation(new LSMBTreeWithBuddyMergeOperation(accessor, mergingComponents, cursor,
relMergeFileRefs.getInsertIndexFileReference(), relMergeFileRefs.getDeleteIndexFileReference(),
- relMergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir(), keepDeleteTuples));
+ relMergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir().getAbsolutePath(),
+ keepDeleteTuples));
}
// This method creates the appropriate opContext for the targeted version
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
index b437fda..d241dc6 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
@@ -470,7 +470,7 @@
ILSMIOOperationCallback callback) {
ILSMIndexAccessor accessor = createAccessor(opCtx);
return new LSMBTreeFlushOperation(accessor, flushingComponent, componentFileRefs.getInsertIndexFileReference(),
- componentFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir());
+ componentFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir().getAbsolutePath());
}
@Override
@@ -625,6 +625,6 @@
ITreeIndexCursor cursor = new LSMBTreeRangeSearchCursor(opCtx, returnDeletedTuples);
return new LSMBTreeMergeOperation(accessor, mergingComponents, cursor,
mergeFileRefs.getInsertIndexFileReference(), mergeFileRefs.getBloomFilterFileReference(), callback,
- fileManager.getBaseDir());
+ fileManager.getBaseDir().getAbsolutePath());
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
index 432a2b8..54bc1fe 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
@@ -22,17 +22,17 @@
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import org.apache.hyracks.api.exceptions.ErrorCode;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.io.FileReference;
import org.apache.hyracks.api.io.IIOManager;
+import org.apache.hyracks.api.util.IoUtil;
import org.apache.hyracks.storage.am.common.api.ITreeIndex;
import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
@@ -40,6 +40,8 @@
public class LSMBTreeFileManager extends AbstractLSMIndexFileManager {
+ private static final FilenameFilter btreeFilter =
+ (dir, name) -> !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
private final TreeIndexFactory<? extends ITreeIndex> btreeFactory;
private final boolean hasBloomFilter;
@@ -53,10 +55,10 @@
@Override
public LSMComponentFileReferences getRelFlushFileReference() throws HyracksDataException {
String ts = getCurrentTimestamp();
- String baseName = baseDir + ts + DELIMITER + ts;
+ String baseName = ts + DELIMITER + ts;
// Begin timestamp and end timestamp are identical since it is a flush
- return new LSMComponentFileReferences(createFlushFile(baseName + DELIMITER + BTREE_SUFFIX), null,
- hasBloomFilter ? createFlushFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX) : null);
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX), null,
+ hasBloomFilter ? baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX) : null);
}
@Override
@@ -65,30 +67,19 @@
String[] firstTimestampRange = firstFileName.split(DELIMITER);
String[] lastTimestampRange = lastFileName.split(DELIMITER);
- String baseName = baseDir + firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
+ String baseName = firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
// Get the range of timestamps by taking the earliest and the latest timestamps
- return new LSMComponentFileReferences(createMergeFile(baseName + DELIMITER + BTREE_SUFFIX), null,
- hasBloomFilter ? createMergeFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX) : null);
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX), null,
+ hasBloomFilter ? baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX) : null);
}
- private static FilenameFilter btreeFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
- }
- };
-
@Override
public List<LSMComponentFileReferences> cleanupAndGetValidFiles() throws HyracksDataException {
List<LSMComponentFileReferences> validFiles = new ArrayList<>();
ArrayList<ComparableFileName> allBTreeFiles = new ArrayList<>();
ArrayList<ComparableFileName> allBloomFilterFiles = new ArrayList<>();
-
// create transaction filter <to hide transaction files>
FilenameFilter transactionFilter = getTransactionFileFilter(false);
-
- // Gather files
-
// List of valid BTree files.
cleanupAndGetValidFilesInternal(getCompoundFilter(transactionFilter, btreeFilter), btreeFactory, allBTreeFiles);
HashSet<String> btreeFilesSet = new HashSet<>();
@@ -102,8 +93,7 @@
null);
// Sanity check.
if (allBTreeFiles.size() != allBloomFilterFiles.size()) {
- throw new HyracksDataException(
- "Unequal number of valid BTree and bloom filter files found. Aborting cleanup.");
+ throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
}
}
@@ -137,7 +127,7 @@
validComparableBloomFilterFiles.add(lastBloomFilter);
}
- ComparableFileName currentBTree = null;
+ ComparableFileName currentBTree;
ComparableFileName currentBloomFilter = null;
for (int i = 1; i < allBTreeFiles.size(); i++) {
currentBTree = allBTreeFiles.get(i);
@@ -158,16 +148,13 @@
&& (!hasBloomFilter || (currentBloomFilter.interval[0].compareTo(lastBloomFilter.interval[0]) >= 0
&& currentBloomFilter.interval[1].compareTo(lastBloomFilter.interval[1]) <= 0))) {
// Invalid files are completely contained in last interval.
- File invalidBTreeFile = new File(currentBTree.fullPath);
- invalidBTreeFile.delete();
+ IoUtil.delete(new File(currentBTree.fullPath));
if (hasBloomFilter) {
- File invalidBloomFilterFile = new File(currentBloomFilter.fullPath);
- invalidBloomFilterFile.delete();
+ IoUtil.delete(new File(currentBloomFilter.fullPath));
}
} else {
// This scenario should not be possible.
- throw new HyracksDataException(
- "Found LSM files with overlapping but not contained timetamp intervals.");
+ throw HyracksDataException.create(ErrorCode.FOUND_OVERLAPPING_LSM_FILES, baseDir);
}
}
@@ -198,53 +185,40 @@
public LSMComponentFileReferences getNewTransactionFileReference() throws IOException {
String ts = getCurrentTimestamp();
// Create transaction lock file
- Files.createFile(Paths.get(baseDir + TXN_PREFIX + ts));
-
- String baseName = baseDir + ts + DELIMITER + ts;
+ IoUtil.create(baseDir.getChild(TXN_PREFIX + ts));
+ String baseName = ts + DELIMITER + ts;
// Begin timestamp and end timestamp are identical since it is a transaction
- return new LSMComponentFileReferences(createFlushFile(baseName + DELIMITER + BTREE_SUFFIX), null,
- createFlushFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX), null,
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
public LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException {
FilenameFilter transactionFilter;
- File dir = new File(baseDir);
- String[] files = dir.list(txnFileNameFilter);
+ String[] files = baseDir.getFile().list(txnFileNameFilter);
if (files.length == 0) {
return null;
}
if (files.length != 1) {
- throw new HyracksDataException("More than one transaction lock found:" + files.length);
+ throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
} else {
transactionFilter = getTransactionFileFilter(true);
- String txnFileName = dir.getPath() + File.separator + files[0];
+ FileReference txnFile = baseDir.getChild(files[0]);
// get the actual transaction files
- files = dir.list(transactionFilter);
- if (files.length < 2) {
- throw new HyracksDataException("LSM Btree transaction has less than 2 files :" + files.length);
- }
- try {
- Files.delete(Paths.get(txnFileName));
- } catch (IOException e) {
- throw new HyracksDataException("Failed to delete transaction lock :" + txnFileName);
- }
+ files = baseDir.getFile().list(transactionFilter);
+ IoUtil.delete(txnFile);
}
- File bTreeFile = null;
- File bloomFilterFile = null;
-
+ FileReference bTreeFileRef = null;
+ FileReference bloomFilterFileRef = null;
for (String fileName : files) {
if (fileName.endsWith(BTREE_SUFFIX)) {
- bTreeFile = new File(dir.getPath() + File.separator + fileName);
+ bTreeFileRef = baseDir.getChild(fileName);
} else if (fileName.endsWith(BLOOM_FILTER_SUFFIX)) {
- bloomFilterFile = new File(dir.getPath() + File.separator + fileName);
+ bloomFilterFileRef = baseDir.getChild(fileName);
} else {
- throw new HyracksDataException("unrecognized file found = " + fileName);
+ throw HyracksDataException.create(ErrorCode.UNRECOGNIZED_INDEX_COMPONENT_FILE, fileName);
}
}
- FileReference bTreeFileRef = ioManager.resolveAbsolutePath(bTreeFile.getAbsolutePath());
- FileReference bloomFilterFileRef = ioManager.resolveAbsolutePath(bloomFilterFile.getAbsolutePath());
-
return new LSMComponentFileReferences(bTreeFileRef, null, bloomFilterFileRef);
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
index c866a45..f61d783 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
@@ -29,9 +29,11 @@
import java.util.Iterator;
import java.util.List;
+import org.apache.hyracks.api.exceptions.ErrorCode;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.io.FileReference;
import org.apache.hyracks.api.io.IIOManager;
+import org.apache.hyracks.api.util.IoUtil;
import org.apache.hyracks.storage.am.common.api.ITreeIndex;
import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
@@ -42,19 +44,10 @@
private final TreeIndexFactory<? extends ITreeIndex> btreeFactory;
private final TreeIndexFactory<? extends ITreeIndex> buddyBtreeFactory;
- private static FilenameFilter btreeFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
- }
- };
+ private static FilenameFilter btreeFilter = (dir, name) -> !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
- private static FilenameFilter buddyBtreeFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(DELETE_TREE_SUFFIX);
- }
- };
+ private static FilenameFilter buddyBtreeFilter =
+ (dir, name) -> !name.startsWith(".") && name.endsWith(DELETE_TREE_SUFFIX);
public LSMBTreeWithBuddyFileManager(IIOManager ioManager, FileReference file,
TreeIndexFactory<? extends ITreeIndex> btreeFactory,
@@ -67,11 +60,11 @@
@Override
public LSMComponentFileReferences getRelFlushFileReference() throws HyracksDataException {
String ts = getCurrentTimestamp();
- String baseName = baseDir + ts + DELIMITER + ts;
+ String baseName = ts + DELIMITER + ts;
// Begin timestamp and end timestamp are identical since it is a flush
- return new LSMComponentFileReferences(createFlushFile(baseName + DELIMITER + BTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + DELETE_TREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + DELETE_TREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
@@ -80,12 +73,12 @@
String[] firstTimestampRange = firstFileName.split(DELIMITER);
String[] lastTimestampRange = lastFileName.split(DELIMITER);
- String baseName = baseDir + firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
+ String baseName = firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
// Get the range of timestamps by taking the earliest and the latest
// timestamps
- return new LSMComponentFileReferences(createMergeFile(baseName + DELIMITER + BTREE_SUFFIX),
- createMergeFile(baseName + DELIMITER + DELETE_TREE_SUFFIX),
- createMergeFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + DELETE_TREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
@@ -94,10 +87,8 @@
ArrayList<ComparableFileName> allBTreeFiles = new ArrayList<>();
ArrayList<ComparableFileName> allBuddyBTreeFiles = new ArrayList<>();
ArrayList<ComparableFileName> allBloomFilterFiles = new ArrayList<>();
-
// Create transaction file filter
FilenameFilter transactionFilefilter = getTransactionFileFilter(false);
-
// Gather files.
cleanupAndGetValidFilesInternal(getCompoundFilter(btreeFilter, transactionFilefilter), btreeFactory,
allBTreeFiles);
@@ -110,18 +101,14 @@
buddyBtreeFactory);
validateFiles(btreeFilesSet, allBloomFilterFiles, getCompoundFilter(bloomFilterFilter, transactionFilefilter),
null);
-
// Sanity check.
if (allBTreeFiles.size() != allBuddyBTreeFiles.size() || allBTreeFiles.size() != allBloomFilterFiles.size()) {
- throw new HyracksDataException(
- "Unequal number of valid BTree, Buddy BTree, and Bloom Filter files found. Aborting cleanup.");
+ throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
}
-
// Trivial cases.
if (allBTreeFiles.isEmpty() || allBuddyBTreeFiles.isEmpty() || allBloomFilterFiles.isEmpty()) {
return validFiles;
}
-
if (allBTreeFiles.size() == 1 && allBuddyBTreeFiles.size() == 1 && allBloomFilterFiles.size() == 1) {
validFiles.add(new LSMComponentFileReferences(allBTreeFiles.get(0).fileRef,
allBuddyBTreeFiles.get(0).fileRef, allBloomFilterFiles.get(0).fileRef));
@@ -166,16 +153,12 @@
&& currentBloomFilter.interval[0].compareTo(lastBloomFilter.interval[0]) >= 0
&& currentBloomFilter.interval[1].compareTo(lastBloomFilter.interval[1]) <= 0) {
// Invalid files are completely contained in last interval.
- File invalidBTreeFile = new File(currentBTree.fullPath);
- invalidBTreeFile.delete();
- File invalidBuddyBTreeFile = new File(currentBuddyBTree.fullPath);
- invalidBuddyBTreeFile.delete();
- File invalidBloomFilterFile = new File(currentBloomFilter.fullPath);
- invalidBloomFilterFile.delete();
+ IoUtil.delete(new File(currentBTree.fullPath));
+ IoUtil.delete(new File(currentBuddyBTree.fullPath));
+ IoUtil.delete(new File(currentBloomFilter.fullPath));
} else {
// This scenario should not be possible.
- throw new HyracksDataException(
- "Found LSM files with overlapping but not contained timetamp intervals.");
+ throw HyracksDataException.create(ErrorCode.FOUND_OVERLAPPING_LSM_FILES, baseDir);
}
}
@@ -204,55 +187,45 @@
String ts = getCurrentTimestamp();
// Create transaction lock file
Files.createFile(Paths.get(baseDir + TXN_PREFIX + ts));
-
- String baseName = baseDir + ts + DELIMITER + ts;
- return new LSMComponentFileReferences(createFlushFile(baseName + DELIMITER + BTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + DELETE_TREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ String baseName = ts + DELIMITER + ts;
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + DELETE_TREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
public LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException {
FilenameFilter transactionFilter;
- File dir = new File(baseDir);
- String[] files = dir.list(txnFileNameFilter);
+ String[] files = baseDir.getFile().list(txnFileNameFilter);
if (files.length == 0) {
return null;
}
if (files.length != 1) {
- throw new HyracksDataException("More than one transaction lock found:" + files.length);
+ throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
} else {
transactionFilter = getTransactionFileFilter(true);
- String txnFileName = dir.getPath() + File.separator + files[0];
// get the actual transaction files
- files = dir.list(transactionFilter);
+ files = baseDir.getFile().list(transactionFilter);
if (files.length < 3) {
- throw new HyracksDataException(
- "LSM Btree with buddy transaction has less than 3 files :" + files.length);
+ throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
}
- try {
- Files.delete(Paths.get(txnFileName));
- } catch (IOException e) {
- throw new HyracksDataException("Failed to delete transaction lock :" + txnFileName);
- }
+ IoUtil.delete(baseDir.getChild(files[0]));
}
- File bTreeFile = null;
- File buddyBTreeFile = null;
- File bloomFilterFile = null;
+ FileReference bTreeFileRef = null;
+ FileReference buddyBTreeFileRef = null;
+ FileReference bloomFilterFileRef = null;
for (String fileName : files) {
if (fileName.endsWith(BTREE_SUFFIX)) {
- bTreeFile = new File(dir.getPath() + File.separator + fileName);
+ bTreeFileRef = baseDir.getChild(fileName);
} else if (fileName.endsWith(DELETE_TREE_SUFFIX)) {
- buddyBTreeFile = new File(dir.getPath() + File.separator + fileName);
+ buddyBTreeFileRef = baseDir.getChild(fileName);
} else if (fileName.endsWith(BLOOM_FILTER_SUFFIX)) {
- bloomFilterFile = new File(dir.getPath() + File.separator + fileName);
+ bloomFilterFileRef = baseDir.getChild(fileName);
} else {
- throw new HyracksDataException("unrecognized file found = " + fileName);
+ throw HyracksDataException.create(ErrorCode.UNRECOGNIZED_INDEX_COMPONENT_FILE, fileName);
}
}
- FileReference bTreeFileRef = ioManager.resolveAbsolutePath(bTreeFile.getAbsolutePath());
- FileReference buddyBTreeFileRef = ioManager.resolveAbsolutePath(buddyBTreeFile.getAbsolutePath());
- FileReference bloomFilterFileRef = ioManager.resolveAbsolutePath(bloomFilterFile.getAbsolutePath());
+
return new LSMComponentFileReferences(bTreeFileRef, buddyBTreeFileRef, bloomFilterFileRef);
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java
index 18d9a67..5580387 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFileManager.java
@@ -24,6 +24,7 @@
import java.util.List;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileReference;
import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
/**
@@ -43,7 +44,7 @@
LSMComponentFileReferences getRelMergeFileReference(String firstFileName, String lastFileName)
throws HyracksDataException;
- String getBaseDir();
+ FileReference getBaseDir();
// Deletes invalid files, and returns list of valid files from baseDir.
// The returned valid files are correctly sorted (based on the recency of data).
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
index ead9db4..d3c056d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
@@ -22,8 +22,6 @@
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -88,7 +86,7 @@
protected final IIOManager ioManager;
// baseDir should reflect dataset name and partition name and be absolute
- protected final String baseDir;
+ protected final FileReference baseDir;
protected final Format formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
protected final Comparator<ComparableFileName> recencyCmp = new RecencyComparator();
protected final TreeIndexFactory<? extends ITreeIndex> treeFactory;
@@ -97,8 +95,7 @@
public AbstractLSMIndexFileManager(IIOManager ioManager, FileReference file,
TreeIndexFactory<? extends ITreeIndex> treeFactory) {
this.ioManager = ioManager;
- this.baseDir = file.getFile().getAbsolutePath().endsWith(File.separator) ? file.getFile().getAbsolutePath()
- : file.getFile().getAbsolutePath() + File.separator;
+ this.baseDir = file;
this.treeFactory = treeFactory;
}
@@ -136,9 +133,8 @@
TreeIndexFactory<? extends ITreeIndex> treeFactory, ArrayList<ComparableFileName> allFiles)
throws HyracksDataException {
String[] files = listDirFiles(baseDir, filter);
- File dir = new File(baseDir);
for (String fileName : files) {
- FileReference fileRef = ioManager.resolveAbsolutePath(dir.getPath() + File.separator + fileName);
+ FileReference fileRef = baseDir.getChild(fileName);
if (treeFactory == null) {
allFiles.add(new ComparableFileName(fileRef));
continue;
@@ -152,21 +148,20 @@
}
}
- static String[] listDirFiles(String path, FilenameFilter filter) throws HyracksDataException {
- File dir = new File(path);
+ static String[] listDirFiles(FileReference dir, FilenameFilter filter) throws HyracksDataException {
/*
* Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs.
*/
- String[] files = dir.list(filter);
+ String[] files = dir.getFile().list(filter);
if (files == null) {
- if (!dir.canRead()) {
- throw HyracksDataException.create(ErrorCode.CANNOT_READ_FILE, path);
- } else if (!dir.exists()) {
- throw HyracksDataException.create(ErrorCode.FILE_DOES_NOT_EXIST, path);
- } else if (!dir.isDirectory()) {
- throw HyracksDataException.create(ErrorCode.FILE_IS_NOT_DIRECTORY, path);
+ if (!dir.getFile().canRead()) {
+ throw HyracksDataException.create(ErrorCode.CANNOT_READ_FILE, dir);
+ } else if (!dir.getFile().exists()) {
+ throw HyracksDataException.create(ErrorCode.FILE_DOES_NOT_EXIST, dir);
+ } else if (!dir.getFile().isDirectory()) {
+ throw HyracksDataException.create(ErrorCode.FILE_IS_NOT_DIRECTORY, dir);
}
- throw HyracksDataException.create(ErrorCode.UNIDENTIFIED_IO_ERROR_READING_FILE, path);
+ throw HyracksDataException.create(ErrorCode.UNIDENTIFIED_IO_ERROR_READING_FILE, dir);
}
return files;
}
@@ -189,31 +184,22 @@
@Override
public void createDirs() throws HyracksDataException {
- File f = new File(baseDir);
- if (f.exists()) {
+ if (baseDir.getFile().exists()) {
throw HyracksDataException.create(ErrorCode.CANNOT_CREATE_EXISTING_INDEX);
}
- f.mkdirs();
+ baseDir.getFile().mkdirs();
}
@Override
public void deleteDirs() throws HyracksDataException {
- IoUtil.delete(new File(baseDir));
- }
-
- protected FileReference createFlushFile(String flushFileName) throws HyracksDataException {
- return ioManager.resolveAbsolutePath(flushFileName);
- }
-
- protected FileReference createMergeFile(String mergeFileName) throws HyracksDataException {
- return createFlushFile(mergeFileName);
+ IoUtil.delete(baseDir);
}
@Override
public LSMComponentFileReferences getRelFlushFileReference() throws HyracksDataException {
String ts = getCurrentTimestamp();
// Begin timestamp and end timestamp are identical since it is a flush
- return new LSMComponentFileReferences(createFlushFile(baseDir + ts + DELIMITER + ts), null, null);
+ return new LSMComponentFileReferences(baseDir.getChild(ts + DELIMITER + ts), null, null);
}
@Override
@@ -223,7 +209,7 @@
String[] lastTimestampRange = lastFileName.split(DELIMITER);
// Get the range of timestamps by taking the earliest and the latest timestamps
return new LSMComponentFileReferences(
- createMergeFile(baseDir + firstTimestampRange[0] + DELIMITER + lastTimestampRange[1]), null, null);
+ baseDir.getChild(firstTimestampRange[0] + DELIMITER + lastTimestampRange[1]), null, null);
}
@Override
@@ -267,8 +253,7 @@
current.fileRef.delete();
} else {
// This scenario should not be possible since timestamps are monotonically increasing.
- throw new HyracksDataException("Found LSM files with overlapping timestamp intervals, "
- + "but the intervals were not contained by another file.");
+ throw HyracksDataException.create(ErrorCode.FOUND_OVERLAPPING_LSM_FILES, baseDir);
}
}
@@ -302,24 +287,19 @@
}
@Override
- public String getBaseDir() {
+ public FileReference getBaseDir() {
return baseDir;
}
@Override
public void recoverTransaction() throws HyracksDataException {
String[] files = listDirFiles(baseDir, txnFileNameFilter);
- File dir = new File(baseDir);
- try {
- if (files.length == 0) {
- // Do nothing
- } else if (files.length > 1) {
- throw new HyracksDataException("Found more than one transaction");
- } else {
- Files.delete(Paths.get(dir.getPath() + File.separator + files[0]));
- }
- } catch (IOException e) {
- throw new HyracksDataException("Failed to recover transaction", e);
+ if (files.length == 0) {
+ // Do nothing
+ } else if (files.length > 1) {
+ throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
+ } else {
+ IoUtil.delete(baseDir.getChild(files[0]));
}
}
@@ -366,27 +346,17 @@
if (files.length == 0) {
// Do nothing
} else if (files.length > 1) {
- throw new HyracksDataException("Found more than one transaction");
+ throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
} else {
- File dir = new File(baseDir);
//create transaction filter
FilenameFilter transactionFilter = createTransactionFilter(files[0], true);
String[] componentsFiles = listDirFiles(baseDir, transactionFilter);
for (String fileName : componentsFiles) {
- try {
- String absFileName = dir.getPath() + File.separator + fileName;
- Files.delete(Paths.get(absFileName));
- } catch (IOException e) {
- throw new HyracksDataException("Failed to delete transaction files", e);
- }
+ FileReference file = baseDir.getChild(fileName);
+ IoUtil.delete(file);
}
// delete the txn lock file
- String absFileName = dir.getPath() + File.separator + files[0];
- try {
- Files.delete(Paths.get(absFileName));
- } catch (IOException e) {
- throw new HyracksDataException("Failed to delete transaction files", e);
- }
+ IoUtil.delete(baseDir.getChild(files[0]));
}
}
@@ -403,16 +373,7 @@
protected static FilenameFilter createTransactionFilter(String transactionFileName, final boolean inclusive) {
final String timeStamp =
transactionFileName.substring(transactionFileName.indexOf(TXN_PREFIX) + TXN_PREFIX.length());
- return new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- if (inclusive) {
- return name.startsWith(timeStamp);
- } else {
- return !name.startsWith(timeStamp);
- }
- }
- };
+ return (dir, name) -> inclusive ? name.startsWith(timeStamp) : !name.startsWith(timeStamp);
}
protected FilenameFilter getTransactionFileFilter(boolean inclusive) throws HyracksDataException {
@@ -425,12 +386,7 @@
}
protected FilenameFilter getCompoundFilter(final FilenameFilter filter1, final FilenameFilter filter2) {
- return new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return (filter1.accept(dir, name) && filter2.accept(dir, name));
- }
- };
+ return (dir, name) -> filter1.accept(dir, name) && filter2.accept(dir, name);
}
/**
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
index 4a60db0..0f862ac 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
@@ -724,7 +724,7 @@
return new LSMInvertedIndexFlushOperation(new LSMInvertedIndexAccessor(getLsmHarness(), opCtx),
flushingComponent, componentFileRefs.getInsertIndexFileReference(),
componentFileRefs.getDeleteIndexFileReference(), componentFileRefs.getBloomFilterFileReference(),
- callback, fileManager.getBaseDir());
+ callback, fileManager.getBaseDir().getAbsolutePath());
}
@Override
@@ -735,7 +735,7 @@
IIndexCursor cursor = new LSMInvertedIndexRangeSearchCursor(opCtx);
return new LSMInvertedIndexMergeOperation(accessor, mergingComponents, cursor,
mergeFileRefs.getInsertIndexFileReference(), mergeFileRefs.getDeleteIndexFileReference(),
- mergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir());
+ mergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir().getAbsolutePath());
}
@Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
index 9254c45..c4a2f73 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
@@ -27,9 +27,11 @@
import java.util.Iterator;
import java.util.List;
+import org.apache.hyracks.api.exceptions.ErrorCode;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.io.FileReference;
import org.apache.hyracks.api.io.IIOManager;
+import org.apache.hyracks.api.util.IoUtil;
import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
import org.apache.hyracks.storage.am.lsm.common.impls.BTreeFactory;
import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
@@ -43,27 +45,12 @@
// We only need a BTree factory because the inverted indexes consistency is validated against its dictionary BTree.
private final BTreeFactory btreeFactory;
-
- private static FilenameFilter dictBTreeFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(DICT_BTREE_SUFFIX);
- }
- };
-
- private static FilenameFilter invListFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(INVLISTS_SUFFIX);
- }
- };
-
- private static FilenameFilter deletedKeysBTreeFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(DELETED_KEYS_BTREE_SUFFIX);
- }
- };
+ private static final FilenameFilter dictBTreeFilter =
+ (dir, name) -> !name.startsWith(".") && name.endsWith(DICT_BTREE_SUFFIX);
+ private static final FilenameFilter invListFilter =
+ (dir, name) -> !name.startsWith(".") && name.endsWith(INVLISTS_SUFFIX);
+ private static final FilenameFilter deletedKeysBTreeFilter =
+ (dir, name) -> !name.startsWith(".") && name.endsWith(DELETED_KEYS_BTREE_SUFFIX);
public LSMInvertedIndexFileManager(IIOManager ioManager, FileReference file, BTreeFactory btreeFactory) {
super(ioManager, file, null);
@@ -73,11 +60,11 @@
@Override
public LSMComponentFileReferences getRelFlushFileReference() throws HyracksDataException {
String ts = getCurrentTimestamp();
- String baseName = baseDir + ts + DELIMITER + ts;
+ String baseName = ts + DELIMITER + ts;
// Begin timestamp and end timestamp are identical since it is a flush
- return new LSMComponentFileReferences(createFlushFile(baseName + DELIMITER + DICT_BTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + DELETED_KEYS_BTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + DICT_BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + DELETED_KEYS_BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
@@ -85,12 +72,11 @@
throws HyracksDataException {
String[] firstTimestampRange = firstFileName.split(DELIMITER);
String[] lastTimestampRange = lastFileName.split(DELIMITER);
-
- String baseName = baseDir + firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
+ String baseName = firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
// Get the range of timestamps by taking the earliest and the latest timestamps
- return new LSMComponentFileReferences(createMergeFile(baseName + DELIMITER + DICT_BTREE_SUFFIX),
- createMergeFile(baseName + DELIMITER + DELETED_KEYS_BTREE_SUFFIX),
- createMergeFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + DICT_BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + DELETED_KEYS_BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
@@ -118,8 +104,7 @@
if (allDictBTreeFiles.size() != allInvListsFiles.size()
|| allDictBTreeFiles.size() != allDeletedKeysBTreeFiles.size()
|| allDictBTreeFiles.size() != allBloomFilterFiles.size()) {
- throw new HyracksDataException(
- "Unequal number of valid Dictionary BTree, Inverted Lists, Deleted BTree, and Bloom Filter files found. Aborting cleanup.");
+ throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
}
// Trivial cases.
@@ -154,35 +139,31 @@
for (int i = 1; i < allDictBTreeFiles.size(); i++) {
ComparableFileName currentDeletedKeysBTree = allDeletedKeysBTreeFiles.get(i);
- ComparableFileName CurrentDictBTree = allDictBTreeFiles.get(i);
+ ComparableFileName currentDictBTree = allDictBTreeFiles.get(i);
ComparableFileName currentBloomFilter = allBloomFilterFiles.get(i);
// Current start timestamp is greater than last stop timestamp.
if (currentDeletedKeysBTree.interval[0].compareTo(lastDeletedKeysBTree.interval[1]) > 0
- && CurrentDictBTree.interval[0].compareTo(lastDictBTree.interval[1]) > 0
+ && currentDictBTree.interval[0].compareTo(lastDictBTree.interval[1]) > 0
&& currentBloomFilter.interval[0].compareTo(lastBloomFilter.interval[1]) > 0) {
- validComparableDictBTreeFiles.add(CurrentDictBTree);
+ validComparableDictBTreeFiles.add(currentDictBTree);
validComparableDeletedKeysBTreeFiles.add(currentDeletedKeysBTree);
validComparableBloomFilterFiles.add(currentBloomFilter);
- lastDictBTree = CurrentDictBTree;
+ lastDictBTree = currentDictBTree;
lastDeletedKeysBTree = currentDeletedKeysBTree;
lastBloomFilter = currentBloomFilter;
} else if (currentDeletedKeysBTree.interval[0].compareTo(lastDeletedKeysBTree.interval[0]) >= 0
&& currentDeletedKeysBTree.interval[1].compareTo(lastDeletedKeysBTree.interval[1]) <= 0
- && CurrentDictBTree.interval[0].compareTo(lastDictBTree.interval[0]) >= 0
- && CurrentDictBTree.interval[1].compareTo(lastDictBTree.interval[1]) <= 0
+ && currentDictBTree.interval[0].compareTo(lastDictBTree.interval[0]) >= 0
+ && currentDictBTree.interval[1].compareTo(lastDictBTree.interval[1]) <= 0
&& currentBloomFilter.interval[0].compareTo(lastBloomFilter.interval[0]) >= 0
&& currentBloomFilter.interval[1].compareTo(lastBloomFilter.interval[1]) <= 0) {
// Invalid files are completely contained in last interval.
- File invalidDeletedBTreeFile = new File(currentDeletedKeysBTree.fullPath);
- invalidDeletedBTreeFile.delete();
- File invalidDictBTreeFile = new File(CurrentDictBTree.fullPath);
- invalidDictBTreeFile.delete();
- File invalidBloomFilterFile = new File(currentBloomFilter.fullPath);
- invalidBloomFilterFile.delete();
+ IoUtil.delete(new File(currentDeletedKeysBTree.fullPath));
+ IoUtil.delete(new File(currentDictBTree.fullPath));
+ IoUtil.delete(new File(currentBloomFilter.fullPath));
} else {
// This scenario should not be possible.
- throw new HyracksDataException(
- "Found LSM files with overlapping but not contained timetamp intervals.");
+ throw HyracksDataException.create(ErrorCode.FOUND_OVERLAPPING_LSM_FILES, baseDir);
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java
index 512e35c..e39c3f9 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java
@@ -642,7 +642,7 @@
// create the merge operation.
LSMRTreeMergeOperation mergeOp = new LSMRTreeMergeOperation(accessor, mergingComponents, cursor,
relMergeFileRefs.getInsertIndexFileReference(), relMergeFileRefs.getDeleteIndexFileReference(),
- relMergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir());
+ relMergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir().getAbsolutePath());
ioScheduler.scheduleOperation(mergeOp);
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
index 07d48de..0f291df 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
@@ -431,7 +431,7 @@
LSMRTreeAccessor accessor = new LSMRTreeAccessor(getLsmHarness(), opCtx, buddyBTreeFields);
return new LSMRTreeFlushOperation(accessor, flushingComponent, componentFileRefs.getInsertIndexFileReference(),
componentFileRefs.getDeleteIndexFileReference(), componentFileRefs.getBloomFilterFileReference(),
- callback, fileManager.getBaseDir());
+ callback, fileManager.getBaseDir().getAbsolutePath());
}
@Override
@@ -442,6 +442,6 @@
ILSMIndexAccessor accessor = new LSMRTreeAccessor(getLsmHarness(), opCtx, buddyBTreeFields);
return new LSMRTreeMergeOperation(accessor, mergingComponents, cursor,
mergeFileRefs.getInsertIndexFileReference(), mergeFileRefs.getDeleteIndexFileReference(),
- mergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir());
+ mergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir().getAbsolutePath());
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
index 4d5eb5b..001228c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
@@ -30,9 +30,11 @@
import java.util.Iterator;
import java.util.List;
+import org.apache.hyracks.api.exceptions.ErrorCode;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.io.FileReference;
import org.apache.hyracks.api.io.IIOManager;
+import org.apache.hyracks.api.util.IoUtil;
import org.apache.hyracks.storage.am.common.api.ITreeIndex;
import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
@@ -43,19 +45,10 @@
private final TreeIndexFactory<? extends ITreeIndex> rtreeFactory;
private final TreeIndexFactory<? extends ITreeIndex> btreeFactory;
- private static FilenameFilter btreeFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
- }
- };
-
- private static FilenameFilter rtreeFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return !name.startsWith(".") && name.endsWith(RTREE_SUFFIX);
- }
- };
+ private static final FilenameFilter btreeFilter =
+ (dir, name) -> !name.startsWith(".") && name.endsWith(BTREE_SUFFIX);
+ private static final FilenameFilter rtreeFilter =
+ (dir, name) -> !name.startsWith(".") && name.endsWith(RTREE_SUFFIX);
public LSMRTreeFileManager(IIOManager ioManager, FileReference file,
TreeIndexFactory<? extends ITreeIndex> rtreeFactory, TreeIndexFactory<? extends ITreeIndex> btreeFactory) {
@@ -67,11 +60,11 @@
@Override
public LSMComponentFileReferences getRelFlushFileReference() throws HyracksDataException {
String ts = getCurrentTimestamp();
- String baseName = baseDir + ts + DELIMITER + ts;
+ String baseName = ts + DELIMITER + ts;
// Begin timestamp and end timestamp are identical since it is a flush
- return new LSMComponentFileReferences(createFlushFile(baseName + DELIMITER + RTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + BTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + RTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
@@ -79,13 +72,12 @@
throws HyracksDataException {
String[] firstTimestampRange = firstFileName.split(DELIMITER);
String[] lastTimestampRange = lastFileName.split(DELIMITER);
-
- String baseName = baseDir + firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
+ String baseName = firstTimestampRange[0] + DELIMITER + lastTimestampRange[1];
// Get the range of timestamps by taking the earliest and the latest
// timestamps
- return new LSMComponentFileReferences(createMergeFile(baseName + DELIMITER + RTREE_SUFFIX),
- createMergeFile(baseName + DELIMITER + BTREE_SUFFIX),
- createMergeFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + RTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
@@ -111,8 +103,7 @@
// Sanity check.
if (allRTreeFiles.size() != allBTreeFiles.size() || allBTreeFiles.size() != allBloomFilterFiles.size()) {
- throw new HyracksDataException(
- "Unequal number of valid RTree, BTree, and Bloom Filter files found. Aborting cleanup.");
+ throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
}
// Trivial cases.
@@ -164,16 +155,12 @@
&& currentBloomFilter.interval[0].compareTo(lastBloomFilter.interval[0]) >= 0
&& currentBloomFilter.interval[1].compareTo(lastBloomFilter.interval[1]) <= 0) {
// Invalid files are completely contained in last interval.
- File invalidRTreeFile = new File(currentRTree.fullPath);
- invalidRTreeFile.delete();
- File invalidBTreeFile = new File(currentBTree.fullPath);
- invalidBTreeFile.delete();
- File invalidBloomFilterFile = new File(currentBloomFilter.fullPath);
- invalidBloomFilterFile.delete();
+ IoUtil.delete(new File(currentRTree.fullPath));
+ IoUtil.delete(new File(currentBTree.fullPath));
+ IoUtil.delete(new File(currentBloomFilter.fullPath));
} else {
// This scenario should not be possible.
- throw new HyracksDataException(
- "Found LSM files with overlapping but not contained timetamp intervals.");
+ throw HyracksDataException.create(ErrorCode.FOUND_OVERLAPPING_LSM_FILES, baseDir);
}
}
@@ -201,54 +188,44 @@
String ts = getCurrentTimestamp();
// Create transaction lock file
Files.createFile(Paths.get(baseDir + TXN_PREFIX + ts));
-
- String baseName = baseDir + ts + DELIMITER + ts;
- return new LSMComponentFileReferences(createFlushFile(baseName + DELIMITER + RTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + BTREE_SUFFIX),
- createFlushFile(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
+ String baseName = ts + DELIMITER + ts;
+ return new LSMComponentFileReferences(baseDir.getChild(baseName + DELIMITER + RTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BTREE_SUFFIX),
+ baseDir.getChild(baseName + DELIMITER + BLOOM_FILTER_SUFFIX));
}
@Override
public LSMComponentFileReferences getTransactionFileReferenceForCommit() throws HyracksDataException {
FilenameFilter transactionFilter;
- File dir = new File(baseDir);
- String[] files = dir.list(txnFileNameFilter);
+ String[] files = baseDir.getFile().list(txnFileNameFilter);
if (files.length == 0) {
return null;
}
if (files.length != 1) {
- throw new HyracksDataException("More than one transaction lock found:" + files.length);
+ throw HyracksDataException.create(ErrorCode.FOUND_MULTIPLE_TRANSACTIONS, baseDir);
} else {
transactionFilter = getTransactionFileFilter(true);
- String txnFileName = dir.getPath() + File.separator + files[0];
// get the actual transaction files
- files = dir.list(transactionFilter);
+ files = baseDir.getFile().list(transactionFilter);
if (files.length < 3) {
- throw new HyracksDataException("LSM Rtree transaction has less than 3 files :" + files.length);
+ throw HyracksDataException.create(ErrorCode.UNEQUAL_NUM_FILTERS_TREES, baseDir);
}
- try {
- Files.delete(Paths.get(txnFileName));
- } catch (IOException e) {
- throw new HyracksDataException("Failed to delete transaction lock :" + txnFileName);
- }
+ IoUtil.delete(baseDir.getChild(files[0]));
}
- File rTreeFile = null;
- File bTreeFile = null;
- File bloomFilterFile = null;
+ FileReference rTreeFileRef = null;
+ FileReference bTreeFileRef = null;
+ FileReference bloomFilterFileRef = null;
for (String fileName : files) {
if (fileName.endsWith(BTREE_SUFFIX)) {
- bTreeFile = new File(dir.getPath() + File.separator + fileName);
+ bTreeFileRef = baseDir.getChild(fileName);
} else if (fileName.endsWith(RTREE_SUFFIX)) {
- rTreeFile = new File(dir.getPath() + File.separator + fileName);
+ rTreeFileRef = baseDir.getChild(fileName);
} else if (fileName.endsWith(BLOOM_FILTER_SUFFIX)) {
- bloomFilterFile = new File(dir.getPath() + File.separator + fileName);
+ bloomFilterFileRef = baseDir.getChild(fileName);
} else {
- throw new HyracksDataException("unrecognized file found = " + fileName);
+ throw HyracksDataException.create(ErrorCode.UNRECOGNIZED_INDEX_COMPONENT_FILE, fileName);
}
}
- FileReference rTreeFileRef = ioManager.resolveAbsolutePath(rTreeFile.getAbsolutePath());
- FileReference bTreeFileRef = ioManager.resolveAbsolutePath(bTreeFile.getAbsolutePath());
- FileReference bloomFilterFileRef = ioManager.resolveAbsolutePath(bloomFilterFile.getAbsolutePath());
return new LSMComponentFileReferences(rTreeFileRef, bTreeFileRef, bloomFilterFileRef);
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
index 2b61f1e..58d4421 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
@@ -339,7 +339,7 @@
ILSMIOOperationCallback callback) throws HyracksDataException {
ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
return new LSMRTreeFlushOperation(accessor, flushingComponent, componentFileRefs.getInsertIndexFileReference(),
- null, null, callback, fileManager.getBaseDir());
+ null, null, callback, fileManager.getBaseDir().getAbsolutePath());
}
@Override
@@ -353,6 +353,6 @@
ITreeIndexCursor cursor = new LSMRTreeWithAntiMatterTuplesSearchCursor(opCtx, returnDeletedTuples);
ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
return new MergeOperation(accessor, mergeFileRefs.getInsertIndexFileReference(), callback,
- fileManager.getBaseDir(), mergingComponents, cursor);
+ fileManager.getBaseDir().getAbsolutePath(), mergingComponents, cursor);
}
}
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/component/TestLsmIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/component/TestLsmIndexFileManager.java
index 1c75387..87fb11a 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/component/TestLsmIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/component/TestLsmIndexFileManager.java
@@ -19,7 +19,6 @@
package org.apache.hyracks.storage.am.lsm.common.component;
-import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
@@ -40,11 +39,9 @@
protected void cleanupAndGetValidFilesInternal(FilenameFilter filter,
TreeIndexFactory<? extends ITreeIndex> treeFactory, ArrayList<ComparableFileName> allFiles)
throws HyracksDataException {
- File dir = new File(baseDir);
- String[] files = dir.list(filter);
+ String[] files = baseDir.getFile().list(filter);
for (String fileName : files) {
- File file = new File(dir.getPath() + File.separator + fileName);
- FileReference fileRef = ioManager.resolveAbsolutePath(file.getAbsolutePath());
+ FileReference fileRef = baseDir.getChild(fileName);
allFiles.add(new ComparableFileName(fileRef));
}
}