commitlog: Fix replay to not delete dirty segments
The problem is that replay will unlink any segments which were on disk
at the time the replay starts. However, some of those segments may
have been created by current node since the boot. If a segment is part
of reserve for example, it will be unlinked by replay, but we will
still use that segment to log mutations. Those mutations will not be
visible to replay after a crash though.
The fix is to record preexisting segents before any new segments will
have a chance to be created and use that as the replay list.
Introduced in abe7358767.
dtest failure:
commitlog_test.py:TestCommitLog.test_commitlog_replay_on_startup
Message-Id: <1481117436-6243-1-git-send-email-tgrabiec@scylladb.com>
This commit is contained in:
committed by
Avi Kivity
parent
4fedbf8430
commit
f7197dabf8
@@ -255,6 +255,14 @@ public:
|
||||
*/
|
||||
std::vector<sstring> get_active_segment_names() const;
|
||||
|
||||
/**
|
||||
* Returns a vector of segment paths which were
|
||||
* preexisting when this instance of commitlog was created.
|
||||
*
|
||||
* The list will be empty when called for the second time.
|
||||
*/
|
||||
std::vector<sstring> get_segments_to_replay();
|
||||
|
||||
uint64_t get_total_size() const;
|
||||
uint64_t get_completed_tasks() const;
|
||||
uint64_t get_flush_count() const;
|
||||
|
||||
Reference in New Issue
Block a user