コンテンツにスキップ

STATE_DB COPP 状態テーブル

概要

STATE_DB には CoPP に関連する 3 つのテーブルが存在する。COPP_GROUP_TABLECOPP_TRAP_TABLEcoppmgrd が書き込む適用状態フラグであり、COPP_TRAP_TABLEhw_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 構造

COPP_GROUP_TABLE|<group-name>

<group-name>COPP_GROUP|<name> と同一(例: queue4_group1, default)。

フィールド

フィールド 説明
state string 常に "ok"。エントリの存在自体がグループが APP_DB に書き込まれたことを示す。

書き込みタイミング

coppmgrsetCoppGroupStateOk() が以下のタイミングで呼ばれる:

  1. 起動時 (CoppMgr コンストラクタ) — マージ後の group_cfgAPPL_DB に書き込んだ直後
  2. doCoppGroupTask() — CONFIG_DB の COPP_GROUP 変更受信後
  3. doCoppTrapTask() / setFeatureTrapIdsStatus() — トラップ追加・削除により trap_ids が変化した後

削除タイミング

delCoppGroupStateOk() は以下のタイミングで呼ばれる:

  • グループが pending 状態になったとき (feature 無効化によりグループに有効なトラップが 0 件になった場合)
  • doCoppGroupTask() の DEL 処理時

エントリ不在の意味

  • グループが pending 状態 — そのグループに関連する feature がすべて無効
  • または CoPP の初期処理未完了

COPP_TRAP_TABLE

key 構造

COPP_TRAP_TABLE|<trap-name>

<trap-name>COPP_TRAP|<name> と同一(例: bgp, arp, snmp_grp)。

フィールド

フィールド 書き手 説明
state string coppmgr 常に "ok"。エントリ存在 = トラップが coppmgr によって有効化済み。
hw_status string CoppOrch SAI 操作の結果。"installed" または "not-installed"

statehw_status同一テーブル・同一 key に異なるプロセスが書き込む独立したフィールド。

state フィールドの書き込みタイミング

setCoppTrapStateOk() が呼ばれる条件:

  1. 起動時 — is_always_enabled == "true" または feature が有効な場合
  2. doCoppTrapTask() — SET 操作の完了後
  3. feature 有効化時 (setFeatureTrapIdsStatus(feature, true))
  4. 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 構造

COPP_TRAP_CAPABILITY_TABLE|traps

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 の二重書き込み — statehw_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_missdefault_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-utilitiesdump 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

関連リファレンス

引用元


  1. sonic-swss/cfgmgr/coppmgr.cppsetCoppGroupStateOk() / setCoppTrapStateOk() の実装。 

  2. sonic-swss/orchagent/copporch.cppupdateTrapOperStatus() / publishTrapIdsCapability() の実装。 

  3. sonic-swss-common/common/schema.h L448-450 — テーブル名定数定義。