OpenAtomFoundation / pikiwidb

a high-performance, large-capacity, multi-tenant, data-persistent, strong data consistency based on raft, Redis-compatible elastic KV data storage system based on RocksDB
BSD 3-Clause "New" or "Revised" License
195 stars 62 forks source link

安装 braft 时存在的小bug #224

Closed longfar-ncy closed 3 months ago

longfar-ncy commented 6 months ago

Description

braft.cmake 中使用 ExteranlProject_Add 命令拉取 braft 时,其中的 install 命令是使用 cp 直接将所需要的头文件目录和库文件复制到目标目录的。

ExternalProject_Add(
        extern_braft
        ${EXTERNAL_PROJECT_LOG_ARGS}
        DEPENDS brpc
        URL "https://github.com/baidu/braft/archive/v1.1.2.tar.gz"
        URL_HASH SHA256=bb3705f61874f8488e616ae38464efdec1a20610ddd6cd82468adc814488f14e
        PREFIX ${BRAFT_SOURCES_DIR}
        UPDATE_COMMAND ""
        CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
        -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
        -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
        -DCMAKE_INSTALL_PREFIX=${BRAFT_INSTALL_DIR}
        -DCMAKE_INSTALL_LIBDIR=${BRAFT_INSTALL_DIR}/lib
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON
        -DCMAKE_BUILD_TYPE=${THIRD_PARTY_BUILD_TYPE}
        -DCMAKE_PREFIX_PATH=${prefix_path}
        -DBRPC_WITH_GLOG=OFF
        ${EXTERNAL_OPTIONAL_ARGS}
        LIST_SEPARATOR |
        CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${BRAFT_INSTALL_DIR}
        -DCMAKE_INSTALL_LIBDIR:PATH=${BRAFT_INSTALL_DIR}/lib
        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
        -DCMAKE_BUILD_TYPE:STRING=${THIRD_PARTY_BUILD_TYPE}
        BUILD_IN_SOURCE 1
        BUILD_COMMAND $(MAKE) -j ${CPU_CORE} braft-static
        INSTALL_COMMAND mkdir -p ${BRAFT_INSTALL_DIR}/lib/ COMMAND cp ${BRAFT_SOURCES_DIR}/src/extern_braft/output/lib/libbraft.a ${BRAFT_LIBRARIES} COMMAND cp -r ${BRAFT_SOURCES_DIR}/src/extern_braft/output/include ${BRAFT_INCLUDE_DIR}/
)

这样可能导致一些问题:复制头文件时,如果目标目录不存在,源目录复制过去后会直接充当目标目录,这样是没问题的;但是如果目标目录存在,复制过去就会成为目标目录的子目录,这样就可能导致奇怪的崩溃。(详见 链接) 如果不切换braft版本,这个小 bug 没有什么影响;但是如果切换 braft 版本,就会导致 braft 与 pikiwidb 引入的 braft 头文件不一样,从而导致节点崩溃。

补充:我尝试将 INSTALL 这一行删掉,指定安装目录CMAKE_INSTALL_PREFIX,使用默认的安装方式安装braft,这样在 Ubuntu 系统上能够成功编译。但在 Mac 上会有奇怪的链接错误。

Issues-translate-bot commented 6 months ago

Bot detected the issue body's language is not English, translate it automatically.


Title: Small bug when installing braft

longfar-ncy commented 3 months ago

@mirthfulLee lihuan

mirthfulLee commented 3 months ago

This issue can be easily handled by replacing the direct cp:

  1. mkdir first and then cp include/* dest;
  2. Clear the dest directory with rm -rf and then cp the target;

The second measure is more robust if the dest directory is possible to be polluted. Should be fixed in #334

By the way, when debugging this issue, I have find another issue after converting the download method from GIT to URL.