コンテンツにスキップ

APPL_DB PORT_TABLE

概要

APPL_DB PORT_TABLE は物理ポートの実効設定と運用状態を保持する APPL_DB テーブル。 CONFIG_DB PORT テーブルとは別物であり、以下の 3 つのプロセスが書き込む123:

  1. portsyncd — 起動時に CONFIG_DB PORT テーブルの全フィールドを APPL_DB に転写する
  2. portmgrd — CONFIG_DB の変更を監視し、admin_status / mtu の変更を APPL_DB に反映する。初回書き込み時はコード由来のデフォルト値を補完する
  3. orchagent (PortsOrch) — SAI から通知を受けた oper_status / flap_count / last_up_time / last_down_time を書き戻す
flowchart LR
  CDB[("CONFIG_DB\nPORT")]
  PSYNC["portsyncd\n(全フィールド転写)"]
  PMGR["portmgrd\n(admin_status/mtu)"]
  APPDB[("APPL_DB\nPORT_TABLE")]
  ORCH["orchagent\nPortsOrch"]
  SAI["SAI\nsai_port_api"]
  CDB --> PSYNC --> APPDB
  CDB --> PMGR --> APPDB
  APPDB --> ORCH --> SAI
  SAI --> ORCH
  ORCH --> APPDB

key 構造

PORT_TABLE:<port_name>

<port_name>Ethernet<N> 形式の物理ポート名。

フィールド一覧

フィールド 書き込み元 デフォルト 説明
admin_status up/down portsyncd / portmgrd "down" ※1 管理状態
mtu uint (68..9216) portsyncd / portmgrd "9100" ※2 MTU [byte]
speed uint [Mbps] portsyncd CONFIG_DB の値 ポート速度
lanes string portsyncd CONFIG_DB の値 ハードウェアレーン番号
alias string portsyncd CONFIG_DB の値 ポート別名
index uint portsyncd CONFIG_DB の値 フロントパネルポートインデックス
description string portsyncd CONFIG_DB の値 ユーザ定義説明
fec rs/fc/none/auto portsyncd CONFIG_DB の値 FEC モード
autoneg on/off portsyncd CONFIG_DB の値 オートネゴシエーション
link_training on/off portsyncd CONFIG_DB の値 リンクトレーニング
adv_speeds uint list portsyncd CONFIG_DB の値 広告速度
interface_type string portsyncd CONFIG_DB の値 インタフェースタイプ
pfc_asym on/off portsyncd CONFIG_DB の値 非対称 PFC
tpid hex string portsyncd CONFIG_DB の値 TPID
subport uint portsyncd CONFIG_DB の値 breakout サブポート番号
oper_status up/down orchagent "down" ※3 実効運用状態
flap_count uint64 orchagent (フラップ発生後) ポートフラップ累積回数
last_down_time string (UTC) orchagent (フラップ発生後) 最後に DOWN した時刻
last_up_time string (UTC) orchagent (フラップ発生後) 最後に UP した時刻
system_oper_status up/down orchagent (Gearbox 環境のみ) Gearbox system side oper status
line_oper_status up/down orchagent (Gearbox 環境のみ) Gearbox line side oper status

※1, ※2, ※3 は「コード由来の暗黙デフォルト」参照

購読者

  • orchagent (PortsOrch): PORT_TABLESubscriberStateTable / Table で読み取り、SAI に反映する。PortsOrch は PORT_TABLE の oper_status / flap_count を書き戻す唯一のプロセス
  • linkmgrd: mux_cable フラグを含むポートを検索するために読み込む
  • 各種 orchs: IntfsOrch / BufferOrch 等が PORT_TABLE の oper_status 変化を受けて副次処理を実行

コード由来の暗黙デフォルト (Phase A)

注記: YANG default 指定がない APPL_DB フィールドでも、portmgrd / orchagent がコード内でデフォルト値を注入する。以下は実装精読から検出した暗黙デフォルトと挙動。

admin_status

  • portmgr.h:14 #define DEFAULT_ADMIN_STATUS_STR "down" でハードコード
  • portmgrd が初回 SET 時(ポートが m_portList に未登録)に CONFIG_DB に admin_status フィールドが存在しなければ "down" を APPL_DB に書き込む (portmgr.cpp:175)
  • 初回 SET ではまず CONFIG_DB の値で上書きし、CONFIG_DB に値がない場合のみデフォルトが使われる (portmgr.cpp:186-198)
  • portsyncd は CONFIG_DB PORT テーブルの admin_status をそのまま転写するが、CONFIG_DB に値がない場合は転写されない

暗黙デフォルト: "down" (portmgrd が CONFIG_DB に admin_status がないときに注入)

mtu

  • portmgr.h:15 #define DEFAULT_MTU_STR "9100" でハードコード
  • portmgrd 初回 SET 時に CONFIG_DB に mtu フィールドがなければ "9100" を APPL_DB に注入 (portmgr.cpp:176)
  • port.h には DEFAULT_MTU 1492 という別の定数も存在する。これは orchagent 内部の Port struct の初期値であり (port.h:194)、SAI デフォルト MTU (1514) から ethernet header/FCS 22 bytes を引いた値。APPL_DB に書かれる portmgrd のデフォルト 9100 とは別物であり混同に注意
  • portmgrd が SAI に渡す際には mtu 値に 22 bytes を加算する (ethernet header + FCS 対応、portsorch 内)

暗黙デフォルト: "9100" (portmgrd fallback; CONFIG_DB に mtu フィールドがない場合)

oper_status

  • orchagent (PortsOrch) がポート初期化時に m_portTable->hset(port.m_alias, "oper_status", "down") を書き込む (portsorch.cpp:6643)
  • SAI から port oper status 変化通知を受信したとき、updateDbPortOperStatus()"up" または "down" に更新 (portsorch.cpp:3928)
  • warmboot 時は m_portTable->get() で既存値を読み戻し、"up" なら SAI_PORT_OPER_STATUS_UP として m_oper_status を初期化 (portsorch.cpp:6617-6647)
  • SAI_PORT_OPER_STATUS_UNKNOWNoper_status_strings マップに定義されていないため、該当状態を受信すると std::out_of_range 例外が発生する可能性がある

暗黙デフォルト: "down" (orchagent がポート初期化時に書き込む値)

flap_count

  • Port struct の m_flap_count = 0 が初期値 (port.h:235)
  • フラップ発生前は APPL_DB に flap_count フィールドが存在しない
  • ポートフラップ発生時に updateDbPortFlapCount() が累積カウンタを APPL_DB に書き込む (portsorch.cpp:3867-3870)
  • warmboot 時は既存の flap_count を読み戻して継続 (portsorch.cpp:6655-6656)

暗黙デフォルト: 初期書き込みなし (フラップ発生後に初めて存在する)

last_down_time / last_up_time

  • updateDbPortFlapCount() 内でポートが DOWN/UP になった時刻を "%a %b %d %H:%M:%S %Y" (UTC) 形式で記録 (portsorch.cpp:3878, 3887)
  • フラップ発生前は APPL_DB に該当フィールドが存在しない

暗黙デフォルト: 存在しない (フラップ初回発生で初期化)

system_oper_status / line_oper_status (Gearbox 専用)

  • updateGearboxPortOperStatus() が gearbox 環境 (isGearboxEnabled() が true) でのみ書き込む (portsorch.cpp:11220-11261)
  • gearbox 未使用の通常環境では APPL_DB にこれらのフィールドは書かれない

暗黙デフォルト: gearbox 未使用時は存在しない

speed / fec / lanes 等 (portsyncd パススルー)

  • portsyncd は CONFIG_DB PORT テーブルの全フィールドを APPL_DB にそのままコピーする (portsyncd.cpp:196-208)
  • speed / fec / lanes / alias 等のデフォルト値は CONFIG_DB 側 (sonic-port.yang / port_config.ini) が決定する
  • orchagent の updateDbPortOperSpeed() / updateDbPortOperFec()STATE_DB (m_portStateTable) に書くため APPL_DB の値は変わらない

暗黙デフォルト: CONFIG_DB の値をそのままパススルー

CONFIG_DB PORT との対応

側面 CONFIG_DB PORT APPL_DB PORT_TABLE
書き込み元 CLI / sonic-cfggen / db_migrator portsyncd / portmgrd / orchagent
主な用途 設定の永続化 orchagent への設定伝達 + 運用状態の公開
oper_status なし あり (orchagent が SAI から書き戻す)
flap_count なし あり (orchagent が書き込む)
last_up/down_time なし あり (orchagent が書き込む)

確認コマンド

# APPL_DB PORT_TABLE を直接参照
sonic-db-cli APPL_DB hgetall 'PORT_TABLE:Ethernet0'

# 全ポートの oper_status を確認
show interfaces status

# APPL_DB と CONFIG_DB の差分確認
sonic-db-cli APPL_DB hget 'PORT_TABLE:Ethernet0' oper_status
sonic-db-cli CONFIG_DB hget 'PORT|Ethernet0' admin_status

関連リファレンス

引用元