>From Peeyush Gupta <[email protected]>:
Peeyush Gupta has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20652?usp=email )
Change subject: [NO ISSUE][*DB][STO] Fix IndexOutOfBoundsException when
flushPtr is 0
......................................................................
[NO ISSUE][*DB][STO] Fix IndexOutOfBoundsException when flushPtr is 0
- user model changes: no
- storage format changes: no
- interface changes: no
Ext-ref: MB-69729
Change-Id: I8a3761d0ab3759694af51f77bf8bfa9cbbcb8d1d
---
A
asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan.rej
A
asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan.rej
M
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
3 files changed, 265 insertions(+), 1 deletion(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/52/20652/1
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan.rej
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan.rej
new file mode 100644
index 0000000..fa37eb9
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan.rej
@@ -0,0 +1,118 @@
+diff
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query8.plan
(rejected hunks)
+@@ -9,63 +9,65 @@
+ project ([$$D2, $$D1, $$50])
+ -- STREAM_PROJECT |PARTITIONED|
+ subplan {
+- aggregate [$$50] <- [non-empty-stream()]
++ aggregate [$$50] <- [non-empty-stream()] [cardinality:
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- AGGREGATE |LOCAL|
+- select (and(eq($$69, to-bigint($$70)), eq($$67,
to-bigint($$68))))
++ select (and(eq($$69, to-bigint($$70)), eq($$67,
to-bigint($$68)))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost:
0.0]
+ -- STREAM_SELECT |LOCAL|
+- assign [$$69, $$67] <- [$$D1I.getField("field2"),
$$D1I.getField("field3")] project: [$$70, $$68, $$69, $$67]
++ assign [$$69, $$67] <- [$$D1I.getField("field2"),
$$D1I.getField("field3")] project: [$$70, $$68, $$69, $$67] [cardinality: 0.0,
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ASSIGN |LOCAL|
+- unnest $$D1I <- scan-collection($$66) project:
[$$70, $$68, $$D1I]
++ unnest $$D1I <- scan-collection($$66) project:
[$$70, $$68, $$D1I] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost:
0.0]
+ -- UNNEST |LOCAL|
+- project ([$$70, $$68, $$66])
++ project ([$$70, $$68, $$66]) [cardinality: 0.0,
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_PROJECT |LOCAL|
+- nested tuple source
++ nested tuple source [cardinality: 0.0,
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- SUBPLAN |PARTITIONED|
+- assign [$$66] <- [$$D1.getField("items")]
+- -- ASSIGN |PARTITIONED|
+- project ([$$D2, $$70, $$68, $$D1])
+- -- STREAM_PROJECT |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- unnest-map [$$59, $$D1] <- index-search("Dataset1", 0,
"Default", "TestDataverse", "Dataset1", true, false, 1, $$77, 1, $$77, true,
true, true)
+- -- BTREE_SEARCH |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- project ([$$77, $$D2, $$70, $$68])
+- -- STREAM_PROJECT |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- distinct ([$$77, $$78])
+- -- PRE_SORTED_DISTINCT_BY |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- order (ASC, $$77) (ASC, $$78)
+- -- STABLE_SORT [$$77(ASC), $$78(ASC)]
|PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- project ([$$D2, $$70, $$68, $$77, $$78])
+- -- STREAM_PROJECT |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- unnest-map [$$73, $$74, $$75, $$76,
$$77] <- index-search("d1Idx", 0, "Default", "TestDataverse", "Dataset1", true,
true, 4, $$61, $$71, $$72, $$63, 4, $$61, $$71, $$72, $$63, true, true, true)
+- -- BTREE_SEARCH |PARTITIONED|
+- exchange
+- -- BROADCAST_EXCHANGE |PARTITIONED|
+- running-aggregate [$$78] <-
[create-query-uid()]
+- -- RUNNING_AGGREGATE |PARTITIONED|
+- assign [$$72, $$71] <-
[to-bigint($$68), to-bigint($$70)]
+- -- ASSIGN |PARTITIONED|
+- assign [$$63, $$61, $$70, $$68]
<- [to-bigint($$D2.getField("field4")), to-bigint($$D2.getField("field1")),
$$D2.getField("field2"), $$D2.getField("field3")]
++ select (and(eq($$D1.getField("field4"), $$63),
eq($$D1.getField("field1"), $$61))) project: [$$D2, $$D1, $$70, $$68, $$66]
++ -- STREAM_SELECT |PARTITIONED|
++ assign [$$66] <- [$$D1.getField("items")]
++ -- ASSIGN |PARTITIONED|
++ project ([$$D2, $$70, $$68, $$63, $$61, $$D1])
++ -- STREAM_PROJECT |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ unnest-map [$$59, $$D1] <- index-search("Dataset1", 0,
"Default", "TestDataverse", "Dataset1", true, false, 1, $$77, 1, $$77, true,
true, true)
++ -- BTREE_SEARCH |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ project ([$$77, $$D2, $$70, $$68, $$63, $$61])
++ -- STREAM_PROJECT |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ distinct ([$$77, $$78])
++ -- PRE_SORTED_DISTINCT_BY |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ order (ASC, $$77) (ASC, $$78)
++ -- STABLE_SORT [$$77(ASC), $$78(ASC)]
|PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ project ([$$D2, $$70, $$68, $$63, $$61,
$$77, $$78])
++ -- STREAM_PROJECT |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ unnest-map [$$73, $$74, $$75, $$76,
$$77] <- index-search("d1Idx", 0, "Default", "TestDataverse", "Dataset1", true,
true, 4, $$61, $$71, $$72, $$63, 4, $$61, $$71, $$72, $$63, true, true, true)
++ -- BTREE_SEARCH |PARTITIONED|
++ exchange
++ -- BROADCAST_EXCHANGE |PARTITIONED|
++ running-aggregate [$$78] <-
[create-query-uid()]
++ -- RUNNING_AGGREGATE
|PARTITIONED|
++ assign [$$72, $$71] <-
[to-bigint($$68), to-bigint($$70)]
+ -- ASSIGN |PARTITIONED|
+- project ([$$D2])
+- -- STREAM_PROJECT
|PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+- data-scan []<-[$$58,
$$D2] <- TestDataverse.Dataset2
+- -- DATASOURCE_SCAN
|PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+- empty-tuple-source
+- -- EMPTY_TUPLE_SOURCE
|PARTITIONED|
++ assign [$$63, $$61, $$70,
$$68] <- [to-bigint($$D2.getField("field4")),
to-bigint($$D2.getField("field1")), $$D2.getField("field2"),
$$D2.getField("field3")]
++ -- ASSIGN |PARTITIONED|
++ project ([$$D2])
++ -- STREAM_PROJECT
|PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
++ data-scan []<-[$$58,
$$D2] <- TestDataverse.Dataset2
++ -- DATASOURCE_SCAN
|PARTITIONED|
++ exchange
++ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ empty-tuple-source
++ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan.rej
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan.rej
new file mode 100644
index 0000000..2e6b131
--- /dev/null
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan.rej
@@ -0,0 +1,146 @@
+diff
a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/atomic-and-array-queries/query9.plan
(rejected hunks)
+@@ -9,82 +9,84 @@
+ project ([$$D2, $$D1, $$72])
+ -- STREAM_PROJECT |PARTITIONED|
+ subplan {
+- aggregate [$$72] <- [non-empty-stream()]
++ aggregate [$$72] <- [non-empty-stream()] [cardinality:
0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- AGGREGATE |LOCAL|
+- select ($$70)
++ select ($$70) [cardinality: 0.0, doc-size: 0.0,
op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_SELECT |LOCAL|
+- project ([$$70])
++ project ([$$70]) [cardinality: 0.0, doc-size: 0.0,
op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_PROJECT |LOCAL|
+ subplan {
+- aggregate [$$70] <- [non-empty-stream()]
++ aggregate [$$70] <- [non-empty-stream()]
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- AGGREGATE |LOCAL|
+- select (and(eq($$96, to-bigint($$97)),
eq($$94, to-bigint($$95)), eq($$92, to-bigint($$93))))
++ select (and(eq($$96, to-bigint($$97)),
eq($$94, to-bigint($$95)), eq($$92, to-bigint($$93)))) [cardinality: 0.0,
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_SELECT |LOCAL|
+- assign [$$96, $$94, $$92] <-
[$$DII.getField("field2"), $$DII.getField("field3"),
$$DII.getField("field3_notindexed")] project: [$$97, $$95, $$93, $$96, $$94,
$$92]
++ assign [$$96, $$94, $$92] <-
[$$DII.getField("field2"), $$DII.getField("field3"),
$$DII.getField("field3_notindexed")] project: [$$97, $$95, $$93, $$96, $$94,
$$92] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- ASSIGN |LOCAL|
+- unnest $$DII <-
scan-collection($$91) project: [$$97, $$95, $$93, $$DII]
++ unnest $$DII <-
scan-collection($$91) project: [$$97, $$95, $$93, $$DII] [cardinality: 0.0,
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- UNNEST |LOCAL|
+- project ([$$97, $$95, $$93, $$91])
++ project ([$$97, $$95, $$93,
$$91]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_PROJECT |LOCAL|
+- nested tuple source
++ nested tuple source
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+- }
++ } [cardinality: 0.0, doc-size: 0.0, op-cost:
0.0, total-cost: 0.0]
+ -- SUBPLAN |LOCAL|
+- select (eq($$89, to-bigint($$90))) project:
[$$97, $$95, $$93, $$91]
++ select (eq($$89, to-bigint($$90))) project:
[$$97, $$95, $$93, $$91] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0,
total-cost: 0.0]
+ -- STREAM_SELECT |LOCAL|
+- assign [$$91, $$89] <-
[$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")] project:
[$$97, $$95, $$93, $$90, $$91, $$89]
++ assign [$$91, $$89] <-
[$$DOI.getField("inner_items"), $$DOI.getField("field2_notindexed")] project:
[$$97, $$95, $$93, $$90, $$91, $$89] [cardinality: 0.0, doc-size: 0.0, op-cost:
0.0, total-cost: 0.0]
+ -- ASSIGN |LOCAL|
+- unnest $$DOI <- scan-collection($$88)
project: [$$97, $$95, $$93, $$90, $$DOI]
++ unnest $$DOI <- scan-collection($$88)
project: [$$97, $$95, $$93, $$90, $$DOI] [cardinality: 0.0, doc-size: 0.0,
op-cost: 0.0, total-cost: 0.0]
+ -- UNNEST |LOCAL|
+- project ([$$97, $$95, $$93, $$90, $$88])
++ project ([$$97, $$95, $$93, $$90, $$88])
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STREAM_PROJECT |LOCAL|
+- nested tuple source
++ nested tuple source [cardinality: 0.0,
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- NESTED_TUPLE_SOURCE |LOCAL|
+ }
+ -- SUBPLAN |PARTITIONED|
+- assign [$$88] <- [$$D1.getField("outer_items")]
+- -- ASSIGN |PARTITIONED|
+- project ([$$D2, $$97, $$95, $$93, $$90, $$D1])
+- -- STREAM_PROJECT |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- unnest-map [$$81, $$D1] <- index-search("Dataset1", 0,
"Default", "TestDataverse", "Dataset1", true, false, 1, $$108, 1, $$108, true,
true, true)
+- -- BTREE_SEARCH |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- project ([$$108, $$D2, $$97, $$95, $$93, $$90])
+- -- STREAM_PROJECT |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- distinct ([$$108, $$109])
+- -- PRE_SORTED_DISTINCT_BY |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- order (ASC, $$108) (ASC, $$109)
+- -- STABLE_SORT [$$108(ASC), $$109(ASC)]
|PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- project ([$$D2, $$97, $$95, $$93, $$90,
$$108, $$109])
+- -- STREAM_PROJECT |PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+- unnest-map [$$104, $$105, $$106, $$107,
$$108] <- index-search("d1Idx", 0, "Default", "TestDataverse", "Dataset1",
true, true, 4, $$83, $$100, $$101, $$85, 4, $$83, $$100, $$101, $$85, true,
true, true)
+- -- BTREE_SEARCH |PARTITIONED|
+- exchange
+- -- BROADCAST_EXCHANGE |PARTITIONED|
+- running-aggregate [$$109] <-
[create-query-uid()]
+- -- RUNNING_AGGREGATE |PARTITIONED|
+- assign [$$101, $$100] <-
[to-bigint($$95), to-bigint($$97)]
+- -- ASSIGN |PARTITIONED|
+- assign [$$85, $$83, $$97, $$95,
$$93, $$90] <- [to-bigint($$D2.getField("field4")),
to-bigint($$D2.getField("field1")), $$D2.getField("field2"),
$$D2.getField("field3"), $$D2.getField("field3_notindexed"),
$$D2.getField("field2_notindexed")]
++ select (and(eq($$D1.getField("field4"), $$85),
eq($$D1.getField("field1"), $$83))) project: [$$D2, $$D1, $$97, $$95, $$93,
$$90, $$88]
++ -- STREAM_SELECT |PARTITIONED|
++ assign [$$88] <- [$$D1.getField("outer_items")]
++ -- ASSIGN |PARTITIONED|
++ project ([$$D2, $$97, $$95, $$93, $$90, $$85, $$83, $$D1])
++ -- STREAM_PROJECT |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ unnest-map [$$81, $$D1] <- index-search("Dataset1", 0,
"Default", "TestDataverse", "Dataset1", true, false, 1, $$108, 1, $$108, true,
true, true)
++ -- BTREE_SEARCH |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ project ([$$108, $$D2, $$97, $$95, $$93, $$90, $$85,
$$83])
++ -- STREAM_PROJECT |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ distinct ([$$108, $$109])
++ -- PRE_SORTED_DISTINCT_BY |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ order (ASC, $$108) (ASC, $$109)
++ -- STABLE_SORT [$$108(ASC), $$109(ASC)]
|PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ project ([$$D2, $$97, $$95, $$93, $$90,
$$85, $$83, $$108, $$109])
++ -- STREAM_PROJECT |PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ unnest-map [$$104, $$105, $$106,
$$107, $$108] <- index-search("d1Idx", 0, "Default", "TestDataverse",
"Dataset1", true, true, 4, $$83, $$100, $$101, $$85, 4, $$83, $$100, $$101,
$$85, true, true, true)
++ -- BTREE_SEARCH |PARTITIONED|
++ exchange
++ -- BROADCAST_EXCHANGE |PARTITIONED|
++ running-aggregate [$$109] <-
[create-query-uid()]
++ -- RUNNING_AGGREGATE
|PARTITIONED|
++ assign [$$101, $$100] <-
[to-bigint($$95), to-bigint($$97)]
+ -- ASSIGN |PARTITIONED|
+- project ([$$D2])
+- -- STREAM_PROJECT
|PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+- data-scan []<-[$$80,
$$D2] <- TestDataverse.Dataset2
+- -- DATASOURCE_SCAN
|PARTITIONED|
+- exchange
+- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+- empty-tuple-source
+- -- EMPTY_TUPLE_SOURCE
|PARTITIONED|
++ assign [$$85, $$83, $$97,
$$95, $$93, $$90] <- [to-bigint($$D2.getField("field4")),
to-bigint($$D2.getField("field1")), $$D2.getField("field2"),
$$D2.getField("field3"), $$D2.getField("field3_notindexed"),
$$D2.getField("field2_notindexed")]
++ -- ASSIGN |PARTITIONED|
++ project ([$$D2])
++ -- STREAM_PROJECT
|PARTITIONED|
++ exchange
++ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
++ data-scan []<-[$$80,
$$D2] <- TestDataverse.Dataset2
++ -- DATASOURCE_SCAN
|PARTITIONED|
++ exchange
++ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
++ empty-tuple-source
++ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
diff --git
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
index 12c660d..f30f64f 100644
---
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
+++
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/GlobalVirtualBufferCache.java
@@ -145,7 +145,7 @@
}
if (primaryIndexes.isEmpty()) {
flushPtr = 0;
- } else if (flushPtr >= pos) {
+ } else if (flushPtr >= pos && flushPtr > 0) {
// If the removed index is before flushPtr, we should
decrement flushPtr by 1 so that
// it still points to the same index.
flushPtr = (flushPtr - 1) % primaryIndexes.size();
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20652?usp=email
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: neo
Gerrit-Change-Id: I8a3761d0ab3759694af51f77bf8bfa9cbbcb8d1d
Gerrit-Change-Number: 20652
Gerrit-PatchSet: 1
Gerrit-Owner: Peeyush Gupta <[email protected]>