Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
sonic-swss/orchagent/portsorch.cpp で sai_port_api->create_ports(...) (l.1445) と sai_port_api->remove_ports(...) (l.1549) を bulk 呼出。sonic-sairedis/syncd/CommandLineOptionsParser.cpp に -l --enableBulk オプションあり(unittest/syncd/TestCommandLineOptions.cpp も同オプションをテスト)。SAI 側 create_ports / remove_ports シンボルは sonic-sairedis SAI submodule 経由で利用可能。
Port Profile Init(SAI bulk port API による fast-boot 高速化)¶
概要¶
従来の port 構成は SAI profile から事前作成 → PortsOrch が CONFIG_DB と比較し不一致 port を 個別に削除→再作成 する 2 phase。port 数だけ SAI/SDK 呼び出しが発生し fast-boot の 30 秒制約を圧迫していた1。SAI 側に bulk object API(create_ports / remove_ports / set_ports_attribute / get_ports_attribute)が追加された1ことを受け、PortsOrch を bulk 対応に拡張して呼び出し回数を削減する設計。CLI / DB schema / YANG / warm reboot は不変で、PortsOrch のみが変わる。
動作仕様¶
Bulk サポート判定¶
flowchart TD
INIT[PortsOrch 起動] --> Q1{sai_port_api->create_ports == NULL?}
Q1 -->|Yes| LEG[Legacy flow]
Q1 -->|No| EMPTY[空 list で create_ports 呼出]
EMPTY --> Q2{return == NOT_IMPLEMENTED<br/>or NOT_SUPPORTED?}
Q2 -->|Yes| LEG
Q2 -->|No| BULK[Bulk flow]
vendor SAI が空 list 呼び出しに対して SAI_STATUS_NOT_IMPLEMENTED / SAI_STATUS_NOT_SUPPORTED を返さないことが条件として要請される1。
syncd 側のフラグ¶
bulk API を実際に使うには syncd 起動時に -l / --enableBulk が必要1。指定しないと SAI bulk 呼び出しが内部で個別呼び出しに展開され、時間短縮効果が無くなる。各 vendor は config_syncd_vendor 関数(syncd_init_common.sh)で当該フラグを設定する。route / vlan / port 等 全 bulk 系がこのフラグ単一でまとめて on/off される 点に注意。
新フロー (doPortTask)¶
sequenceDiagram
participant CFG as CONFIG_DB PORT
participant APP as APPL_DB PORT
participant PO as PortsOrch
participant SAI as SAI / syncd
CFG->>APP: 全 port 設定 push (PortConfigDone)
APP->>PO: PortConfigDone flag
PO->>SAI: get_switch_attribute(PORT_LIST) (pre-created 取得)
PO->>PO: APP vs pre-created を全件比較
alt 削除対象あり
PO->>SAI: remove_ports([...])
end
PO->>SAI: create_ports([...])
PO->>SAI: set_ports_attribute([...])
Note over PO,SAI: HostIF 作成は今までどおり 1 by 1
ポイント1:
- bulk 経路では
PortConfigDoneflag が立つまで PortsOrch は port 適用を待つ(全 port 揃うまで bulk が成立しない) - HostIF 作成は引き続き port 単位(bulk 化対象外)
- bulk 失敗時はステータス配列を 1 件ずつチェック、create/remove で失敗があれば従来同様
runtime_errorを投げ Orch が request を破棄 - set_attribute の bulk 失敗は その属性だけ無視(従来挙動踏襲)
Legacy flow(fallback)¶
bulk 非対応 vendor では従来通り、個別 create_port / remove_port / set_port_attribute を port ごとに発行する1。Multi-ASIC は ASIC ごとに swss / Redis が独立しているため bulk 判定も ASIC 単位で行われる。
SAI API(参考)¶
sai_status_t create_ports(
sai_object_id_t switch_id, uint32_t object_count,
const uint32_t *attr_count, const sai_attribute_t **attr_list,
sai_bulk_op_error_mode_t mode,
sai_object_id_t *object_id, sai_status_t *object_statuses);
sai_status_t remove_ports(...);
sai_status_t set_ports_attribute(...);
sai_status_t get_ports_attribute(...);
参照: opencomputeproject/SAI PR #14601
📋 検証エビデンス: sonic-net/SONiC/doc/port-profile-init/port-profile-init-design.md#L60-L72 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/port-profile-init/port-profile-init-design.md#L60-L72 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
After feature is implemented, SAI initialization time should be reduced.
Hence, we expect fast-boot up time to meet max 30 seconds restriction.
判断根拠: 本機能の主要 goal が fast-boot 30s 達成にある根拠。
CLI / CONFIG_DB / YANG¶
本 HLD では 変更なし1。port table スキーマ・user 体験は同一で、内部の SAI 呼び出し方式だけ切替わる。
Warm boot / Fast boot¶
- Warm reboot: HW がすでに configured な状態で本 flow に入らないため影響なし1
- Fast reboot: API 呼び出し回数の大幅削減により up time が短縮(主要動機)
制限事項¶
- bulk が syncd 側
--enableBulk未指定だと効果無し - HostIF は port 単位のまま
create_portsの空 list 呼び出しの戻り値仕様に vendor SAI の協力が必要- multi-asic では ASIC ごとに bulk 可否が別判定
干渉する機能¶
- Dynamic Port Breakout: 動的な port 増減と bulk 適用の整合(HLD では未明記の懸念)
- fast reboot / fast-boot: 本機能の主要 KPI
- route / vlan の bulk: 同
--enableBulkフラグで一括制御