[ASTERIXDB-2467][STO] Fix locking protocol with bad tuples
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- The current locking protocol is not correct when there are bad tuples,
e.g., duplicates. When locking fails, the write must push partial frames
so that the previous acquired locks are released. However, if there are
bad tuples in the frame, after bad tuples are removed from the frame, the
state of pushed partial frames will be completely lost.
Change-Id: I86baa1f21ef7390777c8e2b0ce226095528e7f18
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3003
Reviewed-by: Xikui Wang <xkkwww@gmail.com>
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
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 1401c0a..5e4b5a1 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
@@ -80,6 +80,10 @@
@Override
public void open() throws HyracksDataException {
+ i = 0;
+ currentTupleIdx = 0;
+ lastFlushedTupleIdx = 0;
+ flushedPartialTuples = false;
accessor = new FrameTupleAccessor(inputRecDesc);
writeBuffer = new VSizeFrame(ctx);
appender = new FrameTupleAppender(writeBuffer);
@@ -109,10 +113,6 @@
@Override
public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
- currentTupleIdx = 0;
- lastFlushedTupleIdx = 0;
- flushedPartialTuples = false;
-
accessor.reset(buffer);
ILSMIndexAccessor lsmAccessor = (ILSMIndexAccessor) indexAccessor;
int tupleCount = accessor.getTupleCount();
@@ -164,6 +164,9 @@
FrameUtils.flushFrame(writeBuffer.getBuffer(), writer);
}
i = 0;
+ currentTupleIdx = 0;
+ lastFlushedTupleIdx = 0;
+ flushedPartialTuples = false;
}
/**