Skip to content

Add acceptable_buffer_backends field in SubscriptionOptionsBase#3098

Open
nvcyc wants to merge 1 commit intorollingfrom
native_buffer/8-rclcpp
Open

Add acceptable_buffer_backends field in SubscriptionOptionsBase#3098
nvcyc wants to merge 1 commit intorollingfrom
native_buffer/8-rclcpp

Conversation

@nvcyc
Copy link

@nvcyc nvcyc commented Mar 16, 2026

Description

This pull request adds the acceptable_buffer_backends subscription option in rclcpp, which corresponds to the subscription field with the same name introduced in rmw in ros2/rmw#416. This option allows subscribers to control which buffer backends they accept, with a backward-compatible default of CPU-only.

This pull request consists of the following key changes:

  • rclcpp (subscription_options.hpp): SubscriptionOptionsBase adds acceptable_buffer_backends (std::string, default "cpu"). to_rcl_subscription_options() copies it into rmw_subscription_options.acceptable_buffer_backends when non-empty.
  • Generic subscription (generic_subscription.hpp): Constructor forces acceptable_buffer_backends to "cpu" ensuring serialized messages received by generic subscriptions are always CPU-based, which will be used by ros2 bag record for direct storage in bag files.

Is this user-facing behavior change?

The default value "cpu" preserves existing behavior -- subscriptions only accept CPU-backed data unless explicitly opting in. This is a new API surface but is additive and backward-compatible. Existing code that does not pass acceptable_buffer_backends will behave identically to before.

Did you use Generative AI?

No.

Additional Information

This PR is part of the broader ROS 2 native buffer feature introduced in this post.
It depends on the subscription field with the same name introduced in rmw in ros2/rmw#416.

Copy link
Contributor

@hidmic hidmic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First pass

Comment on lines +157 to +160
if (!acceptable_buffer_backends.empty()) {
result.rmw_subscription_options.acceptable_buffer_backends =
acceptable_buffer_backends.c_str();
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvcyc hmm, this implicitly ties the lifetimes of both rclcpp and rcl options. If the rclcpp object is destroyed before the rcl struct is used, we'll get a SEGFAULT. Note how content filtering options are allocated and managed by rcl.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, I think that we need to allocate a new string and copy over here. Look at rcl_subscription_options_set_content_filter_options for a reference.


template<typename AllocatorT>
static rclcpp::SubscriptionOptionsWithAllocator<AllocatorT>
force_cpu_buffer_backend_(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nvcyc nit: why the trailing underscore?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants