From 19febc88220568671aa2c03be671d8cc8a2b5972 Mon Sep 17 00:00:00 2001 From: Double Date: Fri, 20 Oct 2023 16:54:28 +0800 Subject: [PATCH] bugfix: fix get record failed when page_handler has inited (#292) ### What problem were solved in this pull request? In the `next()` function of Operator, `record_handler_->get_record(record_page_handler_, &rid, readonly_, ¤t_record_)` may be invoked more than one time. In this case, `record_page_handler_` has inited, it will return `RC::RECORD_OPENNED`, and `get_record()` will be failed. ### What is changed and how it works? If the page_handler is inited, then reinit it if need otherwise return RECORD_OPENNED. --- src/observer/storage/record/record_manager.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/observer/storage/record/record_manager.cpp b/src/observer/storage/record/record_manager.cpp index 206486903..6991c6a9c 100644 --- a/src/observer/storage/record/record_manager.cpp +++ b/src/observer/storage/record/record_manager.cpp @@ -82,8 +82,12 @@ RecordPageHandler::~RecordPageHandler() { cleanup(); } RC RecordPageHandler::init(DiskBufferPool &buffer_pool, PageNum page_num, bool readonly) { if (disk_buffer_pool_ != nullptr) { - LOG_WARN("Disk buffer pool has been opened for page_num %d.", page_num); - return RC::RECORD_OPENNED; + if (frame_->page_num() == page_num) { + LOG_WARN("Disk buffer pool has been opened for page_num %d.", page_num); + return RC::RECORD_OPENNED; + } else { + cleanup(); + } } RC ret = RC::SUCCESS; @@ -457,7 +461,7 @@ RC RecordFileHandler::get_record(RecordPageHandler &page_handler, const RID *rid } RC ret = page_handler.init(*disk_buffer_pool_, rid->page_num, readonly); - if (OB_FAIL(ret)) { + if (OB_FAIL(ret) && ret != RC::RECORD_OPENNED) { LOG_ERROR("Failed to init record page handler.page number=%d", rid->page_num); return ret; }