mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-23 01:50:35 +00:00
CQL Local Secondary Index is a Scylla-only extension to Cassandra's secondary index API where the index is separate per partition. Scylla's documentation guarantees that: "As of Scylla Open Source 4.0, updates for local secondary indexes are performed synchronously. When updates are synchronous, the client acknowledges the write operation only after both the base table modification and the view up date are written." This happened automatically with vnodes, because the base table and the view have the same partition key, so base and view replicas are co-located, and the view update is always local and therefore done synchronously. But with tablets, this does NOT happen automatically - the base and view tablets may be located on different nodes, and the view update may be remote, and NOT synchronous. So in this patch we explicitly mark the view as synchronous_update when building the view for an LSI. The bigger part of this patch is to add a test which reliably fails before this patch, and passes after it. The test creates a two-node cluster and a table with LSI, and pins the base's tablets to one node and the view's to the second node, forcing the view updates to be remote. It also uses an injection point to make the view update slower. The test then writes to the base and immediately tries to use the index to read. Before this patch, the read doesn't find the new data (contrary to the guarantee in the documentation). After this patch, the read does find the new data - because the write waited for the index to be updated. Fixes #16371 Signed-off-by: Nadav Har'El <nyh@scylladb.com>