STATE_DB COPP 状態テーブル¶
概要¶
STATE_DB には CoPP に関連する 3 つのテーブルが存在する。COPP_GROUP_TABLE と COPP_TRAP_TABLE は coppmgrd が書き込む適用状態フラグであり、COPP_TRAP_TABLE の hw_status フィールドは orchagent (CoppOrch) が SAI 操作の結果を反映する。COPP_TRAP_CAPABILITY_TABLE はプラットフォームがサポートするトラップ ID 一覧を CoppOrch 初期化時に公開する。
テーブル一覧¶
| テーブル名 | キー | 書き手 | 役割 |
|---|---|---|---|
COPP_GROUP_TABLE |
グループ名 | coppmgr |
グループの適用状態 (state) |
COPP_TRAP_TABLE |
トラップ名 | coppmgr + CoppOrch |
トラップの適用状態 (state) と SAI 状態 (hw_status) |
COPP_TRAP_CAPABILITY_TABLE |
traps (固定) |
CoppOrch |
SAI capability — プラットフォームがサポートするトラップ ID 一覧 |
COPP_GROUP_TABLE¶
key 構造¶
<group-name> は COPP_GROUP|<name> と同一(例: queue4_group1, default)。
フィールド¶
| フィールド | 型 | 説明 |
|---|---|---|
state |
string | 常に "ok"。エントリの存在自体がグループが APP_DB に書き込まれたことを示す。 |
書き込みタイミング¶
coppmgr の setCoppGroupStateOk() が以下のタイミングで呼ばれる:
- 起動時 (
CoppMgrコンストラクタ) — マージ後のgroup_cfgを APPL_DB に書き込んだ直後 doCoppGroupTask()— CONFIG_DB のCOPP_GROUP変更受信後doCoppTrapTask()/setFeatureTrapIdsStatus()— トラップ追加・削除により trap_ids が変化した後
削除タイミング¶
delCoppGroupStateOk() は以下のタイミングで呼ばれる:
- グループが pending 状態になったとき (feature 無効化によりグループに有効なトラップが 0 件になった場合)
doCoppGroupTask()の DEL 処理時
エントリ不在の意味¶
- グループが pending 状態 — そのグループに関連する feature がすべて無効
- または CoPP の初期処理未完了
COPP_TRAP_TABLE¶
key 構造¶
<trap-name> は COPP_TRAP|<name> と同一(例: bgp, arp, snmp_grp)。
フィールド¶
| フィールド | 型 | 書き手 | 説明 |
|---|---|---|---|
state |
string | coppmgr |
常に "ok"。エントリ存在 = トラップが coppmgr によって有効化済み。 |
hw_status |
string | CoppOrch |
SAI 操作の結果。"installed" または "not-installed"。 |
state と hw_status は同一テーブル・同一 key に異なるプロセスが書き込む独立したフィールド。
state フィールドの書き込みタイミング¶
setCoppTrapStateOk() が呼ばれる条件:
- 起動時 —
is_always_enabled == "true"または feature が有効な場合 doCoppTrapTask()— SET 操作の完了後- feature 有効化時 (
setFeatureTrapIdsStatus(feature, true)) - DEL 後に init cfg に同名キーが存在する場合の自動復元時
delCoppTrapStateOk() が呼ばれる条件:
- feature 無効化後にグループが pending →
setFeatureTrapIdsStatus(feature, false)経路 doCoppTrapTask()の DEL 処理時
hw_status フィールドの書き込みタイミング¶
CoppOrch::updateTrapOperStatus() が呼ばれる:
| 値 | タイミング | ソース行 |
|---|---|---|
"installed" |
sai_hostif_api->create_hostif_trap() 成功後 |
copporch.cpp:526 |
"not-installed" |
sai_hostif_api->remove_hostif_trap() 成功後 |
copporch.cpp:1413 |
key は get_trap_name_by_type() で sai_hostif_trap_type_t を文字列に変換したもの(trap_id_map の逆引き)。
エントリ不在の意味¶
stateなし → coppmgr がトラップをまだ有効化していない(pending / feature 無効 / DEL 済み)hw_statusなし → CoppOrch がそのトラップに対して SAI 操作をまだ実行していない
COPP_TRAP_CAPABILITY_TABLE¶
key 構造¶
key は常に traps 固定。
フィールド¶
| フィールド | 型 | 説明 |
|---|---|---|
trap_ids |
string | プラットフォームがサポートするトラップ ID 名のカンマ区切りリスト |
書き込みタイミング¶
CoppOrch コンストラクタの publishTrapIdsCapability() が orchagent 起動時に 1 回だけ書き込む。
値の決定ロジック¶
sai_query_attribute_enum_values_capability() 成功
→ SAI が返したトラップ ID を文字列リストに変換して書き込み
sai_query_attribute_enum_values_capability() 失敗
→ default_supported_trap_ids (静的リスト, 42 種) にフォールバック
フォールバックリストには neighbor_miss が意図的に含まれない(コードコメント: "This list is intended to remain static and should not be updated with new traps.")。
コード由来の暗黙デフォルト (Phase A)¶
state フィールド — 値は常に "ok" でハードコード¶
setCoppGroupStateOk() と setCoppTrapStateOk() はともに文字列 "ok" をハードコードで書き込む。外部設定やフィールドの選択肢は存在しない。エントリの存在/不在がステータスを表す二値表現。
hw_status フィールド — 値は "installed" / "not-installed" の 2 値のみ¶
updateTrapOperStatus() に渡される文字列はコード内で直接指定される ("installed" または "not-installed")。中間状態を表す値は存在しない。
COPP_TRAP_TABLE の二重書き込み — state と hw_status の非同期¶
state (coppmgr) と hw_status (copporch) は同一 Redis key に別プロセスが独立して書き込む。state=ok であっても hw_status がまだ存在しない(SAI 登録前)、あるいは逆に hw_status=installed であっても state が存在しない(coppmgr での DEL 後に orchagent がまだ操作を受け取っていない)状態が短時間発生しうる。
COPP_TRAP_CAPABILITY_TABLE — フォールバック時の neighbor_miss silent drop¶
SAI capability query が失敗した場合、neighbor_miss は default_supported_trap_ids に含まれないため supported_trap_ids セットに登録されない。結果として neighbor_miss trap を含む COPP グループは SAI への適用がスキップされ、ログ (SWSS_LOG_NOTICE("Ignoring the trap_id: %s, since not supported by vendor SAI", ...)) のみが出力される。
hw_status キーの導出 — trap_id_map 逆引き¶
updateTrapOperStatus() は get_trap_name_by_type() で sai_hostif_trap_type_t を文字列に変換する。trap_id_map に存在しない SAI 内部トラップ型は文字列変換に失敗し、SWSS_LOG_ERROR を出力したうえで COPP_TRAP_TABLE への書き込みをスキップする。
スキャン証跡: coppmgr.cpp L424-451 全行読了。copporch.cpp L104-300, L499-540, L1390-1420 読了。schema.h L448-450 読了。state_db.json (UT mock) 読了。発見 4 件。
確認コマンド¶
# グループ状態確認
sonic-db-cli STATE_DB hgetall 'COPP_GROUP_TABLE|queue4_group1'
# トラップ状態確認
sonic-db-cli STATE_DB hgetall 'COPP_TRAP_TABLE|bgp'
# プラットフォームサポートトラップ一覧
sonic-db-cli STATE_DB hgetall 'COPP_TRAP_CAPABILITY_TABLE|traps'
# 全 COPP 状態を一覧
sonic-db-cli STATE_DB keys 'COPP_*TABLE|*'
購読者¶
sonic-utilitiesのdump coppプラグイン (dump/plugins/copp.py): デバッグ用にすべての COPP 関連 DB エントリを集約して表示
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
COPP_GROUP,COPP_TRAP - 関連 CLI:
show copp config,show copp policer,sonic-db-cli STATE_DB
関連リファレンス¶
- CONFIG_DB:
COPP_GROUP - CONFIG_DB:
COPP_TRAP