Skip to content

refactor(dds): Rcl.Context / Rcl.Node 分離 (DomainParticipant を [Obsolete] 委譲ラッパに)#105

Merged
OJII3 merged 25 commits into
mainfrom
rcl/context-node-design
Jul 2, 2026
Merged

refactor(dds): Rcl.Context / Rcl.Node 分離 (DomainParticipant を [Obsolete] 委譲ラッパに)#105
OJII3 merged 25 commits into
mainfrom
rcl/context-node-design

Conversation

@OJII3

@OJII3 OJII3 commented Jul 2, 2026

Copy link
Copy Markdown
Owner

概要

ROSettaDDS.Dds.DomainParticipant を rcl 風の 2 層 API に分離し、ROS 2 の rcl_context_t / rcl_node_t に対応する公開 API を提供。

  • ROSettaDDS.Rcl.Context (新規): ドメイン共通 DDS 資源 (transport 4 種 / DiscoveryDb / SPDP / SEDP / LeaseExpiryMonitor / ParticipantRtpsReceiver) を所有
  • ROSettaDDS.Rcl.Node (新規): Context を参照し、Publisher / Subscription / ServiceClient のみを生やす
  • ROSettaDDS.Dds.DomainParticipant (既存): [Obsolete] 化 + Rcl.Context + Rcl.Node への薄い委譲ラッパに
  • ROSettaDDS.Rcl.ContextOptions (新規): DomainParticipantOptions から internal FromLegacy で変換可能な canonical options
  • ROSettaDDS.Rcl.NodeOptions (新規): Node 用 (Logger override のみ、初回リリース)

動機

DomainParticipant は ROS 2 でいう rcl_node_t (= ユーザー操作対象) と rcl_context_t (= ドメイン共通 DDS 資源) を 1 クラスに押し込めていた。

  • クラス名・API が DDS 用語で固有名詞的すぎる (DomainParticipant / DomainParticipantOptions)
  • GuidPrefix / DiscoveryDb / UserMulticastTransport などの DDS 詳細が public で露出
  • ROS 2 の二層モデル (Context / Node) と一致しない

変更内容

新規ファイル

  • src/rosettadds/Rcl/Context.cs (Context 本体)
  • src/rosettadds/Rcl/ContextOptions.cs (canonical options)
  • src/rosettadds/Rcl/Node.cs (ユーザー操作対象)
  • src/rosettadds/Rcl/NodeOptions.cs (Node 用 options)
  • .meta (Unity)
  • tests/rosettadds.Tests/Rcl/ContextTests.cs (9 tests)
  • tests/rosettadds.Tests/Rcl/ContextOptionsTests.cs (2 tests)
  • tests/rosettadds.Tests/Rcl/NodeTests.cs (6 tests)
  • tests/rosettadds.Tests/Rcl/NodeOptionsTests.cs (3 tests)
  • tests/rosettadds.Tests/Rcl/DomainParticipantObsoleteTests.cs (4 tests)

変更ファイル

  • src/rosettadds/Dds/DomainParticipant.cs: 518 行 → 86 行 ([Obsolete] 委譲ラッパ)
  • src/rosettadds/Dds/ParticipantTransportSet.cs / ParticipantEndpointFactory.cs / LeaseExpiryMonitor.cs: 内部シグネチャを ContextOptions 起点に
  • tests/rosettadds.Tests/Dds/ParticipantTransportSetTests.cs / ParticipantEndpointFactoryTests.cs / LeaseExpiryMonitorTests.cs: 機械的書き換え
  • tests/rosettadds.Tests/Integration/SedpReliableLoopbackTests.cs: リフレクション経由のアクセスを新構造に追従
  • tests/rosettadds.Tests/rosettadds.Tests.csproj: <NoWarn>CS0618</NoWarn> (既存テスト 60+ ファイルからの [Obsolete] 警告抑止)

仕様書 / プラン

  • docs/superpowers/specs/2026-07-02-rcl-context-node-design.md
  • docs/superpowers/plans/2026-07-02-rcl-context-node.md

ユーザー API (After)

using ROSettaDDS.Rcl;

using var ctx = new Context(new ContextOptions { LocalhostOnly = true });
var node = new Node(ctx, "chatter_talker");

using var pub = node.CreatePublisher<StringMessage>(
    "chatter", StringMessageSerializer.Instance, StringMessage.DdsTypeName);
using var sub = node.CreateSubscription<StringMessage>(
    "chatter", StringMessageSerializer.Instance, msg => Console.WriteLine(msg.Data),
    StringMessage.DdsTypeName);

互換性

  • 既存 DomainParticipant 利用コードは [Obsolete] 警告のみで動作継続。破壊的変更なし。
  • 60+ の既存テスト (tests/rosettadds.Tests/Integration/*) はすべて緑のまま。
  • samples (TalkerListener / SpdpDemo) / Perf Runner / Unity は build 成功 (CS0618 warning のみ)。

テスト

  • 620 件全 PASS (並列実行で 3-4 件の既知 flaky: UdpTransportTests / PublisherBatchTests / SedpLoopback 系。分離実行では全 PASS。本変更と無関係)
  • 新規 Rcl テスト 45 件全 PASS
  • Unity .meta チェック: クリーン

Reviewer Feedback (final review 反映済み)

  • UserEntityIdAllocator を Context に移動 (複数 Node での endpoint GUID 衝突防止)
  • Node.Dispose() で DiscoveryDb イベント購読を解除 (メモリリーク対策)
  • NodeOptions.Logger を UserEndpointManager / SedpEndpointAdvertiser / Subscription / ServiceClient に wiring
  • Context.BuildParticipantData()internal
  • Context._sedpAdvertiser 削除 (未使用)
  • ✅ XML doc typo (生らす生やす) 修正

Follow-up (別 PR 予定)

  • README.ja.md / README.md を Rcl quickstart に更新
  • samples (TalkerListener / SpdpDemo) を Rcl 起点に書き換え
  • Unity tests / Perf Harness 内の DomainParticipant 参照を Rcl に移行
  • DomainParticipant の public DDS 詳細プロパティを段階的に [Obsolete]
  • 最終的には DomainParticipant 自体を削除

OJII3 added 25 commits July 2, 2026 13:57
…[Obsolete] 付与)

DomainParticipant は 518 行の monolithic な実装から約 90 行の thin wrapper に置き換え。
すべての実装は Rcl.Context + Rcl.Node に委譲し、DomainParticipant には [Obsolete] 属性を付与。
後方互換性のために公開 API (CreatePublisher/CreateSubscription/CreateServiceClient 等) は維持。

テスト側の GetSedpPublicationsWriter も DomainParticipant._context.Context._sedpPublicationsWriter
への二段階リフレクションに更新。
- UserEntityIdAllocator を Context に移動 (複数 Node での GUID 衝突防止)
- Node.Dispose() で DiscoveryDb イベント購読を解除
- NodeOptions.Logger を実際に wiring (fallback: Context.Logger)
- Context.BuildParticipantData() を internal に変更
- Context の未使用 _sedpAdvertiser を削除
- XML doc typo 修正 (生らす → 生やす)
- テスト追加: 同一 Context 上の 2 Node で EntityId 重複なし
@OJII3 OJII3 merged commit 86cba7f into main Jul 2, 2026
1 check failed
@OJII3 OJII3 deleted the rcl/context-node-design branch July 2, 2026 06:07
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.

1 participant