[
https://issues.apache.org/jira/browse/PHOENIX-7961?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Sanjeet Malhotra resolved PHOENIX-7961.
---------------------------------------
Fix Version/s: 5.4.0
5.3.3
Resolution: Fixed
> Secondary index diverges from data table after TTL expiry on partial-touch
> upserts
> ----------------------------------------------------------------------------------
>
> Key: PHOENIX-7961
> URL: https://issues.apache.org/jira/browse/PHOENIX-7961
> Project: Phoenix
> Issue Type: Bug
> Reporter: Sanjeet Malhotra
> Assignee: Sanjeet Malhotra
> Priority: Major
> Fix For: 5.4.0, 5.3.3
>
>
> On a table or view with a literal TTL and a secondary index, an UPSERT that
> does not re-write any index-referenced column (a "partial touch") can
> resurrect logically-expired values into the index. Phoenix rebuilds the
> affected index entry from the current on-disk row, but that internal
> current-row read is not TTL-masked the way an ordinary client read is. Cells
> that are logically expired under the TTL but not yet physically removed by
> compaction get rebuilt into the index, while the data table correctly expires
> them on read. The data table and its secondary index then diverge.
> There is a second facet at the exact TTL boundary. Even once the internal
> read is masked, \{{TTLRegionScanner}} derives its "current time" from the
> scan-open wall clock, whereas the index is rebuilt at \{{batchTimestamp}},
> which \{{getBatchTimestamp}} bumps slightly forward to avoid timestamp
> collisions. A cell whose expiry boundary falls in the sub-millisecond
> \{{(scanOpenTime, batchTimestamp]}} window stays visible to the masked read,
> is rebuilt into the index, yet is expired on the data side -- the same
> divergence at the boundary.
> Data-integrity / correctness bug: after TTL expiry the secondary index
> returns a value the data table no longer returns. No error is raised -- the
> divergence is silent and surfaces only after logical TTL expiry and before
> major compaction physically purges the expired cells.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)