abdullah alamoudi has uploaded a new change for review. https://asterix-gerrit.ics.uci.edu/1759
Change subject: Fix upsert deadlock and upsert with filtered primary only bug ...................................................................... Fix upsert deadlock and upsert with filtered primary only bug Change-Id: Ic702d6e1984ea33408c360b6f522f493848cbd87 --- M asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java M asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/NoOpFrameOperationCallbackFactory.java M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/IFrameOperationCallback.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentFilterFactory.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexAccessor.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFilterFactory.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexAccessor.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java M hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java 25 files changed, 228 insertions(+), 145 deletions(-) git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/59/1759/1 diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java index 3f9fba9..14d6e10 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java @@ -106,7 +106,6 @@ currentTupleIdx = 0; lastFlushedTupleIdx = 0; flushedPartialTuples = false; - accessor.reset(buffer); ILSMIndexAccessor lsmAccessor = (ILSMIndexAccessor) indexAccessor; int tupleCount = accessor.getTupleCount(); diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/NoOpFrameOperationCallbackFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/NoOpFrameOperationCallbackFactory.java index 3952b11..5e3879f 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/NoOpFrameOperationCallbackFactory.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/NoOpFrameOperationCallbackFactory.java @@ -40,7 +40,7 @@ private static class NoOpFrameOperationCallback implements IFrameOperationCallback { @Override - public void frameCompleted(boolean modified) throws HyracksDataException { + public void frameCompleted() throws HyracksDataException { // No Op } } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java index bff3ca6..2ffc690 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java @@ -214,8 +214,8 @@ accessor.reset(buffer); LSMTreeIndexAccessor lsmAccessor = (LSMTreeIndexAccessor) indexAccessor; int tupleCount = accessor.getTupleCount(); - boolean firstModification = true; int i = 0; + lsmAccessor.enter(); try { while (i < tupleCount) { tb.reset(); @@ -223,7 +223,7 @@ boolean recordWasDeleted = false; tuple.reset(accessor, i); resetSearchPredicate(i); - if (hasSecondaries) { + if (isFiltered || hasSecondaries) { lsmAccessor.search(cursor, searchPred); if (cursor.hasNext()) { cursor.next(); @@ -239,35 +239,32 @@ } else { searchCallback.before(key); // lock appendPreviousTupleAsMissing(); + prevTuple = tuple; } if (isDeleteOperation(tuple, numOfPrimaryKeys)) { // Only delete if it is a delete and not upsert abstractModCallback.setOp(Operation.DELETE); - if (firstModification) { - lsmAccessor.delete(tuple); - firstModification = false; - } else { - lsmAccessor.forceDelete(tuple); - } + lsmAccessor.forceDelete(prevTuple); recordWasDeleted = true; } else { abstractModCallback.setOp(Operation.UPSERT); - if (firstModification) { - lsmAccessor.upsert(tuple); - firstModification = false; - } else { - lsmAccessor.forceUpsert(tuple); - } + lsmAccessor.forceUpsert(tuple); recordWasInserted = true; + } + if (isFiltered || hasSecondaries) { + // need to update the filter of the new component with the previous value + lsmAccessor.updateFilter(prevTuple); } writeOutput(i, recordWasInserted, recordWasDeleted); i++; } // callback here before calling nextFrame on the next operator - frameOpCallback.frameCompleted(!firstModification); + frameOpCallback.frameCompleted(); appender.write(writer, true); } catch (Exception e) { throw HyracksDataException.create(e); + } finally { + lsmAccessor.exit(); } } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java index 69c633c..9fe63bd 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java @@ -52,6 +52,7 @@ ITreeIndexFrameFactory deleteLeafFrameFactory, ISearchOperationCallback searchCallback, int numBloomFilterKeyFields, IBinaryComparatorFactory[] cmpFactories, int targetIndexVersion, ILSMHarness lsmHarness) { + super(null, null, null); if (cmpFactories != null) { this.cmp = MultiComparator.create(cmpFactories); } else { diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java index ce18b20..3dc106b 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java @@ -50,6 +50,7 @@ IBinaryComparatorFactory[] buddyBtreeCmpFactories, ISearchOperationCallback searchCallback, int targetIndexVersion, ILSMHarness lsmHarness, ITreeIndexFrameFactory btreeInteriorFrameFactory, ITreeIndexFrameFactory btreeLeafFrameFactory, ITreeIndexFrameFactory buddyBtreeLeafFrameFactory) { + super(null, null, null); this.componentHolder = new LinkedList<>(); this.componentsToBeMerged = new LinkedList<>(); this.componentsToBeReplicated = new LinkedList<>(); 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 1c99d5a..af16268 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 @@ -111,7 +111,7 @@ int[] btreeFields, int[] filterFields, boolean durable) throws HyracksDataException { super(ioManager, virtualBufferCaches, diskBTreeFactory.getBufferCache(), fileManager, diskFileMapProvider, bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler, ioOpCallback, filterFrameFactory, - filterManager, filterFields, durable); + filterManager, filterFields, durable, filterFactory); this.insertLeafFrameFactory = insertLeafFrameFactory; this.deleteLeafFrameFactory = deleteLeafFrameFactory; this.cmpFactories = cmpFactories; @@ -316,7 +316,6 @@ @Override public void modify(IIndexOperationContext ictx, ITupleReference tuple) throws HyracksDataException { LSMBTreeOpContext ctx = (LSMBTreeOpContext) ictx; - ITupleReference indexTuple; if (ctx.getIndexTuple() != null) { ctx.getIndexTuple().reset(tuple); @@ -336,11 +335,7 @@ ctx.getCurrentMutableBTreeAccessor().upsert(indexTuple); break; } - if (ctx.getFilterTuple() != null) { - ctx.getFilterTuple().reset(tuple); - memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.getFilterTuple(), - ctx.getFilterCmp()); - } + updateFilter(ctx, tuple); } private boolean insert(ITupleReference tuple, LSMBTreeOpContext ctx) throws HyracksDataException { @@ -747,7 +742,8 @@ ISearchOperationCallback searchCallback) { int numBloomFilterKeyFields = hasBloomFilter ? componentFactory.getBloomFilterKeyFields().length : 0; return new LSMBTreeOpContext(memoryComponents, insertLeafFrameFactory, deleteLeafFrameFactory, - modificationCallback, searchCallback, numBloomFilterKeyFields, btreeFields, filterFields, lsmHarness); + modificationCallback, searchCallback, numBloomFilterKeyFields, btreeFields, filterFields, lsmHarness, + getFilterCmpFactories()); } @Override diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java index 8b7a8a8..cf56246 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java @@ -31,7 +31,6 @@ import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory; import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback; import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation; -import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference; import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent; import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent; import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness; @@ -61,9 +60,6 @@ private final List<ILSMComponent> componentHolder; private final List<ILSMDiskComponent> componentsToBeMerged; private final List<ILSMDiskComponent> componentsToBeReplicated; - private final PermutingTupleReference indexTuple; - private final MultiComparator filterCmp; - private final PermutingTupleReference filterTuple; private final BTreeRangeSearchCursor memCursor; private final LSMBTreeCursorInitialState searchInitialState; private final LSMBTreePointSearchCursor insertSearchCursor; @@ -78,7 +74,8 @@ public LSMBTreeOpContext(List<ILSMMemoryComponent> mutableComponents, ITreeIndexFrameFactory insertLeafFrameFactory, ITreeIndexFrameFactory deleteLeafFrameFactory, IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback, int numBloomFilterKeyFields, int[] btreeFields, int[] filterFields, - ILSMHarness lsmHarness) { + ILSMHarness lsmHarness, IBinaryComparatorFactory[] filterCmpFactories) { + super(btreeFields, filterFields, filterCmpFactories); LSMBTreeMemoryComponent c = (LSMBTreeMemoryComponent) mutableComponents.get(0); IBinaryComparatorFactory cmpFactories[] = c.getBTree().getComparatorFactories(); if (cmpFactories[0] != null) { @@ -116,16 +113,6 @@ this.componentsToBeReplicated = new LinkedList<>(); this.modificationCallback = modificationCallback; this.searchCallback = searchCallback; - - if (filterFields != null) { - indexTuple = new PermutingTupleReference(btreeFields); - filterCmp = MultiComparator.create(c.getLSMComponentFilter().getFilterCmpFactories()); - filterTuple = new PermutingTupleReference(filterFields); - } else { - indexTuple = null; - filterCmp = null; - filterTuple = null; - } searchPredicate = new RangePredicate(null, null, true, true, getCmp(), getCmp()); memCursor = (insertLeafFrame != null) ? new BTreeRangeSearchCursor(insertLeafFrame, false) : null; searchInitialState = new LSMBTreeCursorInitialState(insertLeafFrameFactory, getCmp(), bloomFilterCmp, @@ -220,24 +207,12 @@ return componentsToBeReplicated; } - public MultiComparator getFilterCmp() { - return filterCmp; - } - - public PermutingTupleReference getIndexTuple() { - return indexTuple; - } - public BTree.BTreeAccessor getCurrentMutableBTreeAccessor() { return currentMutableBTreeAccessor; } public void setCurrentMutableBTreeAccessor(BTree.BTreeAccessor currentMutableBTreeAccessor) { this.currentMutableBTreeAccessor = currentMutableBTreeAccessor; - } - - public PermutingTupleReference getFilterTuple() { - return filterTuple; } public LSMBTreePointSearchCursor getInsertSearchCursor() { diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/IFrameOperationCallback.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/IFrameOperationCallback.java index de72690..96eb559 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/IFrameOperationCallback.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/IFrameOperationCallback.java @@ -29,9 +29,7 @@ * Called once processing the frame is done before calling nextFrame on the next IFrameWriter in * the pipeline * - * @param modified - * true if the index was modified during the processing of the frame, false otherwise * @throws HyracksDataException */ - void frameCompleted(boolean modified) throws HyracksDataException; + void frameCompleted() throws HyracksDataException; } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentFilterFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentFilterFactory.java index 64562bd..6284d4e 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentFilterFactory.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentFilterFactory.java @@ -18,8 +18,17 @@ */ package org.apache.hyracks.storage.am.lsm.common.api; -@FunctionalInterface +import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory; + public interface ILSMComponentFilterFactory { + /** + * @return an instance of ILSMComponentFilter + */ ILSMComponentFilter createFilter(); + /** + * @return the array of binary comparator factories for the filter + */ + IBinaryComparatorFactory[] getFilterCmpFactories(); + } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java index e57acab..f9a4e80 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java @@ -68,8 +68,7 @@ * @throws HyracksDataException * @throws IndexException */ - void search(ILSMIndexOperationContext ctx, IIndexCursor cursor, ISearchPredicate pred) - throws HyracksDataException; + void search(ILSMIndexOperationContext ctx, IIndexCursor cursor, ISearchPredicate pred) throws HyracksDataException; /** * End the search @@ -87,8 +86,7 @@ * @throws HyracksDataException * @throws IndexException */ - void scheduleMerge(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback) - throws HyracksDataException; + void scheduleMerge(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback) throws HyracksDataException; /** * Schedule full merge @@ -98,8 +96,7 @@ * @throws HyracksDataException * @throws IndexException */ - void scheduleFullMerge(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback) - throws HyracksDataException; + void scheduleFullMerge(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback) throws HyracksDataException; /** * Perform a merge operation @@ -198,4 +195,28 @@ */ void forceUpdateMeta(ILSMIndexOperationContext ctx, IValueReference key, IValueReference value) throws HyracksDataException; + + /** + * Enter components for the operation + * + * @param ctx + * @throws HyracksDataException + */ + void enter(ILSMIndexOperationContext ctx) throws HyracksDataException; + + /** + * Exits components for the operation + * + * @param ctx + * @throws HyracksDataException + */ + void exit(ILSMIndexOperationContext ctx) throws HyracksDataException; + + /** + * Update the filter with the value in the passed tuple + * + * @param ctx + * @throws HyracksDataException + */ + void updateFilter(ILSMIndexOperationContext ctx, ITupleReference tuple) throws HyracksDataException; } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java index 9fb48c4..e702ee5 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java @@ -130,4 +130,13 @@ * @return true if the index is durable. Otherwise false. */ boolean isDurable(); + + /** + * Update the filter with the passed tuple + * + * @param ictx + * @param tuple + * @throws HyracksDataException + */ + void updateFilter(ILSMIndexOperationContext ictx, ITupleReference tuple) throws HyracksDataException; } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexAccessor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexAccessor.java index 5473670..f846c80 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexAccessor.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexAccessor.java @@ -33,6 +33,17 @@ * concurrent operations). */ public interface ILSMIndexAccessor extends IIndexAccessor { + + /** + * Enter the memory component for modification + */ + void enter() throws HyracksDataException; + + /** + * Exit the memory component + */ + void exit() throws HyracksDataException; + /** * Schedule a flush operation * diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java index 8bdf5fa..5b0378a 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java @@ -21,9 +21,11 @@ import java.util.List; import org.apache.hyracks.storage.am.common.api.IIndexOperationContext; +import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference; import org.apache.hyracks.storage.common.IModificationOperationCallback; import org.apache.hyracks.storage.common.ISearchOperationCallback; import org.apache.hyracks.storage.common.ISearchPredicate; +import org.apache.hyracks.storage.common.MultiComparator; public interface ILSMIndexOperationContext extends IIndexOperationContext { List<ILSMComponent> getComponentHolder(); @@ -48,4 +50,10 @@ boolean isAccessingComponents(); void setAccessingComponents(boolean accessingComponents); + + PermutingTupleReference getIndexTuple(); + + PermutingTupleReference getFilterTuple(); + + MultiComparator getFilterCmp(); } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java index df42972..2112491 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java @@ -28,14 +28,17 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.io.IIOManager; import org.apache.hyracks.api.replication.IReplicationJob.ReplicationExecutionType; import org.apache.hyracks.api.replication.IReplicationJob.ReplicationOperation; +import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference; import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilter; import org.apache.hyracks.storage.am.common.api.ITreeIndex; import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent; import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.ComponentState; +import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilterFactory; import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilterFrameFactory; import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent; import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness; @@ -73,6 +76,7 @@ protected final double bloomFilterFalsePositiveRate; protected final ILSMComponentFilterFrameFactory filterFrameFactory; protected final LSMComponentFilterManager filterManager; + protected final ILSMComponentFilterFactory filterFactory; protected final int[] filterFields; protected final boolean durable; protected boolean isActivated; @@ -84,7 +88,7 @@ double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallback ioOpCallback, ILSMComponentFilterFrameFactory filterFrameFactory, LSMComponentFilterManager filterManager, - int[] filterFields, boolean durable) { + int[] filterFields, boolean durable, ILSMComponentFilterFactory filterFactory) { this.ioManager = ioManager; this.virtualBufferCaches = virtualBufferCaches; this.diskBufferCache = diskBufferCache; @@ -94,6 +98,7 @@ this.ioScheduler = ioScheduler; this.ioOpCallback = ioOpCallback; this.ioOpCallback.setNumOfMutableComponents(virtualBufferCaches.size()); + this.filterFactory = filterFactory; this.filterFrameFactory = filterFrameFactory; this.filterManager = filterManager; this.filterFields = filterFields; @@ -108,6 +113,10 @@ for (int i = 0; i < virtualBufferCaches.size(); i++) { flushRequests[i] = new AtomicBoolean(); } + } + + protected IBinaryComparatorFactory[] getFilterCmpFactories() { + return filterFactory == null ? null : filterFactory.getFilterCmpFactories(); } // The constructor used by external indexes @@ -132,6 +141,7 @@ memoryComponents = null; currentMutableComponentId = null; flushRequests = null; + filterFactory = null; filterFrameFactory = null; filterManager = null; filterFields = null; @@ -322,4 +332,13 @@ public int getNumOfFilterFields() { return filterFields == null ? 0 : filterFields.length; } + + @Override + public void updateFilter(ILSMIndexOperationContext ctx, ITupleReference tuple) throws HyracksDataException { + if (ctx.getFilterTuple() != null) { + ctx.getFilterTuple().reset(tuple); + memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.getFilterTuple(), + ctx.getFilterCmp()); + } + } } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java index 3b907c3..c328ade 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java @@ -18,11 +18,30 @@ */ package org.apache.hyracks.storage.am.lsm.common.impls; +import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory; +import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference; import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext; +import org.apache.hyracks.storage.common.MultiComparator; public abstract class AbstractLSMIndexOperationContext implements ILSMIndexOperationContext { - private boolean accessingComponents = false; + protected final PermutingTupleReference indexTuple; + protected final MultiComparator filterCmp; + protected final PermutingTupleReference filterTuple; + protected boolean accessingComponents = false; + + public AbstractLSMIndexOperationContext(int[] treeFields, int[] filterFields, + IBinaryComparatorFactory[] filterCmpFactories) { + if (filterFields != null) { + indexTuple = new PermutingTupleReference(treeFields); + filterCmp = MultiComparator.create(filterCmpFactories); + filterTuple = new PermutingTupleReference(filterFields); + } else { + indexTuple = null; + filterCmp = null; + filterTuple = null; + } + } @Override public boolean isAccessingComponents() { @@ -38,4 +57,19 @@ public void reset() { accessingComponents = false; } + + @Override + public final PermutingTupleReference getIndexTuple() { + return indexTuple; + } + + @Override + public final PermutingTupleReference getFilterTuple() { + return filterTuple; + } + + @Override + public final MultiComparator getFilterCmp() { + return filterCmp; + } } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFilterFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFilterFactory.java index 46a629a..390321f 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFilterFactory.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFilterFactory.java @@ -38,4 +38,9 @@ public ILSMComponentFilter createFilter() { return new LSMComponentFilter(tupleWriterFactory.createTupleWriter(), filterCmpFactories); } + + @Override + public IBinaryComparatorFactory[] getFilterCmpFactories() { + return filterCmpFactories; + } } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java index 94fd2bb..4ba36e5 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java @@ -376,6 +376,37 @@ } } + @Override + public void updateFilter(ILSMIndexOperationContext ctx, ITupleReference tuple) throws HyracksDataException { + if (!lsmIndex.isMemoryComponentsAllocated()) { + lsmIndex.allocateMemoryComponents(); + } + lsmIndex.updateFilter(ctx, tuple); + } + + @Override + public void enter(ILSMIndexOperationContext ctx) throws HyracksDataException { + if (!lsmIndex.isMemoryComponentsAllocated()) { + lsmIndex.allocateMemoryComponents(); + } + getAndEnterComponents(ctx, LSMOperationType.MODIFICATION, false); + } + + @Override + public void exit(ILSMIndexOperationContext ctx) throws HyracksDataException { + getAndExitComponentsAndComplete(ctx, LSMOperationType.MODIFICATION); + } + + private void getAndExitComponentsAndComplete(ILSMIndexOperationContext ctx, LSMOperationType op) + throws HyracksDataException { + validateOperationEnterComponentsState(ctx); + synchronized (opTracker) { + lsmIndex.getOperationalComponents(ctx); + ctx.setAccessingComponents(true); + exitAndComplete(ctx, op); + } + } + private void exitAndComplete(ILSMIndexOperationContext ctx, LSMOperationType op) throws HyracksDataException { try { exitComponents(ctx, op, null, false); diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java index f117e63..5c56f73 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java @@ -174,14 +174,31 @@ @Override public void updateMeta(IValueReference key, IValueReference value) throws HyracksDataException { // a hack because delete only gets the memory component - ctx.setOperation(IndexOperation.DELETE); + ctx.setOperation(IndexOperation.UPSERT); lsmHarness.updateMeta(ctx, key, value); } @Override public void forceUpdateMeta(IValueReference key, IValueReference value) throws HyracksDataException { // a hack because delete only gets the memory component - ctx.setOperation(IndexOperation.DELETE); + ctx.setOperation(IndexOperation.UPSERT); lsmHarness.forceUpdateMeta(ctx, key, value); } + + @Override + public void enter() throws HyracksDataException { + ctx.setOperation(IndexOperation.UPSERT); + lsmHarness.enter(ctx); + } + + @Override + public void exit() throws HyracksDataException { + ctx.setOperation(IndexOperation.UPSERT); + lsmHarness.exit(ctx); + } + + public void updateFilter(ITupleReference tuple) throws HyracksDataException { + ctx.setOperation(IndexOperation.UPSERT); + lsmHarness.updateFilter(ctx, tuple); + } } 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 3d7b716..e31ef90 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 @@ -120,8 +120,7 @@ boolean durable) throws HyracksDataException { super(ioManager, virtualBufferCaches, diskInvIndexFactory.getBufferCache(), fileManager, diskFileMapProvider, bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler, ioOpCallback, filterFrameFactory, - filterManager, filterFields, durable); - + filterManager, filterFields, durable, filterFactory); this.tokenizerFactory = tokenizerFactory; this.invListTypeTraits = invListTypeTraits; this.invListCmpFactories = invListCmpFactories; @@ -358,11 +357,7 @@ throw new UnsupportedOperationException("Operation " + ctx.getOperation() + " not supported."); } } - if (ctx.getFilterTuple() != null) { - ctx.getFilterTuple().reset(tuple); - memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.getFilterTuple(), - ctx.getFilterCmp()); - } + updateFilter(ctx, tuple); } @Override @@ -817,7 +812,7 @@ private LSMInvertedIndexOpContext createOpContext(IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback) throws HyracksDataException { return new LSMInvertedIndexOpContext(memoryComponents, modificationCallback, searchCallback, - invertedIndexFieldsForNonBulkLoadOps, filterFieldsForNonBulkLoadOps); + invertedIndexFieldsForNonBulkLoadOps, filterFieldsForNonBulkLoadOps, getFilterCmpFactories()); } @Override diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexAccessor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexAccessor.java index edae439..80607f7 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexAccessor.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexAccessor.java @@ -203,4 +203,21 @@ throw new UnsupportedOperationException("Upsert not supported by lsm inverted index."); } + /** + * enter the memory component for modification + */ + @Override + public void enter() throws HyracksDataException { + ctx.setOperation(IndexOperation.UPSERT); + lsmHarness.enter(ctx); + } + + /** + * exit the memory component + */ + @Override + public void exit() throws HyracksDataException { + ctx.setOperation(IndexOperation.UPSERT); + lsmHarness.exit(ctx); + } } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java index 44c1c13..fec303b 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java @@ -22,6 +22,7 @@ import java.util.LinkedList; import java.util.List; +import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback; import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation; @@ -35,7 +36,6 @@ import org.apache.hyracks.storage.common.IModificationOperationCallback; import org.apache.hyracks.storage.common.ISearchOperationCallback; import org.apache.hyracks.storage.common.ISearchPredicate; -import org.apache.hyracks.storage.common.MultiComparator; public class LSMInvertedIndexOpContext extends AbstractLSMIndexOperationContext { @@ -60,15 +60,13 @@ private IInvertedIndexAccessor currentMutableInvIndexAccessors; private IIndexAccessor currentDeletedKeysBTreeAccessors; - private final PermutingTupleReference indexTuple; - private final MultiComparator filterCmp; - private final PermutingTupleReference filterTuple; - private ISearchPredicate searchPredicate; public LSMInvertedIndexOpContext(List<ILSMMemoryComponent> mutableComponents, IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback, - int[] invertedIndexFields, int[] filterFields) throws HyracksDataException { + int[] invertedIndexFields, int[] filterFields, IBinaryComparatorFactory[] filterComparatorFactories) + throws HyracksDataException { + super(invertedIndexFields, filterFields, filterComparatorFactories); this.componentHolder = new LinkedList<>(); this.componentsToBeMerged = new LinkedList<>(); this.componentsToBeReplicated = new LinkedList<>(); @@ -87,8 +85,6 @@ .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE); } - assert mutableComponents.size() > 0; - // Project away the document fields, leaving only the key fields. LSMInvertedIndexMemoryComponent c = (LSMInvertedIndexMemoryComponent) mutableComponents.get(0); int numKeyFields = c.getInvIndex().getInvListTypeTraits().length; @@ -97,16 +93,6 @@ keyFieldPermutation[i] = NUM_DOCUMENT_FIELDS + i; } keysOnlyTuple = new PermutingTupleReference(keyFieldPermutation); - - if (filterFields != null) { - indexTuple = new PermutingTupleReference(invertedIndexFields); - filterCmp = MultiComparator.create(c.getLSMComponentFilter().getFilterCmpFactories()); - filterTuple = new PermutingTupleReference(filterFields); - } else { - indexTuple = null; - filterCmp = null; - filterTuple = null; - } } @Override @@ -170,14 +156,6 @@ return componentsToBeReplicated; } - public MultiComparator getFilterCmp() { - return filterCmp; - } - - public PermutingTupleReference getIndexTuple() { - return indexTuple; - } - public IInvertedIndexAccessor getCurrentMutableInvIndexAccessors() { return currentMutableInvIndexAccessors; } @@ -188,9 +166,5 @@ public IIndexAccessor getCurrentDeletedKeysBTreeAccessors() { return currentDeletedKeysBTreeAccessors; - } - - public PermutingTupleReference getFilterTuple() { - return filterTuple; } } diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java index 9c56dec..d89f64a 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java @@ -97,7 +97,7 @@ throws HyracksDataException { super(ioManager, virtualBufferCaches, diskBufferCache, fileManager, diskFileMapProvider, bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler, ioOpCallback, filterFrameFactory, - filterManager, filterFields, durable); + filterManager, filterFields, durable, filterFactory); int i = 0; for (IVirtualBufferCache virtualBufferCache : virtualBufferCaches) { RTree memRTree = new RTree(virtualBufferCache, virtualBufferCache.getFileMapProvider(), @@ -373,18 +373,14 @@ } } } - if (ctx.getFilterTuple() != null) { - ctx.getFilterTuple().reset(tuple); - memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.getFilterTuple(), - ctx.getFilterCmp()); - } + updateFilter(ctx, tuple); } protected LSMRTreeOpContext createOpContext(IModificationOperationCallback modCallback, ISearchOperationCallback searchCallback) { return new LSMRTreeOpContext(memoryComponents, rtreeLeafFrameFactory, rtreeInteriorFrameFactory, btreeLeafFrameFactory, modCallback, searchCallback, rtreeFields, filterFields, lsmHarness, - comparatorFields, linearizerArray); + comparatorFields, linearizerArray, getFilterCmpFactories()); } @Override diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java index 76cf339..d0fac63 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java @@ -50,6 +50,7 @@ int targetIndexVersion, ILSMHarness lsmHarness, int[] comparatorFields, IBinaryComparatorFactory[] linearizerArray, ITreeIndexFrameFactory rtreeLeafFrameFactory, ITreeIndexFrameFactory rtreeInteriorFrameFactory, ITreeIndexFrameFactory btreeLeafFrameFactory) { + super(null, null, null); this.componentHolder = new LinkedList<>(); this.componentsToBeMerged = new LinkedList<>(); this.componentsToBeReplicated = new LinkedList<>(); 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 8882639..7ad115d 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 @@ -503,11 +503,7 @@ } } } - if (ctx.getFilterTuple() != null) { - ctx.getFilterTuple().reset(tuple); - memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.getFilterTuple(), - ctx.getFilterCmp()); - } + updateFilter(ctx, tuple); } public class LSMRTreeBulkLoader implements IIndexBulkLoader { diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java index 83ca78c..0061ffe 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java @@ -28,7 +28,6 @@ import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory; import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback; import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation; -import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference; import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent; import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent; import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness; @@ -59,9 +58,6 @@ private final List<ILSMDiskComponent> componentsToBeReplicated; private IModificationOperationCallback modificationCallback; private ISearchOperationCallback searchCallback; - private final PermutingTupleReference indexTuple; - private final MultiComparator filterCmp; - private final PermutingTupleReference filterTuple; private ISearchPredicate searchPredicate; private LSMRTreeCursorInitialState searchInitialState; @@ -69,7 +65,8 @@ ITreeIndexFrameFactory rtreeInteriorFrameFactory, ITreeIndexFrameFactory btreeLeafFrameFactory, IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback, int[] rtreeFields, int[] filterFields, ILSMHarness lsmHarness, int[] comparatorFields, - IBinaryComparatorFactory[] linearizerArray) { + IBinaryComparatorFactory[] linearizerArray, IBinaryComparatorFactory[] filterComparatorFactories) { + super(rtreeFields, filterFields, filterComparatorFactories); mutableRTreeAccessors = new RTree.RTreeAccessor[mutableComponents.size()]; mutableBTreeAccessors = new BTree.BTreeAccessor[mutableComponents.size()]; rtreeOpContexts = new RTreeOpContext[mutableComponents.size()]; @@ -87,8 +84,6 @@ rtreeOpContexts[i] = mutableRTreeAccessors[i].getOpContext(); btreeOpContexts[i] = mutableBTreeAccessors[i].getOpContext(); } - - assert mutableComponents.size() > 0; currentRTreeOpContext = rtreeOpContexts[0]; currentBTreeOpContext = btreeOpContexts[0]; this.componentHolder = new LinkedList<>(); @@ -96,16 +91,6 @@ this.componentsToBeReplicated = new LinkedList<>(); this.modificationCallback = modificationCallback; this.searchCallback = searchCallback; - - if (filterFields != null) { - indexTuple = new PermutingTupleReference(rtreeFields); - filterCmp = MultiComparator.create(c.getLSMComponentFilter().getFilterCmpFactories()); - filterTuple = new PermutingTupleReference(filterFields); - } else { - indexTuple = null; - filterCmp = null; - filterTuple = null; - } searchInitialState = new LSMRTreeCursorInitialState(rtreeLeafFrameFactory, rtreeInteriorFrameFactory, btreeLeafFrameFactory, getBTreeMultiComparator(), lsmHarness, comparatorFields, linearizerArray, searchCallback, componentHolder); @@ -181,16 +166,8 @@ return componentsToBeReplicated; } - public MultiComparator getFilterCmp() { - return filterCmp; - } - public LSMRTreeCursorInitialState getSearchInitialState() { return searchInitialState; - } - - public PermutingTupleReference getIndexTuple() { - return indexTuple; } public RTree.RTreeAccessor getCurrentMutableRTreeAccessor() { @@ -199,10 +176,6 @@ public BTree.BTreeAccessor getCurrentMutableBTreeAccessor() { return currentMutableBTreeAccessor; - } - - public PermutingTupleReference getFilterTuple() { - return filterTuple; } public RTreeOpContext getCurrentRTreeOpContext() { -- To view, visit https://asterix-gerrit.ics.uci.edu/1759 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic702d6e1984ea33408c360b6f522f493848cbd87 Gerrit-PatchSet: 1 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: abdullah alamoudi <bamou...@gmail.com>