Siyao Meng created HDDS-17153:
---------------------------------

             Summary: Native rocks-tools library fails to load on Rocky Linux 
9: GLIBCXX_3.4.32 not found
                 Key: HDDS-17153
                 URL: https://issues.apache.org/jira/browse/HDDS-17153
             Project: Apache Ozone
          Issue Type: Bug
          Components: Native
            Reporter: Siyao Meng
            Assignee: Siyao Meng
         Attachments: HDDS-17153.001.patch

h3. Problem
The native rocks-tools library in the 2.2.1 release cannot be loaded on Rocky 
Linux 9, including the official {{apache/ozone:2.2.1}} image:
{code}
WARN utils.NativeLibraryLoader: Unable to load library: ozone_rocksdb_tools
java.lang.UnsatisfiedLinkError: 
/tmp/ozone_rocksdb_tools.../libozone_rocksdb_tools.so: /lib64/libstdc++.so.6: 
version `GLIBCXX_3.4.32' not found (required by 
/tmp/ozone_rocksdb_tools.../libozone_rocksdb_tools.so)
{code}
{{ozone debug checknative}} reports {{rocks-tools: false}}. The OM logs 
{{Native Library for raw sst file reading loading failed. Fallback to 
performing a full diff instead.}}, so snapshot diff always takes the full-diff 
fallback and the SST pruning in {{RocksDBCheckpointDiffer}} is skipped.

h3. Root cause
* The 2.2.1 {{libozone_rocksdb_tools.so}} was built with {{GCC: (Debian 
14.2.0-19) 14.2.0}}.
* Its only dependency on {{GLIBCXX_3.4.32}} is 
{{std::ios_base_library_init()}}. GCC 13+ emits a reference to it in every 
translation unit that includes {{<iostream>}}.
* {{ManagedRawSSTFileIterator.cpp}} and {{ManagedRawSSTFileReader.cpp}} both 
include {{<iostream>}} but use no streams.
* Rocky Linux 9 / RHEL 9 ship libstdc++ from GCC 11, which provides up to 
{{GLIBCXX_3.4.29}}. Without that one symbol, the 2.2.1 library needs at most 
{{GLIBCXX_3.4.29}} ({{std::__throw_bad_array_new_length()}}), which Rocky 9 
provides.

Changing the runner/release images does not help: Rocky 9 has no supported way 
to get a system-wide libstdc++ with {{GLIBCXX_3.4.32}}, and RHEL 9 hosts have 
the same limit.

h3. Fix
* Remove the unused {{#include <iostream>}} from both native sources.
* {{ManagedRawSSTFileIterator.cpp}} uses {{std::min}} and {{std::memcpy}}, so 
include {{<algorithm>}} and {{<cstring>}} explicitly instead of relying on 
{{<iostream>}} pulling them in.

h3. Testing done
* Compiled the two sources with the CMake flags of the {{-Drocks_tools_native}} 
build, before and after the change. Each original object has one undefined 
reference to {{std::ios_base_library_init()}}; the fixed objects have none.
* Native build on master (RocksDB 10.10.1.1, GCC 13.3) with the change:
** The resulting {{libozone_rocksdb_tools.so}} has no {{ios_base_library_init}} 
reference and needs at most {{GLIBCXX_3.4.14}}.
** {{hdds-rocks-native}} tests pass: TestNativeLibraryLoader 6, 
TestManagedRawSSTFileIterator 28, TestLatestVersionedKWayMergeIterator 10, 
TestLatestVersionedKWayMergeIteratorOverSst 2.
* Verified the root cause on the published {{hdds-rocks-native-2.2.1.jar}} from 
Maven Central with {{objdump -T}} and {{readelf -p .comment}}.

h3. Follow-ups (not in this patch)
* *Pin the release build environment.* The release guide allows building on any 
Linux, so the native library's libstdc++/glibc requirements depend on the 
release manager's machine. For example, 2.2.1 also needs {{GLIBC_2.32}}, which 
excludes RHEL 8. Building in a container whose toolchain is no newer than the 
oldest supported runtime (e.g. {{rockylinux:9}}) would make this deterministic.
* *Guard in CI.* An acceptance check that {{ozone debug checknative}} reports 
{{rocks-tools: true}} in the runner image would catch this kind of regression.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to