diff --git a/src/include/storage/free_space_manager.h b/src/include/storage/free_space_manager.h index 949303082cc..37ba3c27adb 100644 --- a/src/include/storage/free_space_manager.h +++ b/src/include/storage/free_space_manager.h @@ -48,6 +48,8 @@ class FreeSpaceManager { // each checkpoint we remove any already-evicted pages. void clearEvictedBufferManagerEntriesIfNeeded(BufferManager* bufferManager); + void mergeFreePages(FileHandle* fileHandle); + private: PageRange splitPageRange(PageRange chunk, common::page_idx_t numRequiredPages); void mergePageRanges(free_list_t newInitialEntries, FileHandle* fileHandle); diff --git a/src/include/storage/page_manager.h b/src/include/storage/page_manager.h index d997f6bc0e9..e897a2962ba 100644 --- a/src/include/storage/page_manager.h +++ b/src/include/storage/page_manager.h @@ -40,6 +40,8 @@ class PageManager : public PageAllocator { void finalizeCheckpoint(); void rollbackCheckpoint() { freeSpaceManager->rollbackCheckpoint(); } + void mergeFreePages(FileHandle* fileHandle); + common::row_idx_t getNumFreeEntries() const { return freeSpaceManager->getNumEntries(); } std::vector getFreeEntries(common::row_idx_t startOffset, common::row_idx_t endOffset) const { diff --git a/src/storage/free_space_manager.cpp b/src/storage/free_space_manager.cpp index 15422f6334b..b1290641ee8 100644 --- a/src/storage/free_space_manager.cpp +++ b/src/storage/free_space_manager.cpp @@ -201,6 +201,10 @@ void FreeSpaceManager::finalizeCheckpoint(FileHandle* fileHandle) { uncheckpointedFreePageRanges.clear(); } +void FreeSpaceManager::mergeFreePages(FileHandle* fileHandle) { + mergePageRanges(std::move(uncheckpointedFreePageRanges), fileHandle); +} + void FreeSpaceManager::resetFreeLists() { freeLists.clear(); numEntries = 0; diff --git a/src/storage/local_storage/local_storage.cpp b/src/storage/local_storage/local_storage.cpp index 316718ccfc4..587419e20b2 100644 --- a/src/storage/local_storage/local_storage.cpp +++ b/src/storage/local_storage/local_storage.cpp @@ -88,8 +88,9 @@ void LocalStorage::rollback() { for (auto& optimisticAllocator : optimisticAllocators) { optimisticAllocator->rollback(); } - auto* bufferManager = mm->getBufferManager(); - PageManager::Get(clientContext)->clearEvictedBMEntriesIfNeeded(bufferManager); + auto& pageManager = *PageManager::Get(clientContext); + pageManager.mergeFreePages(pageManager.getDataFH()); + pageManager.clearEvictedBMEntriesIfNeeded(mm->getBufferManager()); } } // namespace storage diff --git a/src/storage/page_manager.cpp b/src/storage/page_manager.cpp index 62c285d792c..d28fa9c611c 100644 --- a/src/storage/page_manager.cpp +++ b/src/storage/page_manager.cpp @@ -43,6 +43,14 @@ void PageManager::freeImmediatelyRewritablePageRange(FileHandle* fileHandle, Pag } } +void PageManager::mergeFreePages(FileHandle* fileHandle) { + if constexpr (ENABLE_FSM) { + common::UniqLock lck{mtx}; + freeSpaceManager->mergeFreePages(fileHandle); + ++version; + } +} + void PageManager::serialize(common::Serializer& serializer) { freeSpaceManager->serialize(serializer); }