ARM编译StarRocks-branch-2.5使用异常

【详述】在ARM环境下基于2.5分支无法正常编译,修改一处代码后虽编译通过,但使用编译后的包执行insert语句BE会down掉。
【StarRocks版本】2.5.3-ARM(branch-2.5-1fed0c9),之前基于2.4.0版本测试编译及使用均正常
【CPU型号】HUAWEI Kirin 9006C
【操作描述】如下:

1、直接编译时的报错信息:

[ 99%] Linking CXX static library ../../../output/tmp/RELEASE/libTools.a
[ 99%] Built target Tools
[ 99%] Linking CXX static library ../../../output/tmp/RELEASE/libUtil.a
[ 99%] Built target Util
[ 99%] Building CXX object src/service/CMakeFiles/starrocks_be.dir/starrocks_main.cpp.o
/root/starrocks/be/src/service/starrocks_main.cpp:59:2: error: #error _GLIBCXX_USE_CXX11_ABI must be non-zero
   59 | #error _GLIBCXX_USE_CXX11_ABI must be non-zero
      |  ^~~~~
make[2]: *** [src/service/CMakeFiles/starrocks_be.dir/build.make:76: src/service/CMakeFiles/starrocks_be.dir/starrocks_main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:1143: src/service/CMakeFiles/starrocks_be.dir/all] Error 2
make: *** [Makefile:156: all] Error 2

2、根据报错尝试修改代码:be/src/service/starrocks_main.cpp,删除了如下三行后编译通过:

#if !_GLIBCXX_USE_CXX11_ABI
#error _GLIBCXX_USE_CXX11_ABI must be non-zero
#endif

3、使用该包部署后创建简单明细表,执行insert语句后BE挂掉:

CREATE TABLE customer (
    c_custkey INT,
    c_name VARCHAR(26),
    c_city VARCHAR(11)
)
DUPLICATE KEY(c_custkey)
DISTRIBUTED BY HASH (c_custkey) BUCKETS 1
PROPERTIES (
  "replication_num"="1"
);

insert into customer values(1001,'liumu','xian');
ERROR 1064 (HY000): Backend not found. Check if any backend is down or not

4、be.out主要信息如下,完整日志见下文附件:

*** Aborted at 1679147941 (unix time) try "date -d @1679147941" if you are using GNU date ***
PC: @                0x0 (unknown)
*** SIGABRT (@0x11c15) received by PID 72725 (TID 0x7edd1b7d40) from PID 72725; stack trace: ***
    @          0x4628888 google::(anonymous namespace)::FailureSignalHandler()
    @       0x7fbece65b8 ([vdso]+0x5b7)
    @       0x7fbda5d0f0 gsignal
    @       0x7fbda49de8 abort
    @          0x1e38b60 starrocks::failure_function()
    @          0x461c1e8 google::LogMessage::Fail()
    @          0x461e5ec google::LogMessage::SendToLog()
    @          0x461bd48 google::LogMessage::Flush()
    @          0x461ece0 google::LogMessageFatal::~LogMessageFatal()
    @          0x4891d00 bthread::TaskGroup::sched_to()
    @          0x4892ddc bthread::TaskGroup::ending_sched()
    @          0x4893948 bthread::TaskGroup::task_runner()
    @          0x488c064 bthread_make_fcontext

be.out (5.9 KB)

需要手动修改一下brpc文件:

+++ brpc-1.3.0/src/bthread/task_group.cpp       2022-12-21 22:06:47.413173602 +0000
@@ -248,6 +248,9 @@ int TaskGroup::init(size_t runqueue_capa
     return 0;
 }

+#if defined(__aarch64__)
+__attribute__((optimize("O0")))
+#endif
 void TaskGroup::task_runner(intptr_t skip_remained) {
     // NOTE: tls_task_group is volatile since tasks are moved around
     //       different groups.
@@ -567,6 +570,9 @@ void TaskGroup::sched(TaskGroup** pg) {
     sched_to(pg, next_tid);
 }

+#if defined(__aarch64__)
+__attribute__((optimize("O0")))
+#endif
 void TaskGroup::sched_to(TaskGroup** pg, TaskMeta* next_meta) {
     TaskGroup* g = *pg;
 #ifndef NDEBUG

给您反馈一下最新的测试情况。今天修改了如下两处代码:
1、在brpc-1.3.0/src/bthread/task_group.cp中添加您指出的两处代码;
2、删除be/src/service/starrocks_main.cpp中上面提到的三行涉及must be non-zero报错的代码。
修改后编译通过,初步测试上次的insert导入问题也已解决。
若后续测试过程中发现其他问题再与您反馈。

这儿出错的原因不在于源代码有问题, 而是使用的gcc/g++有问题, centos7下使用的centos-release-scl源里的devtoolset-10的gcc/g++将_GLIBCXX_USE_CXX11_ABI强制关闭了, 不支持cxx11 dual ABI, 产生非常多的非预期问题.

建议使用官方提供的已经包含thirdparty的starrocks/dev-env-ubuntu:latest或者starrocks/dev-env-centos7:latest进行starrocks代码编译.

如果想要尝试源码编译starrocks thirdparty, 可以使用starrocks/toolchains-centos7:20230324 或者 starrocks/toolchains-ubuntu:20230324.

目前这些镜像都已经同时支持amd64和arm64架构.

2赞