Delete the artifacts of a loaded component if it turn out to be an empty load.
Addressed code review comments.
diff --git a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
index 6808b39..3eea1b3 100644
--- a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
+++ b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
@@ -500,6 +500,7 @@
private final BTreeBulkLoader bulkLoader;
private final IIndexBulkLoader builder;
private boolean endHasBeenCalled = false;
+ private boolean isEmptyComponent = true;
public LSMBTreeBulkLoader(float fillFactor, boolean verifyInput, long numElementsHint, boolean checkIfEmptyIndex)
throws TreeIndexException, HyracksDataException {
@@ -508,9 +509,7 @@
}
try {
component = createBulkLoadTarget();
- } catch (HyracksDataException e) {
- throw new TreeIndexException(e);
- } catch (IndexException e) {
+ } catch (HyracksDataException | IndexException e) {
throw new TreeIndexException(e);
}
bulkLoader = (BTreeBulkLoader) ((LSMBTreeImmutableComponent) component).getBTree().createBulkLoader(
@@ -525,22 +524,19 @@
@Override
public void add(ITupleReference tuple) throws IndexException, HyracksDataException {
+ if (isEmptyComponent) {
+ isEmptyComponent = false;
+ }
try {
bulkLoader.add(tuple);
builder.add(tuple);
- } catch (IndexException e) {
- handleException();
- throw e;
- } catch (HyracksDataException e) {
- handleException();
- throw e;
- } catch (RuntimeException e) {
- handleException();
+ } catch (IndexException | HyracksDataException | RuntimeException e) {
+ cleanupArtifacts();
throw e;
}
}
- protected void handleException() throws HyracksDataException, IndexException {
+ protected void cleanupArtifacts() throws HyracksDataException, IndexException {
if (!endHasBeenCalled) {
builder.end();
}
@@ -555,9 +551,12 @@
bulkLoader.end();
builder.end();
endHasBeenCalled = true;
- lsmHarness.addBulkLoadedComponent(component);
+ if (isEmptyComponent) {
+ cleanupArtifacts();
+ } else {
+ lsmHarness.addBulkLoadedComponent(component);
+ }
}
-
}
public LSMBTreeOpContext createOpContext(IModificationOperationCallback modificationCallback,
diff --git a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
index ea1d297..bbb8459 100644
--- a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
+++ b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
@@ -576,6 +576,7 @@
private final ILSMComponent component;
private final IIndexBulkLoader invIndexBulkLoader;
private boolean exceptionCaught = false;
+ private boolean isEmptyComponent = true;
public LSMInvertedIndexBulkLoader(float fillFactor, boolean verifyInput, long numElementsHint,
boolean checkIfEmptyIndex) throws IndexException, HyracksDataException {
@@ -586,9 +587,7 @@
// new bulk loaded tree is "newer" than any other merged tree.
try {
component = createBulkLoadTarget();
- } catch (HyracksDataException e) {
- throw new IndexException(e);
- } catch (IndexException e) {
+ } catch (HyracksDataException | IndexException e) {
throw new IndexException(e);
}
invIndexBulkLoader = ((LSMInvertedIndexImmutableComponent) component).getInvIndex().createBulkLoader(
@@ -597,15 +596,12 @@
@Override
public void add(ITupleReference tuple) throws IndexException, HyracksDataException {
+ if (isEmptyComponent) {
+ isEmptyComponent = false;
+ }
try {
invIndexBulkLoader.add(tuple);
- } catch (IndexException e) {
- handleException();
- throw e;
- } catch (HyracksDataException e) {
- handleException();
- throw e;
- } catch (RuntimeException e) {
+ } catch (IndexException | HyracksDataException | RuntimeException e) {
handleException();
throw e;
}
@@ -613,6 +609,10 @@
protected void handleException() throws HyracksDataException {
exceptionCaught = true;
+ cleanupArtifacts();
+ }
+
+ protected void cleanupArtifacts() throws HyracksDataException {
((LSMInvertedIndexImmutableComponent) component).getInvIndex().deactivate();
((LSMInvertedIndexImmutableComponent) component).getInvIndex().destroy();
((LSMInvertedIndexImmutableComponent) component).getDeletedKeysBTree().deactivate();
@@ -626,7 +626,11 @@
if (!exceptionCaught) {
invIndexBulkLoader.end();
}
- lsmHarness.addBulkLoadedComponent(component);
+ if (isEmptyComponent) {
+ cleanupArtifacts();
+ } else {
+ lsmHarness.addBulkLoadedComponent(component);
+ }
}
}
diff --git a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
index 51efbf4..2f631af 100644
--- a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
+++ b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
@@ -412,6 +412,7 @@
public class LSMRTreeBulkLoader implements IIndexBulkLoader {
private final ILSMComponent component;
private final IIndexBulkLoader bulkLoader;
+ private boolean isEmptyComponent = true;
public LSMRTreeBulkLoader(float fillFactor, boolean verifyInput, long numElementsHint, boolean checkIfEmptyIndex)
throws TreeIndexException, HyracksDataException {
@@ -422,9 +423,7 @@
// new bulk loaded tree is "newer" than any other merged tree.
try {
component = createBulkLoadTarget();
- } catch (HyracksDataException e) {
- throw new TreeIndexException(e);
- } catch (IndexException e) {
+ } catch (HyracksDataException | IndexException e) {
throw new TreeIndexException(e);
}
bulkLoader = ((LSMRTreeImmutableComponent) component).getRTree().createBulkLoader(fillFactor, verifyInput,
@@ -433,16 +432,13 @@
@Override
public void add(ITupleReference tuple) throws HyracksDataException, IndexException {
+ if (isEmptyComponent) {
+ isEmptyComponent = false;
+ }
try {
bulkLoader.add(tuple);
- } catch (IndexException e) {
- handleException();
- throw e;
- } catch (HyracksDataException e) {
- handleException();
- throw e;
- } catch (RuntimeException e) {
- handleException();
+ } catch (IndexException | HyracksDataException | RuntimeException e) {
+ cleanupArtifacts();
throw e;
}
}
@@ -450,10 +446,14 @@
@Override
public void end() throws HyracksDataException, IndexException {
bulkLoader.end();
- lsmHarness.addBulkLoadedComponent(component);
+ if (isEmptyComponent) {
+ cleanupArtifacts();
+ } else {
+ lsmHarness.addBulkLoadedComponent(component);
+ }
}
- protected void handleException() throws HyracksDataException {
+ protected void cleanupArtifacts() throws HyracksDataException {
((LSMRTreeImmutableComponent) component).getRTree().deactivate();
((LSMRTreeImmutableComponent) component).getRTree().destroy();
((LSMRTreeImmutableComponent) component).getBTree().deactivate();
diff --git a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
index 4a61481..1bf9f58 100644
--- a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
+++ b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
@@ -382,6 +382,7 @@
public class LSMRTreeWithAntiMatterTuplesBulkLoader implements IIndexBulkLoader {
private final ILSMComponent component;
private final IIndexBulkLoader bulkLoader;
+ private boolean isEmptyComponent = true;
public LSMRTreeWithAntiMatterTuplesBulkLoader(float fillFactor, boolean verifyInput, long numElementsHint,
boolean checkIfEmptyIndex) throws TreeIndexException, HyracksDataException {
@@ -392,9 +393,7 @@
// new bulk loaded tree is "newer" than any other merged tree.
try {
component = createBulkLoadTarget();
- } catch (HyracksDataException e) {
- throw new TreeIndexException(e);
- } catch (IndexException e) {
+ } catch (HyracksDataException | IndexException e) {
throw new TreeIndexException(e);
}
bulkLoader = ((LSMRTreeImmutableComponent) component).getRTree().createBulkLoader(fillFactor, verifyInput,
@@ -403,16 +402,13 @@
@Override
public void add(ITupleReference tuple) throws HyracksDataException, IndexException {
+ if (isEmptyComponent) {
+ isEmptyComponent = false;
+ }
try {
bulkLoader.add(tuple);
- } catch (IndexException e) {
- handleException();
- throw e;
- } catch (HyracksDataException e) {
- handleException();
- throw e;
- } catch (RuntimeException e) {
- handleException();
+ } catch (IndexException | HyracksDataException | RuntimeException e) {
+ cleanupArtifacts();
throw e;
}
}
@@ -420,10 +416,14 @@
@Override
public void end() throws HyracksDataException, IndexException {
bulkLoader.end();
- lsmHarness.addBulkLoadedComponent(component);
+ if (isEmptyComponent) {
+ cleanupArtifacts();
+ } else {
+ lsmHarness.addBulkLoadedComponent(component);
+ }
}
- protected void handleException() throws HyracksDataException {
+ protected void cleanupArtifacts() throws HyracksDataException {
((LSMRTreeImmutableComponent) component).getRTree().deactivate();
((LSMRTreeImmutableComponent) component).getRTree().destroy();
}
diff --git a/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java b/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java
index ec20661..54eac1e 100644
--- a/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java
+++ b/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java
@@ -25,9 +25,11 @@
public abstract class OrderedIndexBulkLoadTest extends OrderedIndexTestDriver {
private final OrderedIndexTestUtils orderedIndexTestUtils;
+ private final int bulkLoadRounds;
- public OrderedIndexBulkLoadTest(BTreeLeafFrameType[] leafFrameTypesToTest) {
+ public OrderedIndexBulkLoadTest(BTreeLeafFrameType[] leafFrameTypesToTest, int bulkLoadRounds) {
super(leafFrameTypesToTest);
+ this.bulkLoadRounds = bulkLoadRounds;
this.orderedIndexTestUtils = new OrderedIndexTestUtils();
}
@@ -38,21 +40,22 @@
OrderedIndexTestContext ctx = createTestContext(fieldSerdes, numKeys, leafType);
ctx.getIndex().create();
ctx.getIndex().activate();
-
- // We assume all fieldSerdes are of the same type. Check the first
- // one
- // to determine which field types to generate.
- if (fieldSerdes[0] instanceof IntegerSerializerDeserializer) {
- orderedIndexTestUtils.bulkLoadIntTuples(ctx, numTuplesToInsert, getRandom());
- } else if (fieldSerdes[0] instanceof UTF8StringSerializerDeserializer) {
- orderedIndexTestUtils.bulkLoadStringTuples(ctx, numTuplesToInsert, getRandom());
- }
- orderedIndexTestUtils.checkPointSearches(ctx);
- orderedIndexTestUtils.checkScan(ctx);
- orderedIndexTestUtils.checkDiskOrderScan(ctx);
- orderedIndexTestUtils.checkRangeSearch(ctx, lowKey, highKey, true, true);
- if (prefixLowKey != null && prefixHighKey != null) {
- orderedIndexTestUtils.checkRangeSearch(ctx, prefixLowKey, prefixHighKey, true, true);
+ for (int i = 0; i < bulkLoadRounds; i++) {
+ // We assume all fieldSerdes are of the same type. Check the first
+ // one
+ // to determine which field types to generate.
+ if (fieldSerdes[0] instanceof IntegerSerializerDeserializer) {
+ orderedIndexTestUtils.bulkLoadIntTuples(ctx, numTuplesToInsert, getRandom());
+ } else if (fieldSerdes[0] instanceof UTF8StringSerializerDeserializer) {
+ orderedIndexTestUtils.bulkLoadStringTuples(ctx, numTuplesToInsert, getRandom());
+ }
+ orderedIndexTestUtils.checkPointSearches(ctx);
+ orderedIndexTestUtils.checkScan(ctx);
+ orderedIndexTestUtils.checkDiskOrderScan(ctx);
+ orderedIndexTestUtils.checkRangeSearch(ctx, lowKey, highKey, true, true);
+ if (prefixLowKey != null && prefixHighKey != null) {
+ orderedIndexTestUtils.checkRangeSearch(ctx, prefixLowKey, prefixHighKey, true, true);
+ }
}
ctx.getIndex().validate();
@@ -64,4 +67,4 @@
protected String getTestOpName() {
return "BulkLoad";
}
-}
+}
\ No newline at end of file
diff --git a/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/common/TreeIndexTestUtils.java b/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/common/TreeIndexTestUtils.java
index 3f1ff5d..b5742b5 100644
--- a/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/common/TreeIndexTestUtils.java
+++ b/hyracks/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/storage/am/common/TreeIndexTestUtils.java
@@ -243,7 +243,7 @@
ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(fieldCount);
ArrayTupleReference tuple = new ArrayTupleReference();
// Perform bulk load.
- IIndexBulkLoader bulkLoader = ctx.getIndex().createBulkLoader(0.7f, false, numTuples, true);
+ IIndexBulkLoader bulkLoader = ctx.getIndex().createBulkLoader(0.7f, false, numTuples, false);
int c = 1;
for (CheckTuple checkTuple : checkTuples) {
if (LOGGER.isLoggable(Level.INFO)) {
diff --git a/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeBulkLoadTest.java b/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeBulkLoadTest.java
index ee1a1b2..0e69f04 100644
--- a/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeBulkLoadTest.java
+++ b/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeBulkLoadTest.java
@@ -31,7 +31,7 @@
private final BTreeTestHarness harness = new BTreeTestHarness();
public BTreeBulkLoadTest() {
- super(BTreeTestHarness.LEAF_FRAMES_TO_TEST);
+ super(BTreeTestHarness.LEAF_FRAMES_TO_TEST, 1);
}
@Before
diff --git a/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/lsm/btree/LSMBTreeBulkLoadTest.java b/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/lsm/btree/LSMBTreeBulkLoadTest.java
index dfef21e..ec4f7e2 100644
--- a/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/lsm/btree/LSMBTreeBulkLoadTest.java
+++ b/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/lsm/btree/LSMBTreeBulkLoadTest.java
@@ -33,7 +33,7 @@
public class LSMBTreeBulkLoadTest extends OrderedIndexBulkLoadTest {
public LSMBTreeBulkLoadTest() {
- super(LSMBTreeTestHarness.LEAF_FRAMES_TO_TEST);
+ super(LSMBTreeTestHarness.LEAF_FRAMES_TO_TEST, 1);
}
private final LSMBTreeTestHarness harness = new LSMBTreeTestHarness();
diff --git a/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/lsm/btree/LSMBTreeMultiBulkLoadTest.java b/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/lsm/btree/LSMBTreeMultiBulkLoadTest.java
new file mode 100644
index 0000000..00f75dc
--- /dev/null
+++ b/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/lsm/btree/LSMBTreeMultiBulkLoadTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009-2013 by The Regents of the University of California
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * you may obtain a copy of the License from
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package edu.uci.ics.hyracks.storage.am.lsm.btree;
+
+import java.util.Random;
+
+import org.junit.After;
+import org.junit.Before;
+
+import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
+import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
+import edu.uci.ics.hyracks.api.exceptions.HyracksException;
+import edu.uci.ics.hyracks.storage.am.btree.OrderedIndexBulkLoadTest;
+import edu.uci.ics.hyracks.storage.am.btree.OrderedIndexTestContext;
+import edu.uci.ics.hyracks.storage.am.btree.frames.BTreeLeafFrameType;
+import edu.uci.ics.hyracks.storage.am.config.AccessMethodTestsConfig;
+import edu.uci.ics.hyracks.storage.am.lsm.btree.util.LSMBTreeTestContext;
+import edu.uci.ics.hyracks.storage.am.lsm.btree.util.LSMBTreeTestHarness;
+
+@SuppressWarnings("rawtypes")
+public class LSMBTreeMultiBulkLoadTest extends OrderedIndexBulkLoadTest {
+ public LSMBTreeMultiBulkLoadTest() {
+ // Using 5 bulk load rounds.
+ super(LSMBTreeTestHarness.LEAF_FRAMES_TO_TEST, AccessMethodTestsConfig.LSM_BTREE_BULKLOAD_ROUNDS);
+ }
+
+ private final LSMBTreeTestHarness harness = new LSMBTreeTestHarness();
+
+ @Before
+ public void setUp() throws HyracksException {
+ harness.setUp();
+ }
+
+ @After
+ public void tearDown() throws HyracksDataException {
+ harness.tearDown();
+ }
+
+ @Override
+ protected OrderedIndexTestContext createTestContext(ISerializerDeserializer[] fieldSerdes, int numKeys,
+ BTreeLeafFrameType leafType) throws Exception {
+ return LSMBTreeTestContext.create(harness.getVirtualBufferCache(), harness.getIOManager(),
+ harness.getFileReference(), harness.getDiskBufferCache(), harness.getDiskFileMapProvider(),
+ fieldSerdes, numKeys, harness.getBoomFilterFalsePositiveRate(), harness.getMergePolicy(),
+ harness.getOperationTracker(), harness.getIOScheduler(), harness.getIOOperationCallbackProvider(),
+ harness.getIODeviceId());
+ }
+
+ @Override
+ protected Random getRandom() {
+ return harness.getRandom();
+ }
+}
\ No newline at end of file