Skip to content

TSDB:TimeSeriesIndexSearcher collect order error, caused by the wrong init value of tsidOrd #85711

@weizijun

Description

@weizijun

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

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions