instrumented btree and insertupdatedelete operator with modification opcallback calls
git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@1572 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
index b9a3863..7dcfce2 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
@@ -257,10 +257,12 @@
}
private void insert(ITupleReference tuple, BTreeOpContext ctx) throws HyracksDataException, TreeIndexException {
+ ctx.modificationCallback.commence(tuple);
insertUpdateOrDelete(tuple, ctx);
}
private void upsert(ITupleReference tuple, BTreeOpContext ctx) throws HyracksDataException, TreeIndexException {
+ ctx.modificationCallback.commence(tuple);
insertUpdateOrDelete(tuple, ctx);
}
@@ -271,10 +273,12 @@
if (fieldCount == ctx.cmp.getKeyFieldCount()) {
throw new BTreeNotUpdateableException("Cannot perform updates when the entire tuple forms the key.");
}
+ ctx.modificationCallback.commence(tuple);
insertUpdateOrDelete(tuple, ctx);
}
private void delete(ITupleReference tuple, BTreeOpContext ctx) throws HyracksDataException, TreeIndexException {
+ ctx.modificationCallback.commence(tuple);
insertUpdateOrDelete(tuple, ctx);
}
@@ -284,6 +288,7 @@
FrameOpSpaceStatus spaceStatus = ctx.leafFrame.hasSpaceInsert(tuple);
switch (spaceStatus) {
case SUFFICIENT_CONTIGUOUS_SPACE: {
+ ctx.modificationCallback.found(null);
ctx.leafFrame.insert(tuple, targetTupleIndex);
ctx.splitKey.reset();
break;
@@ -293,6 +298,7 @@
if (slotsChanged) {
targetTupleIndex = ctx.leafFrame.findInsertTupleIndex(tuple);
}
+ ctx.modificationCallback.found(null);
ctx.leafFrame.insert(tuple, targetTupleIndex);
ctx.splitKey.reset();
break;
@@ -306,6 +312,7 @@
spaceStatus = ctx.leafFrame.hasSpaceInsert(tuple);
}
if (spaceStatus == FrameOpSpaceStatus.SUFFICIENT_CONTIGUOUS_SPACE) {
+ ctx.modificationCallback.found(null);
ctx.leafFrame.insert(tuple, targetTupleIndex);
ctx.splitKey.reset();
} else {
@@ -338,7 +345,11 @@
// Perform an update (delete + insert) if the updateTupleIndex != -1
if (updateTupleIndex != -1) {
+ ITupleReference beforeTuple = ctx.leafFrame.getUpsertBeforeTuple(tuple, updateTupleIndex);
+ ctx.modificationCallback.found(beforeTuple);
ctx.leafFrame.delete(tuple, updateTupleIndex);
+ } else {
+ ctx.modificationCallback.found(null);
}
ctx.leafFrame.split(rightFrame, tuple, ctx.splitKey);
@@ -371,20 +382,24 @@
private boolean updateLeaf(ITupleReference tuple, int oldTupleIndex, int pageId, BTreeOpContext ctx)
throws Exception {
FrameOpSpaceStatus spaceStatus = ctx.leafFrame.hasSpaceUpdate(tuple, oldTupleIndex);
+ ITupleReference beforeTuple = ctx.leafFrame.getUpsertBeforeTuple(tuple, oldTupleIndex);
boolean restartOp = false;
switch (spaceStatus) {
case SUFFICIENT_INPLACE_SPACE: {
+ ctx.modificationCallback.found(beforeTuple);
ctx.leafFrame.update(tuple, oldTupleIndex, true);
ctx.splitKey.reset();
break;
}
case SUFFICIENT_CONTIGUOUS_SPACE: {
+ ctx.modificationCallback.found(beforeTuple);
ctx.leafFrame.update(tuple, oldTupleIndex, false);
ctx.splitKey.reset();
break;
}
case SUFFICIENT_SPACE: {
// Delete the old tuple, compact the frame, and insert the new tuple.
+ ctx.modificationCallback.found(beforeTuple);
ctx.leafFrame.delete(tuple, oldTupleIndex);
ctx.leafFrame.compact();
int targetTupleIndex = ctx.leafFrame.findInsertTupleIndex(tuple);
@@ -475,6 +490,8 @@
throw new BTreeNonExistentKeyException("Trying to delete a tuple with a nonexistent key in leaf node.");
}
int tupleIndex = ctx.leafFrame.findDeleteTupleIndex(tuple);
+ ITupleReference beforeTuple = ctx.leafFrame.getUpsertBeforeTuple(tuple, tupleIndex);
+ ctx.modificationCallback.found(beforeTuple);
ctx.leafFrame.delete(tuple, tupleIndex);
return false;
}
@@ -878,9 +895,10 @@
}
}
- private BTreeOpContext createOpContext() {
+ private BTreeOpContext createOpContext(IModificationOperationCallback modificationCallback,
+ ISearchOperationCallback searchCallback) {
return new BTreeOpContext(leafFrameFactory, interiorFrameFactory, freePageManager.getMetaDataFrameFactory()
- .createFrame(), cmpFactories);
+ .createFrame(), cmpFactories, modificationCallback, searchCallback);
}
public ITreeIndexFrameFactory getInteriorFrameFactory() {
@@ -1007,8 +1025,9 @@
}
@Override
- public ITreeIndexAccessor createAccessor(IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback) {
- return new BTreeAccessor(this);
+ public ITreeIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
+ ISearchOperationCallback searchCallback) {
+ return new BTreeAccessor(this, modificationCallback, searchCallback);
}
// TODO: Class should be private. But currently we need to expose the
@@ -1017,9 +1036,10 @@
private BTree btree;
private BTreeOpContext ctx;
- public BTreeAccessor(BTree btree) {
+ public BTreeAccessor(BTree btree, IModificationOperationCallback modificationCalback,
+ ISearchOperationCallback searchCallback) {
this.btree = btree;
- this.ctx = btree.createOpContext();
+ this.ctx = btree.createOpContext(modificationCalback, searchCallback);
}
@Override
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java
index 23a14eb..d19b083 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTreeOpContext.java
@@ -19,6 +19,8 @@
import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
import edu.uci.ics.hyracks.storage.am.common.api.IIndexOpContext;
+import edu.uci.ics.hyracks.storage.am.common.api.IModificationOperationCallback;
+import edu.uci.ics.hyracks.storage.am.common.api.ISearchOperationCallback;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexCursor;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexMetaDataFrame;
@@ -39,15 +41,18 @@
public ITreeIndexCursor cursor;
public BTreeCursorInitialState cursorInitialState;
public RangePredicate pred;
- public BTreeSplitKey splitKey;
+ public BTreeSplitKey splitKey;
public LongArrayList pageLsns;
public IntArrayList smPages;
public IntArrayList freePages;
public int opRestarts = 0;
public boolean exceptionHandled;
-
+ public IModificationOperationCallback modificationCallback;
+ public ISearchOperationCallback searchCallback;
+
public BTreeOpContext(ITreeIndexFrameFactory leafFrameFactory, ITreeIndexFrameFactory interiorFrameFactory,
- ITreeIndexMetaDataFrame metaFrame, IBinaryComparatorFactory[] cmpFactories) {
+ ITreeIndexMetaDataFrame metaFrame, IBinaryComparatorFactory[] cmpFactories,
+ IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback) {
this.cmp = MultiComparator.create(cmpFactories);
this.leafFrameFactory = leafFrameFactory;
this.leafFrame = (IBTreeLeafFrame) leafFrameFactory.createFrame();
@@ -61,6 +66,8 @@
}
this.metaFrame = metaFrame;
this.pageLsns = new LongArrayList(INIT_ARRAYLIST_SIZE, INIT_ARRAYLIST_SIZE);
+ this.modificationCallback = modificationCallback;
+ this.searchCallback = searchCallback;
}
public void reset() {
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexInsertUpdateDeleteOperatorNodePushable.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexInsertUpdateDeleteOperatorNodePushable.java
index a57cef7..07d63d8 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexInsertUpdateDeleteOperatorNodePushable.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexInsertUpdateDeleteOperatorNodePushable.java
@@ -25,6 +25,7 @@
import edu.uci.ics.hyracks.dataflow.common.data.accessors.FrameTupleReference;
import edu.uci.ics.hyracks.dataflow.std.base.AbstractUnaryInputUnaryOutputOperatorNodePushable;
import edu.uci.ics.hyracks.storage.am.common.api.IIndexAccessor;
+import edu.uci.ics.hyracks.storage.am.common.api.IModificationOperationCallback;
import edu.uci.ics.hyracks.storage.am.common.api.IOperationCallbackProvider;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndex;
import edu.uci.ics.hyracks.storage.am.common.api.ITupleFilter;
@@ -92,6 +93,9 @@
}
}
tuple.reset(accessor, i);
+ IModificationOperationCallback modificationCallback = callbackProvider
+ .getModificationOperationCallback();
+ modificationCallback.before(tuple);
switch (op) {
case INSERT: {
indexAccessor.insert(tuple);
diff --git a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
index 547cf2d..2f253e9 100644
--- a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
+++ b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
@@ -287,7 +287,7 @@
}
public ITreeIndex merge(List<Object> mergedComponents) throws HyracksDataException, IndexException {
- LSMBTreeOpContext ctx = createOpContext();
+ LSMBTreeOpContext ctx = createOpContext(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
ITreeIndexCursor cursor = new LSMBTreeRangeSearchCursor();
RangePredicate rangePred = new RangePredicate(null, null, true, true, null, null);
// Ordered scan, ignoring the in-memory BTree.
@@ -427,14 +427,16 @@
return cmpFactories;
}
- public LSMBTreeOpContext createOpContext() {
- return new LSMBTreeOpContext(memBTree, insertLeafFrameFactory, deleteLeafFrameFactory);
+ public LSMBTreeOpContext createOpContext(IModificationOperationCallback modificationCallback,
+ ISearchOperationCallback searchCallback) {
+ return new LSMBTreeOpContext(memBTree, insertLeafFrameFactory, deleteLeafFrameFactory, modificationCallback,
+ searchCallback);
}
@Override
public IIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
ISearchOperationCallback searchCallback) {
- return new LSMBTreeIndexAccessor(lsmHarness, createOpContext());
+ return new LSMBTreeIndexAccessor(lsmHarness, createOpContext(modificationCallback, searchCallback));
}
public class LSMBTreeIndexAccessor extends LSMTreeIndexAccessor {
diff --git a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java
index d94dc52..ca281ed 100644
--- a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java
+++ b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java
@@ -19,8 +19,9 @@
import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
import edu.uci.ics.hyracks.storage.am.btree.impls.BTreeOpContext;
import edu.uci.ics.hyracks.storage.am.common.api.IIndexOpContext;
+import edu.uci.ics.hyracks.storage.am.common.api.IModificationOperationCallback;
+import edu.uci.ics.hyracks.storage.am.common.api.ISearchOperationCallback;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
-import edu.uci.ics.hyracks.storage.am.common.impls.NoOpOperationCallback;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOp;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
@@ -35,9 +36,12 @@
public BTreeOpContext memBTreeOpCtx;
public IndexOp op;
public final MultiComparator cmp;
+ public final IModificationOperationCallback modificationCallback;
+ public final ISearchOperationCallback searchCallback;
public LSMBTreeOpContext(BTree memBTree, ITreeIndexFrameFactory insertLeafFrameFactory,
- ITreeIndexFrameFactory deleteLeafFrameFactory) {
+ ITreeIndexFrameFactory deleteLeafFrameFactory, IModificationOperationCallback modificationCallback,
+ ISearchOperationCallback searchCallback) {
this.cmp = MultiComparator.create(memBTree.getComparatorFactories());
this.memBTree = memBTree;
this.insertLeafFrameFactory = insertLeafFrameFactory;
@@ -50,6 +54,8 @@
if (deleteLeafFrame != null) {
deleteLeafFrame.setMultiComparator(cmp);
}
+ this.modificationCallback = modificationCallback;
+ this.searchCallback = searchCallback;
}
@Override
@@ -81,8 +87,7 @@
private void setMemBTreeAccessor() {
if (memBTreeAccessor == null) {
- memBTreeAccessor = (BTree.BTreeAccessor) memBTree.createAccessor(NoOpOperationCallback.INSTANCE,
- NoOpOperationCallback.INSTANCE);
+ memBTreeAccessor = (BTree.BTreeAccessor) memBTree.createAccessor(modificationCallback, searchCallback);
memBTreeOpCtx = memBTreeAccessor.getOpContext();
}
}
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java
index a5e799f..8cead2a 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java
@@ -21,6 +21,7 @@
import edu.uci.ics.hyracks.storage.am.common.api.IIndexOpContext;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexMetaDataFrame;
+import edu.uci.ics.hyracks.storage.am.common.impls.NoOpOperationCallback;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOp;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
import edu.uci.ics.hyracks.storage.am.rtree.api.IRTreeInteriorFrame;
@@ -35,7 +36,7 @@
public final RTree.RTreeAccessor memRTreeAccessor;
public final BTree.BTreeAccessor memBTreeAccessor;
private IndexOp op;
-
+
public LSMRTreeOpContext(RTree.RTreeAccessor memRtreeAccessor, IRTreeLeafFrame rtreeLeafFrame,
IRTreeInteriorFrame rtreeInteriorFrame, ITreeIndexMetaDataFrame rtreeMetaFrame, int rTreeHeightHint,
BTree.BTreeAccessor memBtreeAccessor, ITreeIndexFrameFactory btreeLeafFrameFactory,
@@ -43,9 +44,10 @@
IBinaryComparatorFactory[] rtreeCmpFactories, IBinaryComparatorFactory[] btreeCmpFactories) {
this.memRTreeAccessor = memRtreeAccessor;
this.memBTreeAccessor = memBtreeAccessor;
- this.rtreeOpContext = new RTreeOpContext(rtreeLeafFrame, rtreeInteriorFrame, rtreeMetaFrame, rtreeCmpFactories, rTreeHeightHint);
+ this.rtreeOpContext = new RTreeOpContext(rtreeLeafFrame, rtreeInteriorFrame, rtreeMetaFrame, rtreeCmpFactories,
+ rTreeHeightHint);
this.btreeOpContext = new BTreeOpContext(btreeLeafFrameFactory, btreeInteriorFrameFactory, btreeMetaFrame,
- btreeCmpFactories);
+ btreeCmpFactories, NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
}
public void reset(IndexOp newOp) {
@@ -63,10 +65,10 @@
}
public IndexOp getIndexOp() {
- return op;
+ return op;
}
-
+
public MultiComparator getBTreeMultiComparator() {
- return btreeOpContext.cmp;
+ return btreeOpContext.cmp;
}
}
\ No newline at end of file