Skip to content

Refactor ws_host_service_stats.rs to reduce cognitive_complexity and add test coverage #214

@mukeshblackhat

Description

@mukeshblackhat

ws_host_service_stats.rs has two suppressions: run_collector (line 83) and handle_stats_socket (line 166), both #[allow(clippy::cognitive_complexity)].

What they do

  • run_collector (~50 lines) — streams stats from docker.stats() in a loop, computes CPU delta, inserts into history ring buffer, broadcasts to subscribers
  • handle_stats_socket (~55 lines) — replays history buffer to a newly connected WebSocket client, then runs a tokio::select! loop relaying broadcast receiver output to the socket

What to do

1. Extract stats chunk processing in run_collector

Lines 105–125 process a single stats chunk: extract values, lock history, push to ring, send via broadcast. Extract:

async fn process_stats_chunk(
    state: &AppState,
    key: &str,
    stats: Stats,
    prev_cpu_total: &mut u64,
    prev_cpu_system: &mut u64,
    tx: &broadcast::Sender<serde_json::Value>,
)

2. Extract history replay in handle_stats_socket

Lines 170–180 replay the history ring to the socket. Extract:

async fn replay_stats_history(
    socket: &mut WebSocket,
    state: &AppState,
    key: &str,
) -> ControlFlow<()>

3. Extract broadcast forwarding loop

Lines 195–218 run the tokio::select! loop that either forwards a broadcast message or handles inbound WebSocket messages. This pattern is shared with ws_stats.rs and ws_service_stats.rs. Consider a shared helper:

async fn relay_broadcast_to_socket(
    socket: &mut WebSocket,
    rx: &mut broadcast::Receiver<serde_json::Value>,
    key: &str,
)

4. Add unit tests

process_stats_chunk (if extraction allows):

  • Empty ring → new chunk inserted
  • Ring at cap → oldest evicted, new pushed

Important

The workspace Cargo.toml sets cognitive_complexity, too_many_lines, too_many_arguments, and several other clippy lints to warn globally. Run make lint after every change and make sure the output is clean. Don't fix a suppression here only to create new warnings elsewhere.

Acceptance criteria

  • process_stats_chunk extracted (from run_collector)
  • replay_stats_history extracted (from handle_stats_socket)
  • relay_broadcast_to_socket extracted (shared across WS stats handlers if possible)
  • Both functions use the new helpers
  • All tests pass (make test)
  • make lint passes with zero new warnings
  • Remove both #[allow(clippy::cognitive_complexity)] suppressions if make lint passes without them, keep any that are still needed (note why)

Related

Tracking issue pattern from previous PRs: #122, #133, #157, #158, #171, #172, #173, #174, #175

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions