動的ポート add/del 内部実装¶
このページは 動的ポート add/del(概要ハブ) の派生で、daemon 単位の改修と race condition 解決設計 に絞る。概念は enhancements-to-add-or-del-ports-dynamically-concepts.md、設定 / 安全削除手順は enhancements-to-add-or-del-ports-dynamically-operations.md、HLD と実装の乖離は enhancements-to-add-or-del-ports-dynamically-limitations.md を参照。
1. 各 mgrd / orch の対応状況¶
| モジュール | 対応 |
|---|---|
portsyncd (SWSS) |
✅ ADD / DEL の追加対応必要 |
portsorch (SWSS) |
✅ flex counter 動的追加・削除を拡張 |
portmgrd |
既存ロジックで OK1 |
sflowmgr |
既存ロジックで OK1 |
teammgrd |
既存ロジックで OK(state-db set で再 enslave)1 |
macsecmgr |
既存ロジックで OK1 |
snmpagent |
既存ロジックで OK(リクエスト時に APP_DB を読む)1 |
xcvrd (PMON) |
既存 PR で対応済み(sonic-buildimage #8422、sonic-platform-daemons #212)1 |
buffermgrd |
改修必要(race condition 対応) |
lldpmgrd |
改修必要(host i/f up 確認、pending_cmds の cleanup) |
2. Flex counter の動的扱い(portsorch 拡張)¶
ポート単位で動的に作成・削除すべき counter group1:
PORT_BUFFER_DROP_STAT_FLEX_COUNTER_GROUP(既対応)PORT_STAT_COUNTER_FLEX_COUNTER_GROUP(既対応)- Queue port counters(queue / queue watermark)— 追加要
- PG counters — 追加要
- Debug counters: port ingress / egress drops(
DEBUG_COUNTERtable)— 追加要 - PFC watchdog counters — 追加要
これら counter は従来 init 完了後に 全ポートまとめて作成 されていた。動的化すれば未存在ポートに対する誤登録が消える1。実装は sonic-swss #2019 で対応中。
3. buffermgrd の改修と race condition¶
加入時 race¶
ユーザが port を追加 → buffer cfg を入れる順だが、port 加入と並行に buffermgr が cfg を見ると、APP_DB に未到着のうちに buffer cfg を流し込む可能性がある。APP_DB に port が存在することを buffermgr 側でチェックしてから書く 設計1。
削除時 race(深刻)¶
依存 buffer cfg を残したまま port を消すと、portsorch が SAI port を消す前に buffer cfg が残っていて SAI エラーが連発する。HLD の解決策1:
- buffer cfg にも per-port reference counter を持たせる(既存の ACL/VLAN/INTERFACE と同じ仕組み)
- ref-count > 0 の port は portsorch が削除を拒否する
- 結果として SAI エラーは「依存解除前に削除しようとした」warning 1 回に集約される
実装は sonic-swss #2022。
4. lldpmgrd の改修¶
既存実装の問題¶
- ポート追加直後の
lldpcli実行が host interface 未 up で失敗 する - 削除イベントが既に来ているのに
pending_cmdsに残ったコマンドが 10 秒ごとに実行され失敗し続ける1
提案¶
lldpcli実行前に STATE_DB の port エントリ(=host i/f 存在)を確認- APP_DB の del イベント受信時に
pending_cmdsから該当を 除去 - CONFIG_DB と APP_DB の両方を見る既存ロジックは整理する
📋 検証エビデンス: sonic-net/SONiC/doc/port-add-del-dynamically/dynamic_port_add_del_hld.md#L240-L284 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/port-add-del-dynamically/dynamic_port_add_del_hld.md#L240-L284 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
Need to add to orchagent the ability to add the buffer configuration of a port and increase a reference counter for each port,
in the same way ACL cfg on port is working.
... when a port is added - the lldpcli execution can failed since the host interface is not yet up.
判断根拠: buffer ref counter による delete ガードと lldp host-i/f チェックの根拠。
実装フェーズ境界¶
Phase 別の実装済 / 未実装 サマリ
本ページは monitor: partially_implemented で、HLD で示された一連の機能
が 段階的に取り込まれている 状態を扱う。フェーズ毎の実装境界を
1 枚の表に集約する (詳細は本ページ上部の diff admonition および
discrepancy-index を参照)。
| Phase | 範囲 (機能 / 段階) | 実装済 (master 取り込み済) | 未実装 (HLD 提案のみ) |
|---|---|---|---|
| Phase 1 — 基本機能 | HLD §概要 / §設計の中核ユースケース | 取り込み済 — 本ページの「実装の概観」「実装詳細」節および diff admonition の現状側を参照 |
— (Phase 1 は実装済) |
| Phase 2 — 拡張機能 | HLD §拡張 / §追加要件 / §周辺統合 | 一部のみ取り込み済 — 本ページ「実装詳細」の補足参照 | 未実装 / 未マージ — HLD §未対応箇所、本ページ「制限事項」および diff admonition の差分側に列挙 |
| Phase 3 — 将来拡張 | HLD §Future Work / §将来課題 | — | 未実装 — HLD 提案段階。対応 PR は確認されていない (last_verified 時点) |
凡例: 「実装済」=現行 master で動作確認できる範囲 / 「未実装」=HLD には記載があるが対応 PR が未マージまたは設計のみで code が存在しない範囲。