mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-20 00:20:47 +00:00
The commitlog replayer groups segments by shard using a std::unordered_multimap, then iterates per-shard segments via equal_range(). However, equal_range() does not guarantee iteration order for elements with the same key, so segments could be replayed out of order within a shard. Correct segment ordering is required for: - Fragmented entry reconstruction, which accumulates fragments across segments and depends on ascending order for efficient processing. - Commitlog-based storage used by the strongly consistent tables feature, which relies on replayed raft items being stored in order. Fix by changing the data structure from std::unordered_multimap<unsigned, commitlog::descriptor> to std::unordered_map<unsigned, utils::chunked_vector<commitlog::descriptor>> Since the descriptors are inserted from a std::set ordered by ID, the vector preserves insertion (and thus ID) order. The per-shard iteration now simply iterates the vector, guaranteeing correct replay order. Fixes: SCYLLADB-1411 Backport: It looks like this issue doesn't cause any trouble, and is required only by the strong consistent tables, so no backporting required. Closes scylladb/scylladb#29372 * github.com:scylladb/scylladb: commitlog: add test to verify segment replay order commitlog: fix replay order by using ordered map per shard