mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-29 04:37:00 +00:00
The end_point_hints_manager's field _last_written_rp is initialized in its regular constructor, but is not copied in the move constructor. Because the move constructor is always involved when creating a new endpoint manager, the _last_written_rp field is effectively always initialized with the zero-argument constructor, and is set to the zero value. This can cause the following erroneous situation to occur: - Node A accumulates hints towards B. - Sync point is created at A. It will be used later to wait for currently accumulated hints. - Node A is restarted. The endpoint manager A->B is created which has bogus value in the _last_written_rp (it is set to zero). - Node A replays its hints but does not write any new ones. - A hint flush occurs. If there are no hint segments on disk after flush, the endpoint manager sets its last sent position to the last written position, which is by design. However, the last written position has incorrect value, so the last sent position also becomes incorrect and too low. - Try to wait for the sync point created earlier. The sync point waiting mechanism waits until last sent hint position reaches or goes past the position encoded in the sync point, but it will not happen because the last sent position is incorrect. The above bug can be (sometimes) reproduced in hintedhandoff_sync_point_api_test dtest. Now, the _last_written_rp field is properly initialized in the move constructor, which prevents the bug described above. Fixes: #9320 Closes #9426