Skip to content

Commit 95aac1c

Browse files
Merge free pages after rollback
Previously only happened during a checkpoint But if a rollback occurs after data has been written, there would be a bunch of small page ranges in the free page cache from data appended to the end of the file, which can be merged and truncated
1 parent c8b03ef commit 95aac1c

File tree

5 files changed

+21
-3
lines changed

5 files changed

+21
-3
lines changed

src/include/storage/free_space_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class FreeSpaceManager {
4848
// each checkpoint we remove any already-evicted pages.
4949
void clearEvictedBufferManagerEntriesIfNeeded(BufferManager* bufferManager);
5050

51+
void mergeFreePages(FileHandle* fileHandle);
52+
5153
private:
5254
PageRange splitPageRange(PageRange chunk, common::page_idx_t numRequiredPages);
5355
void mergePageRanges(free_list_t newInitialEntries, FileHandle* fileHandle);

src/include/storage/page_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class PageManager : public PageAllocator {
4040
void finalizeCheckpoint();
4141
void rollbackCheckpoint() { freeSpaceManager->rollbackCheckpoint(); }
4242

43+
void mergeFreePages(FileHandle* fileHandle);
44+
4345
common::row_idx_t getNumFreeEntries() const { return freeSpaceManager->getNumEntries(); }
4446
std::vector<PageRange> getFreeEntries(common::row_idx_t startOffset,
4547
common::row_idx_t endOffset) const {

src/storage/free_space_manager.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ static FreeSpaceManager::sorted_free_list_t& getFreeList(
1818
return freeLists[level];
1919
}
2020

21-
FreeSpaceManager::FreeSpaceManager() : freeLists{}, numEntries(0), needClearEvictedEntries(false){};
21+
FreeSpaceManager::FreeSpaceManager()
22+
: freeLists{}, numEntries(0), needClearEvictedEntries(false) {};
2223

2324
common::idx_t FreeSpaceManager::getLevel(common::page_idx_t numPages) {
2425
// level is exponent of largest power of 2 that is <= numPages
@@ -201,6 +202,10 @@ void FreeSpaceManager::finalizeCheckpoint(FileHandle* fileHandle) {
201202
uncheckpointedFreePageRanges.clear();
202203
}
203204

205+
void FreeSpaceManager::mergeFreePages(FileHandle* fileHandle) {
206+
mergePageRanges(std::move(uncheckpointedFreePageRanges), fileHandle);
207+
}
208+
204209
void FreeSpaceManager::resetFreeLists() {
205210
freeLists.clear();
206211
numEntries = 0;

src/storage/local_storage/local_storage.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ void LocalStorage::rollback() {
8888
for (auto& optimisticAllocator : optimisticAllocators) {
8989
optimisticAllocator->rollback();
9090
}
91-
auto* bufferManager = mm->getBufferManager();
92-
PageManager::Get(clientContext)->clearEvictedBMEntriesIfNeeded(bufferManager);
91+
auto& pageManager = *PageManager::Get(clientContext);
92+
pageManager.mergeFreePages(pageManager.getDataFH());
93+
pageManager.clearEvictedBMEntriesIfNeeded(mm->getBufferManager());
9394
}
9495

9596
} // namespace storage

src/storage/page_manager.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ void PageManager::freeImmediatelyRewritablePageRange(FileHandle* fileHandle, Pag
4343
}
4444
}
4545

46+
void PageManager::mergeFreePages(FileHandle* fileHandle) {
47+
if constexpr (ENABLE_FSM) {
48+
common::UniqLock lck{mtx};
49+
freeSpaceManager->mergeFreePages(fileHandle);
50+
++version;
51+
}
52+
}
53+
4654
void PageManager::serialize(common::Serializer& serializer) {
4755
freeSpaceManager->serialize(serializer);
4856
}

0 commit comments

Comments
 (0)