Conversation
The ros:<distro>-ros-base images can lag the ROS apt repository. rosdep then installs packages from the current sync next to image packages from an older one, and the two sets do not always link. On lyrical, example_interfaces and test_msgs from the current sync call has_buffer_fields_* and cdr_*_with_endpoint_* functions that the image's service_msgs, builtin_interfaces and unique_identifier_msgs do not export, so every test that loads their FastRTPS type support exits with a symbol lookup error. Run apt-get upgrade in the dependency step of every job whose matrix includes lyrical, so the whole package set comes from one sync.
…ion suite test_param_drift_integration could die with SIGSEGV after all 52 tests had passed. The suite initialises rclcpp and never shuts it down, so the default context is shut down by its own static destructor inside exit(). Since rclcpp 28.1.22, Context::shutdown() first inserts the context into a thread_local set that guards against reentrant calls. exit() destroys the main thread's thread_local objects before it runs static destructors. The case ContextShutdownStopsTheReaderWhileTheDetectorIsStillAlive shuts a context of its own down on the main thread, which creates that set on this thread. At exit the default context's destructor then inserts into the destroyed set and reads its freed bucket array, which crashes whenever the freed memory holds a non-null pointer at that slot. TearDownTestSuite now calls rclcpp::shutdown(). The default context is no longer valid when its destructor runs, and Context::shutdown() returns before it reaches the set.
bburda
marked this pull request as ready for review
September 19, 2026 15:35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Since the ROS apt repository for lyrical was republished on 2026-09-18,
build-and-test (lyrical)fails on every branch. Theros:lyrical-ros-baseimage still carries packages from an older sync. rosdep then installsexample_interfacesandtest_msgsfrom the current sync, which were built against a newerrosidl_typesupport_fastrtps_c. They callhas_buffer_fields_*andcdr_*_with_endpoint_*functions that the image'sservice_msgs,builtin_interfacesandunique_identifier_msgsdo not export, so every test that loads their FastRTPS type support exits with a symbol lookup error (for exampletest_operation_managerand the action demo nodes, exit code 127).This PR runs
apt-get upgrade -yin the dependency step of every job whose matrix includes lyrical (ci.ymlbuild-and-test and graph-watchdog,opcua-plugin.ymlunit-tests), so the whole package set comes from one sync. The Depends lines of these packages carry no versions, so apt does not pull the rebuilt dependencies on its own.The runtime stage of the root
Dockerfilehas the same gap for the published lyrical image. It is not changed here.The second commit fixes a crash that came with the same package update on jazzy (rclcpp 28.1.22).
test_param_drift_integrationcould die with SIGSEGV after all its tests passed. The suite never shuts rclcpp down, so the default context runsContext::shutdown()from its static destructor insideexit(). Since 28.1.22 that call inserts the context into athread_localset, and one case of the suite creates that set on the main thread by shutting its own context down.exit()destroys the set before the static destructors run.TearDownTestSuite()now callsrclcpp::shutdown(), so the default context is no longer valid when its destructor runs.Issue
Type
Testing
In a container from the current
ros:lyrical-ros-baseimage with the job's install steps:ldd -rreports unresolved symbols in the example_interfaces, test_msgs and greenwave_monitor_interfaces FastRTPS type support libraries, andtest_operation_managerfails with the same symbol lookup error as CI;apt-get upgrade -y(130 packages, none held back or removed):ldd -ris clean on every/opt/ros/lyrical/lib/*.soandtest_operation_managerpasses 41 tests.The same upgrade runs cleanly on the current humble and jazzy images.
In a
ros:jazzy-ros-basecontainer (rclcpp 28.1.22, CycloneDDS as in CI): the full param_drift suite crashed 4 of 50 runs before the change and 0 of 50 after; the case that shuts its own context down crashed 36 of 500 runs alone before and 0 of 500 after, and a case that never does crashed 0 of 500.colcon test --packages-select ros2_medkit_graph_watchdog: 725 test cases, 0 failures.The CI run on this PR is the full check.
Checklist