diff --git a/src/braft/log_manager.cpp b/src/braft/log_manager.cpp index cf077751..d36c8ad0 100644 --- a/src/braft/log_manager.cpp +++ b/src/braft/log_manager.cpp @@ -132,7 +132,7 @@ void LogManager::clear_memory_logs(const LogId& id) { while (!_logs_in_memory.empty() && nentries < ARRAY_SIZE(entries_to_clear)) { LogEntry* entry = _logs_in_memory.front(); - if (entry->id > id) { + if (entry->id >= id) { break; } entries_to_clear[nentries++] = entry; diff --git a/src/braft/log_manager.h b/src/braft/log_manager.h index fcd52dc3..3e83b3c8 100644 --- a/src/braft/log_manager.h +++ b/src/braft/log_manager.h @@ -184,7 +184,7 @@ friend class AppendBatcher; void unsafe_truncate_suffix(const int64_t last_index_kept); - // Clear the logs in memory whose id <= the given |id| + // Clear the logs in memory whose id < the given |id| void clear_memory_logs(const LogId& id); int64_t unsafe_get_term(const int64_t index); diff --git a/test/test_log_manager.cpp b/test/test_log_manager.cpp index 97b2dc43..e555d4a0 100644 --- a/test/test_log_manager.cpp +++ b/test/test_log_manager.cpp @@ -110,10 +110,12 @@ TEST_F(LogManagerTest, get_should_be_ok_when_disk_thread_stucks) { lm->clear_memory_logs(braft::LogId(N, 1)); // After clear all the memory logs, all the saved entries should have no // other reference - for (size_t i = 0; i < N; ++i) { + for (size_t i = 0; i < N - 1; ++i) { ASSERT_EQ(1u, saved_entries[i]->ref_count_); saved_entries[i]->Release(); } + ASSERT_EQ(2u, saved_entries[N-1]->ref_count_); + saved_entries[N - 1]->Release(); } TEST_F(LogManagerTest, configuration_changes) { @@ -165,10 +167,12 @@ TEST_F(LogManagerTest, configuration_changes) { lm->clear_memory_logs(braft::LogId(N, 1)); // After clear all the memory logs, all the saved entries should have no // other reference - for (size_t i = 0; i < N; ++i) { + for (size_t i = 0; i < N - 1; ++i) { ASSERT_EQ(1u, saved_entries[i]->ref_count_) << "i=" << i; saved_entries[i]->Release(); } + ASSERT_EQ(2u, saved_entries[N-1]->ref_count_); + saved_entries[N - 1]->Release(); } TEST_F(LogManagerTest, truncate_suffix_also_revert_configuration) { @@ -321,8 +325,11 @@ TEST_F(LogManagerTest, append_with_the_same_index) { for (size_t i = 0; i < N; ++i) { ASSERT_EQ(1u, saved_entries0[i]->ref_count_); ASSERT_EQ(1u, saved_entries1[i]->ref_count_); - ASSERT_EQ(1u, saved_entries2[i]->ref_count_); + if (i != N - 1) { + ASSERT_EQ(1u, saved_entries2[i]->ref_count_); + } } + ASSERT_EQ(2u, saved_entries2[N-1]->ref_count_); for (size_t i = 0; i < N; ++i) { braft::LogEntry* entry = lm->get_entry(i + 1); @@ -465,7 +472,7 @@ TEST_F(LogManagerTest, pipelined_append) { ASSERT_EQ(N * 2, lm->_logs_in_memory.size()); lm->set_applied_id(braft::LogId(N * 2, 2)); - ASSERT_EQ(0u, lm->_logs_in_memory.size()) + ASSERT_EQ(1u, lm->_logs_in_memory.size()) << "last_log_id=" << lm->last_log_id(true); // We can still get the right data from storage