From 2bae93c019adcf704030272bd1ea90a8dd8edb32 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 30 Jun 2026 09:46:28 +0300 Subject: [PATCH] feat: log each kind of unhandled event once per run Also raise to debug level so they're not so hidden. --- src/bin/cibtoolcmd/event.rs | 6 ++++-- src/ci_event.rs | 29 +++++++++++++++++++---------- src/ci_event_source.rs | 5 +++-- src/logger.rs | 2 +- src/node_event_source.rs | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/bin/cibtoolcmd/event.rs b/src/bin/cibtoolcmd/event.rs index 2d48e4a5..6a70a887 100644 --- a/src/bin/cibtoolcmd/event.rs +++ b/src/bin/cibtoolcmd/event.rs @@ -1,4 +1,4 @@ -use std::io::Write; +use std::{collections::HashSet, io::Write}; use clap::ValueEnum; @@ -436,7 +436,9 @@ impl Leaf for CiEvents { let mut ci_events: Vec = vec![]; for node_event in node_events.iter() { - if let Ok(mut cevs) = CiEvent::from_node_event(node_event, radicle.profile()) { + if let Ok(mut cevs) = + CiEvent::from_node_event(node_event, radicle.profile(), &mut HashSet::new()) + { ci_events.append(&mut cevs); } } diff --git a/src/ci_event.rs b/src/ci_event.rs index d8bbdcc4..4d6b5316 100644 --- a/src/ci_event.rs +++ b/src/ci_event.rs @@ -1,5 +1,5 @@ use std::{ - collections::BTreeMap, + collections::{BTreeMap, HashSet}, path::{Path, PathBuf}, str::FromStr, }; @@ -24,6 +24,7 @@ use radicle::{ use crate::{ logger, msg::RunId, + node_event_source::NodeEventKind, refs::{GenericRefName, TagName, ref_string}, }; @@ -286,7 +287,11 @@ impl CiEvent { } #[allow(clippy::unwrap_used)] - pub fn from_node_event(event: &Event, profile: &Profile) -> Result, CiEventError> { + pub fn from_node_event( + event: &Event, + profile: &Profile, + unhandled: &mut HashSet, + ) -> Result, CiEventError> { let (rid, updates) = match event { Event::RefsFetched { remote: _, @@ -337,7 +342,11 @@ impl CiEvent { (*rid, &updates.collect()) } _ => { - logger::node_event_not_handled(event); + let kind = NodeEventKind::from(event); + if !unhandled.contains(&kind) { + unhandled.insert(kind); + logger::node_event_not_handled(event); + } return Ok(vec![]); } }; @@ -595,7 +604,7 @@ mod test { rid: rid(), updated: vec![], }; - let result = CiEvent::from_node_event(&event, &profile); + let result = CiEvent::from_node_event(&event, &profile, &mut HashSet::new()); assert!(result.is_ok()); assert_eq!(result.unwrap(), vec![]); Ok(()) @@ -614,7 +623,7 @@ mod test { }], }; - let result = CiEvent::from_node_event(&event, &profile); + let result = CiEvent::from_node_event(&event, &profile, &mut HashSet::new()); assert!(result.is_ok()); assert_eq!(result.unwrap(), vec![]); Ok(()) @@ -634,7 +643,7 @@ mod test { oid, }], }; - let x = CiEvent::from_node_event(&event, &profile); + let x = CiEvent::from_node_event(&event, &profile, &mut HashSet::new()); eprintln!("result: {x:#?}"); match x { Err(_) => panic!("should succeed"), @@ -671,7 +680,7 @@ mod test { new: oid, }], }; - let x = CiEvent::from_node_event(&event, &profile); + let x = CiEvent::from_node_event(&event, &profile, &mut HashSet::new()); eprintln!("result: {x:#?}"); match x { Err(_) => panic!("should succeed"), @@ -711,7 +720,7 @@ mod test { oid, }], }; - let x = CiEvent::from_node_event(&event, &profile); + let x = CiEvent::from_node_event(&event, &profile, &mut HashSet::new()); eprintln!("result: {x:#?}"); match x { Err(_) => panic!("should succeed"), @@ -745,7 +754,7 @@ mod test { oid, }], }; - let x = CiEvent::from_node_event(&event, &profile); + let x = CiEvent::from_node_event(&event, &profile, &mut HashSet::new()); eprintln!("result: {x:#?}"); match x { Err(_) => panic!("should succeed"), @@ -783,7 +792,7 @@ mod test { new: oid, }], }; - let x = CiEvent::from_node_event(&event, &profile); + let x = CiEvent::from_node_event(&event, &profile, &mut HashSet::new()); eprintln!("result: {x:#?}"); match x { Err(_) => panic!("should succeed"), diff --git a/src/ci_event_source.rs b/src/ci_event_source.rs index 144d0e46..452c3184 100644 --- a/src/ci_event_source.rs +++ b/src/ci_event_source.rs @@ -1,4 +1,4 @@ -use std::fmt; +use std::{collections::HashSet, fmt}; use radicle::Profile; @@ -25,6 +25,7 @@ impl<'a> CiEventSource<'a> { pub fn event(&mut self) -> Result>, CiEventSourceError> { let result = self.source.node_event(); + let mut unhandled = HashSet::new(); match result { Err(err) if matches!(err, NodeEventError::BrokenConnection) => { logger::ci_event_source_disconnected(); @@ -43,7 +44,7 @@ impl<'a> CiEventSource<'a> { Ok(None) } Ok(Some(event)) => { - let ci_events = CiEvent::from_node_event(&event, self.profile) + let ci_events = CiEvent::from_node_event(&event, self.profile, &mut unhandled) .map_err(CiEventSourceError::CiEvent)?; if !ci_events.is_empty() { logger::ci_event_source_got_events(&ci_events); diff --git a/src/logger.rs b/src/logger.rs index db802eeb..6a0cb0db 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -359,7 +359,7 @@ pub fn node_event_source_eof(source: &NodeEventSource) { } pub fn node_event_not_handled(event: &Event) { - trace!( + debug!( msg_id = ?Id::NodeEventNotHandled, kind = %Kind::Debug, ?event, diff --git a/src/node_event_source.rs b/src/node_event_source.rs index 3b8c126e..83569972 100644 --- a/src/node_event_source.rs +++ b/src/node_event_source.rs @@ -80,6 +80,42 @@ impl fmt::Debug for NodeEventSource { } } +/// Kind of node event. +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum NodeEventKind { + RefsFetched, + RefsSynced, + SeedDiscovered, + SeedDropped, + PeerConnected, + LocalRefsAnnounced, + InventoryAnnounced, + RefsAnnounced, + NodeAnnounced, + UploadPack, + CanonicalRefUpdated, + Other, +} + +impl From<&Event> for NodeEventKind { + fn from(value: &Event) -> Self { + match value { + Event::RefsFetched { .. } => Self::RefsFetched, + Event::RefsSynced { .. } => Self::RefsFetched, + Event::SeedDiscovered { .. } => Self::SeedDiscovered, + Event::SeedDropped { .. } => Self::SeedDropped, + Event::PeerConnected { .. } => Self::PeerConnected, + Event::LocalRefsAnnounced { .. } => Self::LocalRefsAnnounced, + Event::InventoryAnnounced { .. } => Self::InventoryAnnounced, + Event::RefsAnnounced { .. } => Self::RefsAnnounced, + Event::NodeAnnounced { .. } => Self::NodeAnnounced, + Event::UploadPack { .. } => Self::UploadPack, + Event::CanonicalRefUpdated { .. } => Self::CanonicalRefUpdated, + _ => Self::Other, + } + } +} + /// Possible errors from accessing the local Radicle node. #[derive(Debug, thiserror::Error)] pub enum NodeEventError {