Elasticsearch Version
master
Installed Plugins
No response
Java Version
bundled
OS Version
all
Problem Description
TimeSeriesIndexSearcher use the tsidOrd to speed up tsid compare. There is a hidden bug:
The init value of tsidOrd is 0, so it's ok to collect data from beginning. But if collect data from the middle, the tsidOrd has a wrong init value. It will cause the PriorityQueue pop the wrong LeafWalker.
Steps to Reproduce
Create 2 segments IndexWriter, And the first segment is:
| _tsid |
@timestamp |
| tsid1 |
1 |
| tsid2 |
11 |
| tsid2 |
10 |
| tsid3 |
1 |
the second segment is:
| _tsid |
timestamp |
| tsid1 |
1 |
| tsid2 |
21 |
| tsid2 |
20 |
| tsid3 |
1 |
the query is _tsid : tsid2 OR _tsid : tsid3
the current order is : tsid2/21 -> tsid2/11 -> tsid2/20 -> tsid2/10 -> tsid3/1 -> tsid3/1.
The right order is : tsid2/21 -> tsid2/20 -> tsid2/11 -> tsid2/10 -> tsid3/1 -> tsid3/1.
The reason is in
boolean shouldPop() throws IOException {
if (tsidOrd == -1) {
tsidOrd = tsids.ordValue();
} else if (tsidOrd != tsids.ordValue()) {
tsidOrd = tsids.ordValue();
return true;
}
return false;
}
the tsidOrd init value is 0, But the first tsidOrd value of this query is 1. So It pop the second segment unexpected.
Logs (if relevant)
No response
Elasticsearch Version
master
Installed Plugins
No response
Java Version
bundled
OS Version
all
Problem Description
TimeSeriesIndexSearcher use the tsidOrd to speed up tsid compare. There is a hidden bug:
The init value of tsidOrd is 0, so it's ok to collect data from beginning. But if collect data from the middle, the tsidOrd has a wrong init value. It will cause the PriorityQueue pop the wrong LeafWalker.
Steps to Reproduce
Create 2 segments IndexWriter, And the first segment is:
the second segment is:
the query is _tsid : tsid2 OR _tsid : tsid3
the current order is : tsid2/21 -> tsid2/11 -> tsid2/20 -> tsid2/10 -> tsid3/1 -> tsid3/1.
The right order is : tsid2/21 -> tsid2/20 -> tsid2/11 -> tsid2/10 -> tsid3/1 -> tsid3/1.
The reason is in
the tsidOrd init value is 0, But the first tsidOrd value of this query is 1. So It pop the second segment unexpected.
Logs (if relevant)
No response