Skip to content

Implement HA-Scope actor #73

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 113 commits into from
Jul 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
f5bab90
Actor is able to export state in json
yue-fred-gao Apr 8, 2025
3a9d1a7
Show actor is working
yue-fred-gao Apr 11, 2025
1361995
Refactor show command directory structure
yue-fred-gao Apr 11, 2025
dc27897
Address lint issue
yue-fred-gao Apr 11, 2025
42da874
Fix link issue
yue-fred-gao Apr 11, 2025
1f3b5e8
Merge branch 'master' into bringup
yue-fred-gao Apr 15, 2025
f4650c6
Add new debug attributes in internal and incoming state table
yue-fred-gao Apr 15, 2025
9c5f103
Implemented swbus-edge reconnect logic
yue-fred-gao Apr 17, 2025
d3659fa
Merge branch 'master' into swbus-edge-reconnect
yue-fred-gao Apr 17, 2025
69e75bc
Merge branch 'master' into show_actor_state
yue-fred-gao Apr 17, 2025
77012c4
Fix issue after merge
yue-fred-gao Apr 17, 2025
a769fdc
Fix issue after merge
yue-fred-gao Apr 17, 2025
f278e58
Address review comment
yue-fred-gao Apr 26, 2025
f542ef8
Merge branch 'master' into show_actor_state
yue-fred-gao Apr 26, 2025
1ee3f27
Fix merge issue
yue-fred-gao Apr 26, 2025
97bd80c
Initialize hamgrd from config_db and connect to swbusd
yue-fred-gao Apr 30, 2025
0b2d5a5
Implement dynamically create/destroy actor
yue-fred-gao May 7, 2025
048ebbc
Misc changes
yue-fred-gao May 13, 2025
042ac6c
Make slot-id mandatory argument of hamgrd
yue-fred-gao May 16, 2025
81a238b
Remove unused include
yue-fred-gao May 16, 2025
61ca503
DPU actor is up
yue-fred-gao May 22, 2025
f9c001f
Undo the change of making swbusd listening on any
yue-fred-gao May 22, 2025
6528d55
Merge branch 'swbus-edge-reconnect' into dpu_actor
yue-fred-gao May 23, 2025
cb8284b
DPU actor is up and bfd_session_table is sent
yue-fred-gao May 23, 2025
2d8cecc
extract create_actor_runtime function in actors/test.rs
yue-fred-gao May 26, 2025
3c5d814
Add sink message handler to catch noroute message
yue-fred-gao May 26, 2025
437bab9
vdpu actor implemenation
yue-fred-gao May 27, 2025
a0cd93e
parked
yue-fred-gao May 28, 2025
6f3107e
Create DPU actor from remote_dpu entry
yue-fred-gao May 30, 2025
3cd13d8
Merge branch 'dpu_actor' into vdpu_actor
yue-fred-gao Jun 2, 2025
65da9dd
Minor changes
yue-fred-gao Jun 2, 2025
fb935d7
Merge branch 'vdpu_actor' into haset_actor
yue-fred-gao Jun 2, 2025
0b2b1bc
Create common start_actor_creator in DbBasedActor
yue-fred-gao Jun 2, 2025
0016b56
Merge branch 'vdpu_actor' into haset_actor
yue-fred-gao Jun 2, 2025
6fa4865
Simplify vdpustate since we only support one dpu
yue-fred-gao Jun 3, 2025
c323a70
Merge branch 'vdpu_actor' into haset_actor
yue-fred-gao Jun 3, 2025
f573eb1
Spawn producer bridge in the main
yue-fred-gao Jun 3, 2025
53b87c7
ha_set actor
yue-fred-gao Jun 4, 2025
7b1d9ee
Misc
yue-fred-gao Jun 5, 2025
3a621b7
Merge branch 'dpu_actor' into haset_actor
yue-fred-gao Jun 5, 2025
9b1d828
ha-set actor verified
yue-fred-gao Jun 5, 2025
8b74cd5
Merge branch 'master' into dpu_actor
yue-fred-gao Jun 6, 2025
6b784f2
Merge branch 'dpu_actor' into haset_actor
yue-fred-gao Jun 6, 2025
35d8221
Minor fix
yue-fred-gao Jun 6, 2025
674215c
Correct DASH_HA_SET_CONFIG_TABLE to APPL_DB
yue-fred-gao Jun 6, 2025
763a941
Implement ha-scope actor
yue-fred-gao Jun 9, 2025
4be5598
Change field_values deserializer to support serde(default)
yue-fred-gao Jun 10, 2025
e8537ff
Merge branch 'serde_default' into dpu_actor
yue-fred-gao Jun 10, 2025
32b72c0
Change DPU actor to send dpu_state and bfd_probe_state in DpuActorState
yue-fred-gao Jun 10, 2025
7181575
Merge branch 'dpu_actor' into vdpu_actor
yue-fred-gao Jun 10, 2025
ebef39e
Merge branch 'dpu_actor' into haset_actor
yue-fred-gao Jun 10, 2025
9c1e01b
Merge branch 'haset_actor' into hascope_actor
yue-fred-gao Jun 10, 2025
c659f10
Handle the case that struct only defines a subset of a FieldValues
yue-fred-gao Jun 11, 2025
b6acc2a
Merge branch 'serde_default' into hascope_actor
yue-fred-gao Jun 11, 2025
aeb97b8
Change creating bfd after receiving role activated notification
yue-fred-gao Jun 12, 2025
669e9a7
Merge branch 'dpu_actor' into vdpu_actor
yue-fred-gao Jun 12, 2025
c6c64d5
Handle HaRoleActivated message
yue-fred-gao Jun 12, 2025
61a39fb
Merge branch 'dpu_actor' into hascope_actor
yue-fred-gao Jun 12, 2025
09a949a
Merge branch 'swbus-edge-reconnect' into dpu_actor
yue-fred-gao Jun 12, 2025
b11b72c
Add chkdb macro to hamgrd actor tests
yue-fred-gao Jun 13, 2025
4c21603
Merge branch 'haset_actor' into hascope_actor
yue-fred-gao Jun 13, 2025
53a7f8b
Add missing change
yue-fred-gao Jun 13, 2025
520b7c1
Merge branch 'haset_actor' into hascope_actor
yue-fred-gao Jun 13, 2025
86a4705
Add missing change
yue-fred-gao Jun 13, 2025
c9495c7
Introduce sonicdb macro to add adjunt info to struct
yue-fred-gao Jun 16, 2025
9530305
Merge branch 'master' into sonicdb_macro
yue-fred-gao Jun 16, 2025
aae73ff
Merge branch 'master' into hascope_actor
yue-fred-gao Jun 16, 2025
faa9b8b
Merge branch 'sonicdb_derive' into hascope_actor
yue-fred-gao Jun 16, 2025
b0aa93c
Change key_separator to char type
yue-fred-gao Jun 16, 2025
258f428
Merge branch 'sonicdb_derive' into hascope_actor
yue-fred-gao Jun 16, 2025
cd8ea7a
Implement ha-scope actor
yue-fred-gao Jun 16, 2025
6d190a3
Allow dpu shutdown bfd sessions during planned shutdown
yue-fred-gao Jun 16, 2025
e9d68d2
Merge branch 'dpu_actor' into hascope_actor
yue-fred-gao Jun 16, 2025
f233da4
Merge branch 'master' into dpu_actor
yue-fred-gao Jun 16, 2025
3b6f1ca
Merge branch 'sonicdb_derive' into dpu_actor
yue-fred-gao Jun 16, 2025
75c5425
Use sonicdb-derive to avoid boilerplate code
yue-fred-gao Jun 16, 2025
eaaeb3e
Merge branch 'master' into vdpu_actor
yue-fred-gao Jun 16, 2025
de8f509
Merge branch 'sonicdb_derive' into vdpu_actor
yue-fred-gao Jun 16, 2025
0680f07
Merge branch 'dpu_actor' into vdpu_actor
yue-fred-gao Jun 16, 2025
e27513d
Use sonicdb-derive to remove boilerplate code
yue-fred-gao Jun 16, 2025
e87617c
Merge branch 'master' into haset_actor
yue-fred-gao Jun 16, 2025
7aabc46
Merge branch 'sonicdb_derive' into haset_actor
yue-fred-gao Jun 16, 2025
7ed6bf6
Merge branch 'vdpu_actor' into haset_actor
yue-fred-gao Jun 16, 2025
9875c96
Use sonicdb-derive to remove boilerplate code
yue-fred-gao Jun 17, 2025
20f20a4
Upload test_utils for running hamgrd from workspace
yue-fred-gao Jun 3, 2025
c1b9b63
Reformat
yue-fred-gao Jun 3, 2025
3665f2e
Add DPU_APPL_DB
yue-fred-gao Jun 5, 2025
12f5928
Merge branch 'test_utils' into haset_actor
yue-fred-gao Jun 17, 2025
8aba7e0
Add ha-set config
yue-fred-gao Jun 17, 2025
9317d89
Merge branch 'serde_default' into haset_actor
yue-fred-gao Jun 17, 2025
c8113ac
Merge branch 'haset_actor' into hascope_actor
yue-fred-gao Jun 17, 2025
0fdda62
use sonicdb-derive to remove boilerplate code
yue-fred-gao Jun 17, 2025
59fbdb4
Merge branch 'test_utils' into hascope_actor
yue-fred-gao Jun 17, 2025
9f43ac0
Add dash_ha_scope_config_table
yue-fred-gao Jun 17, 2025
cd18c5f
Handle HaSetActorState update
yue-fred-gao Jun 17, 2025
12359b2
Merge branch 'haset_actor' into hascope_actor
yue-fred-gao Jun 17, 2025
5894174
Merge branch 'test_utils' into hascope_actor
yue-fred-gao Jun 17, 2025
8dc5365
ha planned up/down tested end to end in simulated env
yue-fred-gao Jun 17, 2025
0d75559
Added test data for ha planned up and down
yue-fred-gao Jun 17, 2025
83699d3
Merge branch 'test_utils' into hascope_actor
yue-fred-gao Jun 17, 2025
148482b
Fix lint warning
yue-fred-gao Jun 17, 2025
8c0285d
Adding debug message to trouble shoot ci issue
yue-fred-gao Jun 18, 2025
8327f8a
Fix CI issue "SonicDBConfig already initialized"
yue-fred-gao Jun 18, 2025
611952e
Merge branch 'dpu_actor' into vdpu_actor
yue-fred-gao Jun 18, 2025
2d95dd2
Merge branch 'vdpu_actor' into haset_actor
yue-fred-gao Jun 18, 2025
aa36b1d
Merge branch 'dpu_actor' into hascope_actor
yue-fred-gao Jun 18, 2025
717cb59
Fix doc compilation issue
yue-fred-gao Jun 18, 2025
7f77a80
Merge branch 'master' into sonicdb_macro
yue-fred-gao Jun 18, 2025
8a61f0f
Fix doc compilation issue
yue-fred-gao Jun 18, 2025
b046811
Save consumer bridges in case we need to kill them
yue-fred-gao Jun 27, 2025
d776a04
Merge branch 'master' into hascope_actor
yue-fred-gao Jul 5, 2025
ad0bd26
Misc changes
yue-fred-gao Jul 6, 2025
3a0dcde
Remove unused stuff
yue-fred-gao Jul 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ serde = { version = "1", features = ["derive", "rc"] }
serde_json = "1"
serde_yaml = "0.9"
serde_with = "3.12"

# Command line utils
clap = { version = "4", features = ["derive", "cargo", "wrap_help", "unicode", "string", "unstable-styles"] }
color-eyre = "0.6"
Expand Down
1 change: 1 addition & 0 deletions crates/hamgrd/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ serde_with.workspace = true
clap.workspace = true
tracing.workspace = true
chrono.workspace = true
uuid.workspace = true

[dev-dependencies]
serde_json.workspace = true
25 changes: 15 additions & 10 deletions crates/hamgrd/src/actors.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
//! Actors
//!
//! <https://github.com/r12f/SONiC/blob/user/r12f/hamgrd/doc/smart-switch/high-availability/smart-switch-ha-hamgrd.md#2-key-actors>
// temporarily disable unused warning until vdpu/ha-set actors are implemented
#![allow(unused)]

pub mod dpu;
pub mod ha_scope;
pub mod ha_set;
Expand All @@ -12,7 +9,6 @@ pub mod vdpu;
#[cfg(test)]
pub mod test;
use anyhow::Result as AnyhowResult;
use std::any;
use std::sync::Arc;
use swbus_actor::{spawn, Actor, ActorMessage};
use swbus_edge::swbus_proto::message_id_generator::MessageIdGenerator;
Expand All @@ -23,10 +19,10 @@ use swss_common::{
KeyOpFieldValues, KeyOperation, ProducerStateTable, SonicDbTable, SubscriberStateTable, ZmqClient,
ZmqProducerStateTable,
};
use swss_common_bridge::{consumer::spawn_consumer_bridge, consumer::ConsumerBridge, producer::spawn_producer_bridge};
use swss_common_bridge::{consumer::ConsumerBridge, producer::spawn_producer_bridge};
use tokio::sync::mpsc::{channel, Receiver};
use tokio::task::JoinHandle;
use tracing::error;
use tracing::{error, info};

pub trait DbBasedActor: Actor {
fn name() -> &'static str;
Expand All @@ -35,7 +31,7 @@ pub trait DbBasedActor: Actor {
where
Self: Sized;

async fn start_actor_creator<T>(edge_runtime: Arc<SwbusEdgeRuntime>) -> AnyhowResult<()>
async fn start_actor_creator<T>(edge_runtime: Arc<SwbusEdgeRuntime>) -> AnyhowResult<Vec<ConsumerBridge>>
where
Self: Sized,
T: SonicDbTable + 'static,
Expand All @@ -53,7 +49,7 @@ pub trait DbBasedActor: Actor {
let sst = SubscriberStateTable::new_async(config_db, T::table_name(), None, None).await?;
let addr = crate::common_bridge_sp::<T>(&edge_runtime);
let base_addr = edge_runtime.get_base_sp();
spawn_consumer_bridge(
Ok(vec![ConsumerBridge::spawn(
edge_runtime.clone(),
addr,
sst,
Expand All @@ -64,8 +60,7 @@ pub trait DbBasedActor: Actor {
(addr, T::table_name().to_owned())
},
|_| true,
);
Ok(())
)])
}
}

Expand Down Expand Up @@ -274,6 +269,11 @@ where
let zpst = ZmqProducerStateTable::new(dpu_appl_db, T::table_name(), zmqc, false).unwrap();

let sp = crate::common_bridge_sp::<T>(&edge_runtime);
info!(
"spawned ZMQ producer bridge for {} at {}",
T::table_name(),
sp.to_longest_path()
);
Ok(spawn_producer_bridge(edge_runtime.clone(), sp, zpst))
} else {
if std::env::var("SIM").is_err() {
Expand All @@ -283,6 +283,11 @@ where
let pst = ProducerStateTable::new(dpu_appl_db, T::table_name()).unwrap();

let sp = crate::common_bridge_sp::<T>(&edge_runtime);
info!(
"spawned producer bridge for {} at {}",
T::table_name(),
sp.to_longest_path()
);
Ok(spawn_producer_bridge(edge_runtime.clone(), sp, pst))
}
}
29 changes: 13 additions & 16 deletions crates/hamgrd/src/actors/dpu.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
use crate::actors::{spawn_consumer_bridge_for_actor, spawn_zmq_producer_bridge, ActorCreator};
use crate::actors::{spawn_consumer_bridge_for_actor, ActorCreator};
use crate::db_structs::{
BfdSessionTable, DashBfdProbeState, DashHaGlobalConfig, Dpu, DpuPmonStateType, DpuState, RemoteDpu,
};
use crate::ha_actor_messages::{ActorRegistration, DpuActorState, RegistrationType};
use crate::ServicePath;
use anyhow::{anyhow, Result};
use serde::{Deserialize, Serialize};
use serde_with::{formats::CommaSeparator, serde_as, StringWithSeparator};
use std::collections::HashSet;
use std::sync::Arc;
use swbus_actor::{state::incoming::Incoming, state::outgoing::Outgoing, Actor, ActorMessage, Context, State};
use swbus_edge::SwbusEdgeRuntime;
use swss_common::{KeyOpFieldValues, KeyOperation, SonicDbTable, SubscriberStateTable};
use swss_common_bridge::consumer::{spawn_consumer_bridge, ConsumerBridge};
use tracing::{debug, error, info};
use swss_common_bridge::consumer::ConsumerBridge;
use tracing::{debug, error, info, instrument};

use super::spawn_consumer_bridge_for_actor_with_selector;

Expand Down Expand Up @@ -78,7 +76,8 @@ impl DpuActor {
}

// DpuActor is spawned in response to swss-common-bridge message for DPU and REMOTE_DPU table
pub async fn start_actor_creator(edge_runtime: Arc<SwbusEdgeRuntime>) -> Result<()> {
pub async fn start_actor_creator(edge_runtime: Arc<SwbusEdgeRuntime>) -> Result<Vec<ConsumerBridge>> {
let mut bridges = Vec::new();
let dpu_ac = ActorCreator::new(
edge_runtime.new_sp(Self::name(), ""),
edge_runtime.clone(),
Expand All @@ -93,7 +92,7 @@ impl DpuActor {
let sst = SubscriberStateTable::new_async(config_db, Self::dpu_table_name(), None, None).await?;
let addr = crate::common_bridge_sp::<Dpu>(&edge_runtime);
let base_addr = edge_runtime.get_base_sp();
spawn_consumer_bridge(
bridges.push(ConsumerBridge::spawn(
edge_runtime.clone(),
addr,
sst,
Expand All @@ -104,13 +103,13 @@ impl DpuActor {
(addr, Self::dpu_table_name().to_owned())
},
|_| true,
);
));

let config_db = crate::db_named(RemoteDpu::db_name()).await?;
let sst = SubscriberStateTable::new_async(config_db, Self::remote_dpu_table_name(), None, None).await?;
let addr = crate::common_bridge_sp::<RemoteDpu>(&edge_runtime);
let base_addr = edge_runtime.get_base_sp();
spawn_consumer_bridge(
bridges.push(ConsumerBridge::spawn(
edge_runtime.clone(),
addr,
sst,
Expand All @@ -121,8 +120,8 @@ impl DpuActor {
(addr, Self::remote_dpu_table_name().to_owned())
},
|_| true,
);
Ok(())
));
Ok(bridges)
}

async fn handle_dpu_message(&mut self, state: &mut State, key: &str, context: &mut Context) -> Result<()> {
Expand All @@ -140,7 +139,6 @@ impl DpuActor {
let npu_ipv6: Option<String> = crate::get_npu_ipv6(context.get_edge_runtime()).map(|ip| ip.to_string());
let dpu_id = dpu.dpu_id;
let is_managed = dpu.dpu_id == crate::get_slot_id(context.get_edge_runtime());
let zmq_endpoint = format!("{}:{}", dpu.midplane_ipv4, dpu.orchagent_zmq_port);

let first_time = self.dpu.is_none();
self.dpu = Some(DpuData::LocalDpu {
Expand Down Expand Up @@ -263,7 +261,6 @@ impl DpuActor {
outgoing: &mut Outgoing,
target_actor: Option<ServicePath>,
) -> Result<()> {
let mut up = false;
let Some(ref dpu_data) = self.dpu else {
return Ok(());
};
Expand Down Expand Up @@ -421,8 +418,7 @@ impl DpuActor {
}
}

fn handle_dash_ha_global_config(&mut self, state: &mut State, key: &str) -> Result<()> {
let incoming = state.incoming();
fn handle_dash_ha_global_config(&mut self, state: &mut State) -> Result<()> {
self.update_bfd_sessions(state)?;
Ok(())
}
Expand All @@ -436,6 +432,7 @@ impl DpuActor {
}

impl Actor for DpuActor {
#[instrument(name="handle_message", level="info", skip_all, fields(actor=format!("dpu/{}", self.id), key=key))]
async fn handle_message(&mut self, state: &mut State, key: &str, context: &mut Context) -> Result<()> {
let (_internal, incoming, outgoing) = state.get_all();
if key == Self::dpu_table_name() {
Expand All @@ -456,7 +453,7 @@ impl Actor for DpuActor {
if !self.is_local_managed() {
return Ok(());
} else if key == DashHaGlobalConfig::table_name() {
return self.handle_dash_ha_global_config(state, key);
return self.handle_dash_ha_global_config(state);
} else if key == DpuState::table_name() || key == DashBfdProbeState::table_name() {
return self.update_dpu_state(incoming, outgoing, None);
} else {
Expand Down
Loading
Loading