Files
scylladb/service
Tomasz Grabiec e8ee0a2f86 Merge 'group0_state_machine: use correct comparison for timeuuids in merger' from Kamil Braun
In d2a4079bbe, `merger` was modified so that when we merge a command, `last_group0_state_id` is taken to be the maximum of the merged command's state_id and the current `last_group0_state_id`. This is necessary for achieving the same behavior as if the commands were applied individually instead of being merged -- where we take the maximum state ID from `group0_history` table which was applied until now (because the table is sorted using the state IDs and we take the greatest row).

However, a subtle bug was introduced -- the `std::max` function uses the `utils::UUID` standard comparison operator which is unfortunately not the same as timeuuid comparison that Scylla performs when sorting the `group0_history` table. So in rare cases it could return the *smaller* of the two timeuuids w.r.t. the correct timeuuid ordering. This would then lead to commands being applied which should have been turned to no-ops due to the `prev_state_id` check -- and then, for example, permanent schema desync or worse.

Fix it by using the correct comparison method.

Fixes: #14600

Closes #14616

* github.com:scylladb/scylladb:
  utils/UUID: reference `timeuuid_tri_compare` in `UUID::operator<=>` comment
  group0_state_machine: use correct comparison for timeuuids in `merger`
  utils/UUID: introduce `timeuuid_tri_compare` for `const UUID&`
  utils/UUID: introduce `timeuuid_tri_compare` for `const int8_t*`
2023-07-12 14:48:18 +02:00
..
2023-06-06 13:29:16 +03:00