diff --git a/.gitignore b/.gitignore index 109faaeef..8cdbee1da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,9 @@ -./deps/3rd -./deps/libevent -./deps/googletest -./deps/jsoncpp -./deps/benchmark +deps/3rd/* .vscode !.vscode/tasks.json !.vscode/launch.json .VSCodeCounter/* -./docs/doxy/ +docs/doxy/ build/* build_* cmake-build-*/* @@ -17,11 +13,11 @@ build .idea .ccls-cache compile_commands.json -./.name -./miniob.iml -./vcs.xml -./workspace.xml -./modules.xml +.name +miniob.iml +vcs.xml +workspace.xml +modules.xml GRTAGS GPATH GTAGS diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e7dfbb7e..17fb4e41e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ MESSAGE(STATUS "This is Project source dir " ${PROJECT_SOURCE_DIR}) MESSAGE(STATUS "This is PROJECT_BINARY_DIR dir " ${PROJECT_BINARY_DIR}) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) - +SET(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${PROJECT_SOURCE_DIR}/deps/3rd/usr/local") SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) # 设置默认构建类型为 Debug diff --git a/README.md b/README.md index 8174e07cc..2333f1414 100644 --- a/README.md +++ b/README.md @@ -100,4 +100,4 @@ MiniOB 采用 [木兰宽松许可证,第2版](https://license.coscl.org.cn/Mul - [OceanBase 社区交流群 33254054](https://h5.dingtalk.com/circle/healthCheckin.html?corpId=dingd88359ef5e4c49ef87cda005313eea7a&1fe0ca69-72d=16c86a07-83c&cbdbhh=qwertyuiop&origin=1) - [OceanBase 大赛官方交流群 35326455](https://qr.dingtalk.com/action/joingroup?code=v1,k1,g61jI0RwHQA8UMocuTbys2cyM7vck2c6jNE87vdxz9o=&_dt_no_comment=1&origin=11) - [OceanBase 官方论坛](https://ask.oceanbase.com/) -- MiniOB 开发者微信群(添加 hnwyllmm_126 为好友,备注 MiniOB,邀请入群) +- MiniOB 开发者微信群(添加 OBCE888 为好友,备注 MiniOB SIG,邀请入群) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index a64cfe3cb..415ccc080 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -8,7 +8,7 @@ FOREACH (F ${ALL_SRC}) get_filename_component(prjName ${F} NAME_WE) MESSAGE("Build ${prjName} according to ${F}") ADD_EXECUTABLE(${prjName} ${F}) - TARGET_LINK_LIBRARIES(${prjName} common pthread dl benchmark) + TARGET_LINK_LIBRARIES(${prjName} common pthread dl benchmark::benchmark) if(NOT ${prjName} STREQUAL "memtracer_performance_test") TARGET_LINK_LIBRARIES(${prjName} observer_static) endif() diff --git a/build.sh b/build.sh index 13b899418..a8f0ef5cf 100755 --- a/build.sh +++ b/build.sh @@ -4,8 +4,11 @@ TOPDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) BUILD_SH=$TOPDIR/build.sh +echo "THIRD_PARTY_INSTALL_PREFIX is ${THIRD_PARTY_INSTALL_PREFIX:=$TOPDIR/deps/3rd/usr/local}" CMAKE_COMMAND="cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 --log-level=STATUS" +CMAKE_COMMAND_THIRD_PARTY="$CMAKE_COMMAND -DCMAKE_INSTALL_PREFIX=$THIRD_PARTY_INSTALL_PREFIX" +CMAKE_COMMAND_MINIOB="$CMAKE_COMMAND" ALL_ARGS=("$@") BUILD_ARGS=() @@ -80,7 +83,7 @@ function do_init cd ${TOPDIR}/deps/3rd/libevent && \ mkdir -p build && \ cd build && \ - ${CMAKE_COMMAND} .. -DEVENT__DISABLE_OPENSSL=ON -DEVENT__LIBRARY_TYPE=BOTH && \ + ${CMAKE_COMMAND_THIRD_PARTY} .. -DEVENT__DISABLE_OPENSSL=ON -DEVENT__LIBRARY_TYPE=BOTH && \ ${MAKE_COMMAND} -j4 && \ make install @@ -88,7 +91,7 @@ function do_init cd ${TOPDIR}/deps/3rd/googletest && \ mkdir -p build && \ cd build && \ - ${CMAKE_COMMAND} .. && \ + ${CMAKE_COMMAND_THIRD_PARTY} .. && \ ${MAKE_COMMAND} -j4 && \ ${MAKE_COMMAND} install @@ -96,7 +99,7 @@ function do_init cd ${TOPDIR}/deps/3rd/benchmark && \ mkdir -p build && \ cd build && \ - ${CMAKE_COMMAND} .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBENCHMARK_ENABLE_TESTING=OFF -DBENCHMARK_INSTALL_DOCS=OFF -DBENCHMARK_ENABLE_GTEST_TESTS=OFF -DBENCHMARK_USE_BUNDLED_GTEST=OFF -DBENCHMARK_ENABLE_ASSEMBLY_TESTS=OFF && \ + ${CMAKE_COMMAND_THIRD_PARTY} .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBENCHMARK_ENABLE_TESTING=OFF -DBENCHMARK_INSTALL_DOCS=OFF -DBENCHMARK_ENABLE_GTEST_TESTS=OFF -DBENCHMARK_USE_BUNDLED_GTEST=OFF -DBENCHMARK_ENABLE_ASSEMBLY_TESTS=OFF && \ ${MAKE_COMMAND} -j4 && \ ${MAKE_COMMAND} install @@ -104,7 +107,7 @@ function do_init cd ${TOPDIR}/deps/3rd/jsoncpp && \ mkdir -p build && \ cd build && \ - ${CMAKE_COMMAND} -DJSONCPP_WITH_TESTS=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF .. && \ + ${CMAKE_COMMAND_THIRD_PARTY} -DJSONCPP_WITH_TESTS=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF .. && \ ${MAKE_COMMAND} && \ ${MAKE_COMMAND} install @@ -137,8 +140,8 @@ function do_build { TYPE=$1; shift prepare_build_dir $TYPE || return - echo "${CMAKE_COMMAND} ${TOPDIR} $@" - ${CMAKE_COMMAND} -S ${TOPDIR} $@ + echo "${CMAKE_COMMAND_MINIOB} ${TOPDIR} $@" + ${CMAKE_COMMAND_MINIOB} -S ${TOPDIR} $@ } function do_clean @@ -157,7 +160,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/lang/cmath.h b/deps/common/lang/cmath.h new file mode 100644 index 000000000..f25cfcef2 --- /dev/null +++ b/deps/common/lang/cmath.h @@ -0,0 +1,14 @@ +/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved. +miniob is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. */ +#pragma once + +#include + +using std::round; \ No newline at end of file diff --git a/deps/common/lang/string.cpp b/deps/common/lang/string.cpp index de8c7af1e..11a8d3593 100644 --- a/deps/common/lang/string.cpp +++ b/deps/common/lang/string.cpp @@ -22,6 +22,7 @@ See the Mulan PSL v2 for more details. */ #include "common/log/log.h" #include "common/lang/algorithm.h" +#include "common/lang/cmath.h" #include "common/lang/iomanip.h" namespace common { @@ -270,7 +271,8 @@ char *substr(const char *s, int n1, int n2) string double_to_str(double v) { char buf[256]; - snprintf(buf, sizeof(buf), "%.2f", v); + double rounded_v = round(v * 100.0) / 100.0; + snprintf(buf, sizeof(buf), "%.2f", rounded_v); size_t len = strlen(buf); while (buf[len - 1] == '0') { len--; diff --git a/docker/Dockerfile b/docker/Dockerfile index e6e7e4765..e7baaeb13 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -21,7 +21,7 @@ RUN apt-get install -y openssh-server # init miniob dependencies RUN git clone https://github.com/oceanbase/miniob /tmp/miniob \ && cd /tmp/miniob \ - && bash build.sh init \ + && THIRD_PARTY_INSTALL_PREFIX=/usr/local bash build.sh init \ && rm -rf /tmp/miniob RUN mkdir /var/run/sshd diff --git a/docs/docs/game/miniob-output-convention.md b/docs/docs/game/miniob-output-convention.md index 15999d0c8..96d165fcf 100644 --- a/docs/docs/game/miniob-output-convention.md +++ b/docs/docs/game/miniob-output-convention.md @@ -28,7 +28,7 @@ NOTE:后台测试程序,是将预先编辑好的Case执行后,将执行结 4. 所有输出不区分大小写 5. 日期(date)输出格式使用:"YYYY-mm-DD" 6. 输出的字符串不使用单引号双引号或其它括起来 -7. 浮点数输出,不要带后面多余的0,可以参考C sprintf的%g格式输出,保留两位小数。参考函数 double_to_str +7. 浮点数输出,不要带后面多余的0,四舍五入保留两位小数。参考函数 double_to_str FAQ - 某张表或者某个查询结果一行数据都没有,但是依然需要输出表头信息 diff --git a/docs/docs/how_to_build.md b/docs/docs/how_to_build.md index 8119b4ac7..166892a38 100644 --- a/docs/docs/how_to_build.md +++ b/docs/docs/how_to_build.md @@ -26,15 +26,17 @@ MiniOB 需要使用: bash build.sh init ``` -脚本将自动拉取依赖库(可以参考 .gitmodules) 然后编译安装到系统目录。 +脚本将自动拉取依赖库(可以参考 .gitmodules) 然后编译安装到miniob源码目录的 `deps/3rd/usr/local` 下。 -如果执行用户不是root,需要在命令前加上 `sudo`: +如果你想将第三方依赖安装到其它目录,比如 `/usr/local` 下,可以这样做: ```bash -sudo bash build.sh init +THIRD_PARTY_INSTALL_PREFIX=/usr/local bash build.sh init ``` -> 如果使用 GitPod 开发,可以跳过这步,会自动执行。 +> 注意:安装到系统目录可能需要一些特殊权限,可能需要使用 `sudo` 来执行命令。 + +> 如果使用 GitPod、GitHub Devcontainer 或 miniob docker 容器开发,可以跳过这步,会自动执行。 ## 2. 编译 diff --git a/src/observer/CMakeLists.txt b/src/observer/CMakeLists.txt index 051070200..267344f87 100644 --- a/src/observer/CMakeLists.txt +++ b/src/observer/CMakeLists.txt @@ -28,10 +28,9 @@ ENDFOREACH (F) SET(LIBEVENT_STATIC_LINK TRUE) FIND_PACKAGE(Libevent CONFIG REQUIRED) +FIND_PACKAGE(jsoncpp CONFIG REQUIRED) -# JsonCpp cannot work correctly with FIND_PACKAGE - -SET(LIBRARIES common pthread dl libevent::core libevent::pthreads libjsoncpp.a) +SET(LIBRARIES common pthread dl libevent::core libevent::pthreads JsonCpp::JsonCpp) # 指定目标文件位置 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) diff --git a/src/observer/storage/buffer/disk_buffer_pool.cpp b/src/observer/storage/buffer/disk_buffer_pool.cpp index 7ceba56ac..df656d76c 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,7 +374,8 @@ RC DiskBufferPool::allocate_page(Frame **frame) hdr_frame_->set_lsn(lsn); - LOG_INFO("allocate a new page without extend buffer pool. page num=%d, buffer pool=%d", i, id()); + 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); } @@ -402,8 +405,8 @@ RC DiskBufferPool::allocate_page(Frame **frame) return rc; } - LOG_INFO("allocate new page by extending bufferpool. 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++; 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 000000000..8858137b2 Binary files /dev/null and b/src/observer/storage/index/.bplus_tree.h.swp differ diff --git a/unittest/common/CMakeLists.txt b/unittest/common/CMakeLists.txt index 536870cc3..23dc1a78d 100644 --- a/unittest/common/CMakeLists.txt +++ b/unittest/common/CMakeLists.txt @@ -7,6 +7,6 @@ FOREACH (F ${ALL_SRC}) get_filename_component(prjName ${F} NAME_WE) MESSAGE("Build ${prjName} according to ${F}") ADD_EXECUTABLE(${prjName} ${F}) - TARGET_LINK_LIBRARIES(${prjName} common pthread dl gtest gtest_main) + TARGET_LINK_LIBRARIES(${prjName} common pthread dl GTest::gtest_main) add_test(NAME ${prjName} COMMAND ${prjName}) ENDFOREACH (F) diff --git a/unittest/memtracer/CMakeLists.txt b/unittest/memtracer/CMakeLists.txt index 71c317439..8048b2459 100644 --- a/unittest/memtracer/CMakeLists.txt +++ b/unittest/memtracer/CMakeLists.txt @@ -7,6 +7,6 @@ FOREACH (F ${ALL_SRC}) get_filename_component(prjName ${F} NAME_WE) MESSAGE("Build ${prjName} according to ${F}") ADD_EXECUTABLE(${prjName} ${F}) - TARGET_LINK_LIBRARIES(${prjName} pthread dl gtest gtest_main memtracer) + TARGET_LINK_LIBRARIES(${prjName} pthread dl GTest::gtest_main memtracer) add_test(NAME ${prjName} COMMAND ${prjName}) ENDFOREACH (F) diff --git a/unittest/observer/CMakeLists.txt b/unittest/observer/CMakeLists.txt index d0209e814..c737d8abd 100644 --- a/unittest/observer/CMakeLists.txt +++ b/unittest/observer/CMakeLists.txt @@ -9,6 +9,6 @@ FOREACH (F ${ALL_SRC}) get_filename_component(prjName ${F} NAME_WE) MESSAGE("Build ${prjName} according to ${F}") ADD_EXECUTABLE(${prjName} ${F}) - TARGET_LINK_LIBRARIES(${prjName} common pthread dl gtest gtest_main observer_static) + TARGET_LINK_LIBRARIES(${prjName} common pthread dl GTest::gtest_main observer_static) add_test(NAME ${prjName} COMMAND ${prjName}) ENDFOREACH (F)