From 4d90aee5a825a7bd321f8e884712c137d28f757a Mon Sep 17 00:00:00 2001 From: wangyunlai Date: Thu, 14 Nov 2024 09:39:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20bplus=5Ftree=5Ftest=20?= =?UTF-8?q?=E5=8D=95=E6=B5=8B=E9=97=AE=E9=A2=98=20(#476)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem were solved in this pull request? Problem: 问题1:bplus_tree_test 单测失败,内存非法访问 问题2:bplus_tree_log_test concurrency 单测失败 ### What is changed and how it works? 问题1:单测运行时ASAN报内存非法访问。由于BplusTreeMiniTransaction析构时自动调用BplusTreeLogger的析构,接着调用 BplusTreeLogger::commit,这里会访问Frame,而frame已经释放,这样造成的内存非法访问。 问题2:build.sh 没有传入-DCONCURRENCY参数 修复方法: BplusTreeMiniTransaction 构造函数不给出rc时不自动提交或回滚,BplusTreeLogger也不需要在析构时自动提交。 --- build.sh | 2 +- deps/common/log/log.h | 1 + .../storage/buffer/disk_buffer_pool.cpp | 9 ++++++--- src/observer/storage/index/.bplus_tree.h.swp | Bin 0 -> 16384 bytes src/observer/storage/index/bplus_tree_log.cpp | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 src/observer/storage/index/.bplus_tree.h.swp diff --git a/build.sh b/build.sh index 13b899418..b228154b8 100755 --- a/build.sh +++ b/build.sh @@ -157,7 +157,7 @@ function build { local build_type_lower=$(echo "$1" | tr '[:upper:]' '[:lower:]') # 转换为小写 echo "Build type: $build_type_lower" # 输出构建类型 - do_build "$build_type_lower" -DCMAKE_BUILD_TYPE="$build_type_lower" # 调用 do_build + do_build $@ -DCMAKE_BUILD_TYPE="$build_type_lower" # 调用 do_build } diff --git a/deps/common/log/log.h b/deps/common/log/log.h index f51b798c8..c31983bf7 100644 --- a/deps/common/log/log.h +++ b/deps/common/log/log.h @@ -319,6 +319,7 @@ int Log::out(const LOG_LEVEL console_level, const LOG_LEVEL log_level, T &msg) do { \ if (!(expression)) { \ LOG_PANIC(description, ##__VA_ARGS__); \ + LOG_PANIC("%s", lbt()); \ assert(expression); \ } \ } while (0) diff --git a/src/observer/storage/buffer/disk_buffer_pool.cpp b/src/observer/storage/buffer/disk_buffer_pool.cpp index 92215cc7f..74a8ea497 100644 --- a/src/observer/storage/buffer/disk_buffer_pool.cpp +++ b/src/observer/storage/buffer/disk_buffer_pool.cpp @@ -115,6 +115,7 @@ Frame *BPFrameManager::get_internal(const FrameId &frame_id) (void)frames_.get(frame_id, frame); if (frame != nullptr) { frame->pin(); + LOG_DEBUG("got a frame. frame=%s", frame->to_string().c_str()); } return frame; } @@ -138,6 +139,7 @@ Frame *BPFrameManager::alloc(int buffer_pool_id, PageNum page_num) frame->set_page_num(page_num); frame->pin(); frames_.put(frame_id, frame); + LOG_DEBUG("allocate a new frame. frame=%s", frame->to_string().c_str()); } return frame; } @@ -372,6 +374,7 @@ RC DiskBufferPool::allocate_page(Frame **frame) hdr_frame_->set_lsn(lsn); + LOG_DEBUG("allocate a new page without extend buffer pool. page num=%d, buffer pool=%d", i, id()); lock_.unlock(); return get_this_page(i, frame); } @@ -401,8 +404,8 @@ RC DiskBufferPool::allocate_page(Frame **frame) return rc; } - LOG_INFO("allocate new page. file=%s, pageNum=%d, pin=%d", - file_name_.c_str(), page_num, allocated_frame->pin_count()); + LOG_INFO("allocate new page by extending bufferpool. buffer_pool_id=%d, pageNum=%d, pin=%d", + id(), page_num, allocated_frame->pin_count()); file_header_->allocated_pages++; file_header_->page_count++; @@ -705,7 +708,7 @@ RC DiskBufferPool::allocate_frame(PageNum page_num, Frame **buffer) Frame *frame = frame_manager_.alloc(id(), page_num); if (frame != nullptr) { *buffer = frame; - LOG_DEBUG("allocate frame %p, page num %d", frame, page_num); + LOG_DEBUG("allocate frame %p, page num %d, frame=%s", frame, page_num, frame->to_string().c_str()); return RC::SUCCESS; } diff --git a/src/observer/storage/index/.bplus_tree.h.swp b/src/observer/storage/index/.bplus_tree.h.swp new file mode 100644 index 0000000000000000000000000000000000000000..8858137b253ea277e40faf520f61542e4d2667c0 GIT binary patch literal 16384 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