From e68ee5d8a520789be52fb7e628950f6887064e74 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 07:28:34 -0500 Subject: [PATCH 1/9] feat(observability): clean up sync log surface Sync runs over multi-mapping configs (especially against cosign-heavy sources like cgr.dev) emit dozens of WARN log lines per cycle, none of which describe a real problem. Watch-mode multiplies this per cycle. Changes: - Demote noisy per-mapping config warnings to debug: - validate_artifacts emits per mapping when artifacts.enabled is false - validate_tags emits per mapping when tags.semver lacks tags.latest - Demote per-tag "tag is not parseable as a version" warn to debug; the same drop is already attributed via FilterReport's drop reasons. - Skip OCI 1.1 referrer fallback tags (sha256-(.sig|.sbom|.att)) before semver parsing so cosign-heavy repos do not spam the log channel. Helper is_referrers_fallback_tag is pub for reuse in CLI. - Demote spawn / wait / non-zero-exit cred helper warns to debug; keep the 30s timeout warn (real operational signal). Caller already swallows the Err for graceful fallback to anonymous auth. Restructure the per-mapping plan line and dry-run output: - INFO summary now reads "5 tags match for sync out of 1133 possible" with brackets for targets; no more dual-arrow ambiguity. - Suppress the INFO summary in --dry-run mode (the pretty-print is the answer). - Replace the "no tags matched after filtering" warn with one carrying source count split (image vs referrer artifact), filter rationale, and image-tag samples; structured tracing fields included. - Dry-run section labels: "source candidates" -> "source tags", "pipeline:" -> "filter:", "dropped N:" -> "dropped (N):"; sort and latest now render as separate stages; system-exclude hint formatted as a hint: line. Watch-mode dedup: - WatchLogState (HashSet keyed by mapping.from) carries log state across cycles. Emits one WARN per failure-state transition; emits a recovery INFO when a previously-failing mapping resolves; prunes entries when the mapping is removed from config. Banner: - Switch README hero from docs/public/ecr-banner.svg to a rendered PNG (docs/public/ecr-banner.png). GitHub's SVG renderer mangled the bold-gradient title; the PNG renders deterministically. Verification: - 1346 unit + integration tests pass (workspace, --locked, non-fips) - cargo clippy --workspace --all-targets --locked: clean - cargo fmt --all -- --check: clean - cargo deny check: advisories ok, bans ok, licenses ok, sources ok - npm run --prefix docs build: 28 pages, 831 ms - Live dry-run against cgr.dev/chainguard/{nginx,python} and docker.io/library/{nginx,alpine}: chainguard mappings now emit one legible WARN each (instead of ~14k unparseable-tag warnings); Docker Hub mappings show the new INFO summary and clean dry-run pipeline. --- README.md | 2 +- crates/ocync-distribution/src/auth/docker.rs | 8 +- crates/ocync-sync/src/filter.rs | 186 ++++++++- docs/public/ecr-banner.png | Bin 0 -> 351870 bytes docs/src/content/cli-reference.md | 6 +- src/cli/commands/analyze.rs | 6 +- src/cli/commands/dry_run.rs | 21 +- src/cli/commands/synchronize.rs | 410 +++++++++++++++++-- src/cli/commands/watch.rs | 8 +- src/cli/config.rs | 4 +- src/main.rs | 3 +- 11 files changed, 569 insertions(+), 85 deletions(-) create mode 100644 docs/public/ecr-banner.png diff --git a/README.md b/README.md index 9015bb8b..53e8c1e8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Sync OCI container images across registries - efficiently.

- ocync - 4x faster sync, 30% fewer API requests, adaptive rate control + ocync - 4x faster sync, 30% fewer API requests, adaptive rate control

[![CI](https://github.com/clowdhaus/ocync/actions/workflows/ci.yml/badge.svg)](https://github.com/clowdhaus/ocync/actions/workflows/ci.yml) diff --git a/crates/ocync-distribution/src/auth/docker.rs b/crates/ocync-distribution/src/auth/docker.rs index 46e401f2..ace7aca2 100644 --- a/crates/ocync-distribution/src/auth/docker.rs +++ b/crates/ocync-distribution/src/auth/docker.rs @@ -238,7 +238,7 @@ async fn run_credential_helper(helper: &str, registry: &str) -> Result Result Result Result=1.0.0, latest=5`. Returns `None` when no filtering applies. + /// + /// Sole formatter for filter rationale shown in non-dry-run logs; uses + /// the same `FilterConfig` fields the pipeline operates on so adding a + /// new field to the config will fail tests here before it ships. + pub fn describe(&self) -> Option { + let mut parts = Vec::new(); + if !self.glob.is_empty() { + parts.push(format!("glob {}", self.glob.join(","))); + } + if let Some(ref s) = self.semver { + parts.push(format!("semver {s}")); + } + if !self.exclude.is_empty() { + parts.push(format!("exclude {}", self.exclude.join(","))); + } + if !self.include.is_empty() { + parts.push(format!("include {}", self.include.join(","))); + } + if let Some(order) = self.sort { + parts.push(format!( + "sort {}", + match order { + SortOrder::Semver => "semver", + SortOrder::Alpha => "alpha", + } + )); + } + if let Some(n) = self.latest { + parts.push(format!("latest={n}")); + } + if let Some(n) = self.min_tags { + parts.push(format!("min_tags={n}")); + } + if parts.is_empty() { + None + } else { + Some(parts.join(", ")) + } + } + /// Shared pipeline implementation. When `track` is false (the real-sync /// hot path), per-stage `StageDelta` and per-reason `DropReason` are not /// constructed; the resulting `Filtered.report` carries empty vectors. @@ -171,18 +213,18 @@ impl FilterConfig { range: range.to_owned(), reason: e.to_string(), })?; - let (kept, dropped) = - partition_with_drop( - &pipeline, - track, - |t| match crate::version::TagVersion::parse(t) { - Some(ver) => req.matches(&ver), - None => { - warn!(tag = t, "tag is not parseable as a version, dropping"); - false - } - }, - ); + let (kept, dropped) = partition_with_drop(&pipeline, track, |t| { + if is_referrers_fallback_tag(t) { + return false; + } + match crate::version::TagVersion::parse(t) { + Some(ver) => req.matches(&ver), + None => { + debug!(tag = t, "tag is not parseable as a version, dropping"); + false + } + } + }); push_drop_reason( &mut drop_reasons, track, @@ -248,7 +290,19 @@ impl FilterConfig { } if let Some(order) = self.sort { + let before = pipeline.len(); sort_tags_in_place(&mut pipeline, order); + if track { + let label = match order { + SortOrder::Semver => "sort semver desc", + SortOrder::Alpha => "sort alpha desc", + }; + pipeline_stages.push(StageDelta { + label: label.to_string(), + count_in: before, + count_out: pipeline.len(), + }); + } } if let Some(n) = self.latest { let before = pipeline.len(); @@ -265,13 +319,8 @@ impl FilterConfig { pipeline.truncate(n); } if track { - let label = match self.sort { - Some(SortOrder::Semver) => format!("sort semver desc, latest {n}"), - Some(SortOrder::Alpha) => format!("sort alpha desc, latest {n}"), - None => format!("latest {n}"), - }; pipeline_stages.push(StageDelta { - label, + label: format!("keep latest {n}"), count_in: before, count_out: pipeline.len(), }); @@ -477,6 +526,18 @@ fn push_drop_reason( // Individual stages // --------------------------------------------------------------------------- +/// True for OCI 1.1 referrers fallback tags (`-` and the cosign +/// `.sig`/`.sbom`/`.att` variants). These are pointers to artifacts, not image +/// versions, and will never satisfy a semver range -- skip parsing so they do +/// not appear in the unparseable-tag log channel. +/// +/// Public so that observability/UX code outside the filter pipeline (e.g. the +/// CLI's "no tags matched" warn) can partition source tag lists without +/// reintroducing a duplicate prefix check that would drift over time. +pub fn is_referrers_fallback_tag(tag: &str) -> bool { + tag.starts_with("sha256-") || tag.starts_with("sha512-") +} + /// Build a [`GlobSet`] from patterns, returning an error on invalid patterns. pub fn build_glob_set(patterns: &[String]) -> Result { let mut builder = GlobSetBuilder::new(); @@ -520,8 +581,11 @@ fn filter_semver<'a>(tags: &[&'a str], range: &str) -> Result, Erro .iter() .copied() .filter(|tag| { + if is_referrers_fallback_tag(tag) { + return false; + } let Some(ver) = crate::version::TagVersion::parse(tag) else { - warn!(tag, "tag is not parseable as a version, dropping"); + debug!(tag, "tag is not parseable as a version, dropping"); return false; }; req.matches(&ver) @@ -728,6 +792,24 @@ mod tests { assert_eq!(result, vec!["1.0.0"]); } + /// Referrers fallback tags (cosign signatures, SBOMs, attestations) bypass + /// the version parser. They drop silently so noisy unparseable-tag logs do + /// not fire once per artifact tag per image. + #[test] + fn semver_skips_referrers_fallback_tags() { + let tags = vec![ + "1.0.0", + "sha256-abc123def456.sig", + "sha256-abc123def456.sbom", + "sha256-abc123def456.att", + "sha256-abc123def456", + "sha512-deadbeef.sig", + "2.0.0", + ]; + let result = filter_semver(&tags, ">=1.0.0").unwrap(); + assert_eq!(result, vec!["1.0.0", "2.0.0"]); + } + // - pipeline tests ---------------------------------------------------- #[test] @@ -1378,4 +1460,68 @@ mod tests { assert_eq!(reason.count, reason.samples.len()); } } + + // - describe ---------------------------------------------------------- + + #[test] + fn describe_default_returns_none() { + assert!(FilterConfig::default().describe().is_none()); + } + + #[test] + fn describe_combines_clauses_in_pipeline_order() { + let config = FilterConfig { + glob: vec!["1.*".into()], + semver: Some(">=1.0.0".into()), + exclude: vec!["*-rc*".into()], + sort: Some(SortOrder::Semver), + latest: Some(5), + min_tags: Some(1), + ..FilterConfig::default() + }; + assert_eq!( + config.describe().as_deref(), + Some("glob 1.*, semver >=1.0.0, exclude *-rc*, sort semver, latest=5, min_tags=1") + ); + } + + /// Regression guard: every `FilterConfig` field that influences selection + /// must contribute to `describe()`. Adding a new field without updating + /// `describe()` would silently leave INFO-line filter rationale stale. + #[test] + fn describe_covers_every_selection_field() { + let cfg = FilterConfig { + include: vec!["latest".into()], + glob: vec!["v*".into()], + semver: Some("^1".into()), + exclude: vec!["nightly".into()], + sort: Some(SortOrder::Alpha), + latest: Some(3), + min_tags: Some(2), + }; + let desc = cfg.describe().expect("non-empty config describes"); + for needle in [ + "include latest", + "glob v*", + "semver ^1", + "exclude nightly", + "sort alpha", + "latest=3", + "min_tags=2", + ] { + assert!(desc.contains(needle), "missing {needle:?} in {desc:?}"); + } + } + + // - is_referrers_fallback_tag ---------------------------------------- + + #[test] + fn referrers_fallback_detection() { + assert!(is_referrers_fallback_tag("sha256-abcdef")); + assert!(is_referrers_fallback_tag("sha256-deadbeef.sig")); + assert!(is_referrers_fallback_tag("sha512-cafef00d.sbom")); + assert!(!is_referrers_fallback_tag("v1.0.0")); + assert!(!is_referrers_fallback_tag("latest")); + assert!(!is_referrers_fallback_tag("sha256")); // no dash + } } diff --git a/docs/public/ecr-banner.png b/docs/public/ecr-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..bf47edf93b397efc07e057fdcd6256afa6f36180 GIT binary patch literal 351870 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≥G9iBoDPnxvcP}F+jQA?``oXo`f;S6(p?%%_ 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�HyvsiVMmy0p!~(0UcVo6aExq9Rw`V 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

kF=;Iwi@ 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

PZ+;j%hV&NNMZLoVMw(6c15>~-Vl4u= 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%0DLW`B|g9Jd%0pyaYLnPza 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®jP8aVlHPdYAh_LKOn_kRg>tW9sV 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 wVBU3g+&mu27&-gtCRd count_out and the drop count. +- **`filter:`** -- per-stage attrition (`glob`, `semver`, `exclude`, `sort`, `keep latest`). Each row shows count_in -> count_out and the drop count. - **`kept (N):`** -- the final tags. When `include:` is used, rescued tags are listed first and tagged `[via include]` so the rescue path is visible. -- **`dropped N:`** -- Pareto-sorted drop attribution (largest cause first), with sample tag names per reason. Default cap is 5 names per reason; `-v` removes the cap. +- **`dropped (N):`** -- Pareto-sorted drop attribution (largest cause first), with sample tag names per reason. Default cap is 5 names per reason; `-v` removes the cap. - **`min_tags: N`** -- when `min_tags:` is configured, the line prints `kept M, satisfied` or `kept M, real sync will FAIL with BelowMinTags`. Real-sync (no `--dry-run`) errors out below `min_tags`; dry-run shows the report and surfaces the gap so the configuration can be fixed before running. ## copy diff --git a/src/cli/commands/analyze.rs b/src/cli/commands/analyze.rs index d5fdd09f..c0974b9a 100644 --- a/src/cli/commands/analyze.rs +++ b/src/cli/commands/analyze.rs @@ -18,7 +18,7 @@ use ocync_distribution::{Digest, RepositoryName}; use ocync_sync::ShutdownSignal; -use crate::cli::commands::synchronize::{build_clients, resolve_mapping}; +use crate::cli::commands::synchronize::{MappingResolution, build_clients, resolve_mapping}; use crate::cli::config::load_config; use crate::cli::output::format_bytes; use crate::cli::{CliError, ExitCode}; @@ -68,8 +68,8 @@ pub(crate) async fn run( let resolved = match resolve_mapping(mapping, &config, &clients, &no_checkers, false).await? { - Some(r) => r, - None => continue, + MappingResolution::Resolved(r) => r, + MappingResolution::NoMatchingTags(_) => continue, }; for tag_pair in &resolved.tags { diff --git a/src/cli/commands/dry_run.rs b/src/cli/commands/dry_run.rs index d807cb82..69bd83fa 100644 --- a/src/cli/commands/dry_run.rs +++ b/src/cli/commands/dry_run.rs @@ -49,7 +49,7 @@ fn write_mapping(w: &mut W, m: &ResolvedMapping, verbose: bool) -> io: let target_names: Vec<&str> = m.targets.iter().map(|t| &*t.name).collect(); writeln!( w, - "dry-run: {} -> {} => [{}]", + "dry-run: {} -> {} [{}]", m.source_repo, m.target_repo, target_names.join(", ") @@ -61,7 +61,7 @@ fn write_mapping(w: &mut W, m: &ResolvedMapping, verbose: bool) -> io: return write_simple_tag_list(w, &m.tags); }; - writeln!(w, " source candidates: {}", report.candidate_count)?; + writeln!(w, " source tags: {}", report.candidate_count)?; writeln!(w)?; if !report.include_kept.is_empty() { @@ -107,7 +107,7 @@ fn write_include_path(w: &mut W, report: &FilterReport, verbose: bool) } fn write_pipeline(w: &mut W, report: &FilterReport) -> io::Result<()> { - writeln!(w, " pipeline:")?; + writeln!(w, " filter:")?; for stage in &report.pipeline { let delta = stage.count_in as isize - stage.count_out as isize; let delta_str = if delta != 0 { @@ -115,11 +115,11 @@ fn write_pipeline(w: &mut W, report: &FilterReport) -> io::Result<()> } else { String::new() }; - writeln!( - w, + let line = format!( " {:<28} {:>4} -> {:<4}{}", stage.label, stage.count_in, stage.count_out, delta_str - )?; + ); + writeln!(w, "{}", line.trim_end())?; } Ok(()) } @@ -150,7 +150,7 @@ fn write_dropped(w: &mut W, report: &FilterReport, verbose: bool) -> i if total == 0 { return Ok(false); } - writeln!(w, " dropped {total}:")?; + writeln!(w, " dropped ({total}):")?; for reason in &report.dropped { let samples_display = render_samples(&reason.samples, verbose); // `LatestCap` reads as a complete clause ("over latest=N limit"); every @@ -167,8 +167,7 @@ fn write_dropped(w: &mut W, report: &FilterReport, verbose: bool) -> i if matches!(reason.kind, DropKind::SystemExclude) { writeln!( w, - " {:<28}to keep prereleases, list patterns under include: (globs supported)", - "" + " hint: to keep prereleases, list patterns under include: (globs supported)" )?; } } @@ -394,8 +393,8 @@ mod tests { assert!(out.contains("tags (2):"), "{out}"); assert!(out.contains(" v1.0.0\n"), "{out}"); assert!(out.contains(" v1.1.0\n"), "{out}"); - // No pipeline/kept/dropped sections appear. - assert!(!out.contains("pipeline:"), "{out}"); + // No filter/kept/dropped sections appear. + assert!(!out.contains("filter:"), "{out}"); assert!(!out.contains("kept ("), "{out}"); assert!(!out.contains("dropped"), "{out}"); } diff --git a/src/cli/commands/synchronize.rs b/src/cli/commands/synchronize.rs index 498c05b3..c285326d 100644 --- a/src/cli/commands/synchronize.rs +++ b/src/cli/commands/synchronize.rs @@ -16,7 +16,7 @@ use ocync_sync::engine::{ DEFAULT_MAX_CONCURRENT_TRANSFERS, RegistryAlias, ResolvedArtifacts, ResolvedMapping, SyncEngine, TagPair, TargetEntry, }; -use ocync_sync::filter::{FilterConfig, build_glob_set}; +use ocync_sync::filter::{FilterConfig, build_glob_set, is_referrers_fallback_tag}; use ocync_sync::retry::RetryConfig; use ocync_sync::shutdown::ShutdownSignal; use ocync_sync::staging::BlobStage; @@ -33,6 +33,122 @@ pub(crate) const DEFAULT_CACHE_TTL: Duration = Duration::from_secs(12 * 3600); /// Default cache file name within the cache directory. const CACHE_FILE_NAME: &str = "transfer_state.bin"; +/// Sample cap for the source-tag list shown in the no-tags-matched WARN. +/// Mirrors `dry_run::SAMPLE_CAP` so both surfaces show the same depth of +/// example data without overwhelming the log line. +const NO_TAGS_SAMPLE_CAP: usize = 5; + +/// Outcome of resolving a single mapping. Either the mapping is ready for the +/// engine, or no source tag survived filtering and the caller decides whether +/// to log a WARN (sync mode: always; watch mode: only on transition). +/// +/// The size disparity between variants is intentional: `ResolvedMapping` flows +/// directly into `Vec` for the engine, so boxing it would +/// just add a heap round-trip per success. The error variant is rare; we pay +/// the disparity instead of the allocation traffic. +#[allow(clippy::large_enum_variant)] +pub(crate) enum MappingResolution { + Resolved(ResolvedMapping), + NoMatchingTags(NoTagsInfo), +} + +/// Diagnostic context for a mapping whose filter rejected every source tag. +/// +/// Fields together let an operator see, in one log line, the size and +/// composition of the source repo (image tags vs OCI 1.1 referrer fallbacks), +/// the active filter clauses, and example image tag names so the cause is +/// obvious without spelunking. +pub(crate) struct NoTagsInfo { + pub from: String, + pub image_count: usize, + pub artifact_count: usize, + /// Active filter clauses (e.g. `semver >=1.0.0, latest=5`). `None` only + /// when no filter is configured -- distinct from "filter description + /// missing" so the formatter can render an explicit fallback string. + pub filter_desc: Option, + /// Up to [`NO_TAGS_SAMPLE_CAP`] image-tag names. Excludes referrer + /// fallback tags so the example list is meaningful on cosign-heavy + /// repos like `cgr.dev/chainguard/*` (otherwise dominated by + /// `sha256-(.sig|.sbom|.att)` entries). + pub samples: Vec, +} + +impl NoTagsInfo { + /// Total tags returned by `/v2//tags/list`. Derived: image + artifact. + fn source_total(&self) -> usize { + self.image_count + self.artifact_count + } + + /// True when the source had more image tags than `samples` shows. + fn samples_truncated(&self) -> bool { + self.image_count > self.samples.len() + } +} + +impl std::fmt::Display for NoTagsInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let total = self.source_total(); + let total_phrase = if self.artifact_count > 0 { + format!( + "{total} source tags ({} image tags, {} referrer artifacts)", + self.image_count, self.artifact_count + ) + } else { + format!("{total} source tags") + }; + let filter = self + .filter_desc + .as_deref() + .unwrap_or("no filter configured"); + let samples = if self.samples.is_empty() { + "".to_string() + } else if self.samples_truncated() { + format!("[{}, ...]", self.samples.join(", ")) + } else { + format!("[{}]", self.samples.join(", ")) + }; + write!( + f, + "{}: 0 of {total_phrase} matched filter ({filter}); skipping. Source: {samples}", + self.from + ) + } +} + +/// Per-process state that lets watch-mode emit one no-tags WARN per +/// transition into the failure state rather than one per cycle. Sync mode +/// passes `None`. State lives in `watch::run` so it spans loop iterations. +#[derive(Debug, Default)] +pub(crate) struct WatchLogState { + /// Mappings (keyed by `mapping.from`) that emitted a no-tags WARN in a + /// prior cycle and have not since recovered. + warned_no_tags: HashSet, +} + +impl WatchLogState { + /// Record a no-match observation for `from`. Returns `true` when this is + /// a transition into the failure state (caller should emit a WARN); + /// `false` when the mapping was already in the failure set (suppress). + fn observe_no_match(&mut self, from: &str) -> bool { + self.warned_no_tags.insert(from.to_string()) + } + + /// Record a successful resolution for `from`. Returns `true` when the + /// mapping was previously in the failure set (caller should emit a + /// "recovered" INFO); `false` when there was no transition. + fn observe_resolved(&mut self, from: &str) -> bool { + self.warned_no_tags.remove(from) + } + + /// Drop entries for mappings no longer present in the active set so the + /// state does not grow unbounded across edits to the config. + fn retain_active<'a>(&mut self, active: impl IntoIterator) { + let active_set: HashSet<&str> = active.into_iter().collect(); + self.warned_no_tags + .retain(|k| active_set.contains(k.as_str())); + } +} + /// Resolve the cache directory and file path from config. /// /// Uses `global.cache_dir` if configured, otherwise places the cache @@ -78,6 +194,7 @@ pub(crate) async fn run( shutdown: Option<&ShutdownSignal>, external_cache: Option>>, verbose: bool, + mut watch_log: Option<&mut WatchLogState>, ) -> Result { let config = load_config(&args.config)?; @@ -86,20 +203,40 @@ pub(crate) async fn run( let mut mappings = Vec::new(); for mapping in &config.mappings { - match resolve_mapping(mapping, &config, &clients, &batch_checkers, args.dry_run).await { - Ok(Some(resolved)) => mappings.push(resolved), - Ok(None) => {} // no tags after filtering, logged inside - Err(err) => return Err(err), + match resolve_mapping(mapping, &config, &clients, &batch_checkers, args.dry_run).await? { + MappingResolution::Resolved(resolved) => mappings.push(resolved), + MappingResolution::NoMatchingTags(info) => { + let should_warn = match watch_log.as_mut() { + Some(state) => state.observe_no_match(&info.from), + None => true, + }; + if should_warn { + emit_no_tags_warn(&info); + } + } } } - log_resolved_mappings(&mappings); + if let Some(state) = watch_log.as_mut() { + for resolved in &mappings { + let from = resolved.source_repo.as_str(); + if state.observe_resolved(from) { + tracing::info!( + from = %from, + "{from}: filter now matches at least one tag; resuming sync" + ); + } + } + state.retain_active(config.mappings.iter().map(|m| m.from.as_str())); + } if args.dry_run { crate::cli::commands::dry_run::print(&mappings, verbose); return Ok(ExitCode::Success); } + log_resolved_mappings(&mappings); + let (cache_dir, cache_path) = resolve_cache_path(&config, &args.config); let cache_ttl = resolve_cache_ttl(&config)?; let (cache, should_persist) = match external_cache { @@ -273,18 +410,19 @@ async fn build_batch_checkers( Ok(checkers) } -/// Resolve a single mapping config into a `ResolvedMapping`, or `None` if no -/// tags survive filtering. +/// Resolve a single mapping config into a [`MappingResolution`]. /// -/// Falls back to `defaults.source`, `defaults.targets`, and `defaults.tags` -/// when the mapping does not specify its own values. +/// Returns [`MappingResolution::Resolved`] when at least one tag survives the +/// filter pipeline, or [`MappingResolution::NoMatchingTags`] carrying the +/// diagnostic context the caller needs to render a WARN. Pulls fallbacks from +/// `defaults.source`, `defaults.targets`, and `defaults.tags`. pub(crate) async fn resolve_mapping( mapping: &MappingConfig, config: &Config, clients: &HashMap>, batch_checkers: &HashMap>, with_report: bool, -) -> Result, CliError> { +) -> Result { // --- Source registry --- let source_name = mapping .source @@ -353,20 +491,49 @@ pub(crate) async fn resolve_mapping( // enumerating all tags from the source registry. This avoids // hundreds of paginated tags/list requests for repos with thousands // of tags. - let (filtered, candidate_count, filter_report) = - if let Some(exact) = tags_config.and_then(|t| t.exact_tags()) { - (exact, None, None) - } else { - let all_tags = source_client.list_tags(&source_repo_path).await?; - select_filtered_tags(tags_config, all_tags, with_report)? + // The image/artifact partition + sample collection happen in the same + // pass that prepares input for `select_filtered_tags`, so the filter and + // the no-match WARN both see consistent counts. The pre-built `NoTagsInfo` + // is only consumed when filtering yields zero tags. + let (filtered, candidate_count, filter_report, no_tags_template): ( + Vec, + Option, + Option, + Option, + ) = if let Some(exact) = tags_config.and_then(|t| t.exact_tags()) { + (exact, None, None, None) + } else { + let all_tags = source_client.list_tags(&source_repo_path).await?; + let mut samples: Vec = Vec::with_capacity(NO_TAGS_SAMPLE_CAP); + let mut image_count = 0usize; + for t in &all_tags { + if !is_referrers_fallback_tag(t) { + image_count += 1; + if samples.len() < NO_TAGS_SAMPLE_CAP { + samples.push(t.clone()); + } + } + } + let template = NoTagsInfo { + from: mapping.from.clone(), + image_count, + artifact_count: all_tags.len() - image_count, + filter_desc: describe_filter(tags_config), + samples, }; + let (kept, count, report) = select_filtered_tags(tags_config, all_tags, with_report)?; + (kept, count, report, Some(template)) + }; if filtered.is_empty() { - tracing::warn!( - from = %mapping.from, - "no tags matched after filtering, skipping mapping" - ); - return Ok(None); + let info = no_tags_template.unwrap_or_else(|| NoTagsInfo { + from: mapping.from.clone(), + image_count: 0, + artifact_count: 0, + filter_desc: describe_filter(tags_config), + samples: Vec::new(), + }); + return Ok(MappingResolution::NoMatchingTags(info)); } // --- Target repo --- @@ -433,7 +600,7 @@ pub(crate) async fn resolve_mapping( None => ResolvedArtifacts::default(), }; - Ok(Some(ResolvedMapping { + Ok(MappingResolution::Resolved(ResolvedMapping { source_authority, source_client, source_repo: RepositoryName::new(mapping.from.clone())?, @@ -449,6 +616,20 @@ pub(crate) async fn resolve_mapping( })) } +/// Emit a tracing WARN for a [`NoTagsInfo`] with both a human-readable +/// message (via [`Display`](std::fmt::Display)) and structured fields for +/// log aggregators. +fn emit_no_tags_warn(info: &NoTagsInfo) { + tracing::warn!( + from = %info.from, + source_total = info.source_total(), + image_count = info.image_count, + artifact_count = info.artifact_count, + filter = info.filter_desc.as_deref().unwrap_or(""), + "{info}" + ); +} + /// Build a `FilterConfig` from a `TagsConfig`, falling back to defaults. fn build_filter(tags: Option<&TagsConfig>) -> FilterConfig { let Some(tags) = tags else { @@ -513,8 +694,9 @@ fn select_filtered_tags( /// Format one per-mapping plan line for `INFO`-level emission. /// -/// `{source} -> {target}: {kept} of {N} tags => [t1, t2]` when the -/// candidate count is known, or `{kept} tags` on the exact-tag fast path. +/// Filtered path: `{source} -> {target} [t1, t2]: {kept} tags match for sync +/// out of {N} possible`. Exact-tag fast path (no enumeration): `{kept} tags +/// (exact)`. fn format_plan_line( source_repo: &str, target_repo: &str, @@ -522,14 +704,25 @@ fn format_plan_line( candidate_count: Option, target_names: &[&str], ) -> String { - let count_phrase = match candidate_count { - Some(n) => format!("{kept} of {n} tags"), - None => format!("{kept} tags"), - }; - format!( - "{source_repo} -> {target_repo}: {count_phrase} => [{}]", - target_names.join(", ") - ) + let targets = target_names.join(", "); + match candidate_count { + Some(n) => format!( + "{source_repo} -> {target_repo} [{targets}]: {kept} tags match for sync out of {n} possible" + ), + None => { + format!("{source_repo} -> {target_repo} [{targets}]: {kept} tags (specified directly)") + } + } +} + +/// One-line summary of a [`TagsConfig`] suitable for log emission, e.g. +/// `semver >=1.0.0, latest=5`. Returns `None` when no filter applies. +/// +/// Single source of truth: delegates to [`FilterConfig::describe`] after +/// the same conversion the engine uses, so stage labels in the dry-run +/// pipeline and the INFO/WARN filter rationale cannot drift. +fn describe_filter(tags: Option<&TagsConfig>) -> Option { + build_filter(tags).describe() } /// Emit one INFO log line per resolved mapping summarizing kept/considered @@ -823,7 +1016,7 @@ latest: 5 } #[test] - fn format_plan_line_filtered_path_includes_of_n() { + fn format_plan_line_filtered_path_phrasing() { let line = format_plan_line( "docker.io/library/alpine", "alpine", @@ -833,14 +1026,17 @@ latest: 5 ); assert_eq!( line, - "docker.io/library/alpine -> alpine: 3 of 50 tags => [ecr-prod, ghcr-mirror]" + "docker.io/library/alpine -> alpine [ecr-prod, ghcr-mirror]: 3 tags match for sync out of 50 possible" ); } #[test] - fn format_plan_line_exact_tag_path_omits_of_n() { + fn format_plan_line_exact_tag_path_marks_exact() { let line = format_plan_line("ghcr.io/foo/bar", "bar", 3, None, &["ghcr-mirror"]); - assert_eq!(line, "ghcr.io/foo/bar -> bar: 3 tags => [ghcr-mirror]"); + assert_eq!( + line, + "ghcr.io/foo/bar -> bar [ghcr-mirror]: 3 tags (specified directly)" + ); } #[test] @@ -848,10 +1044,144 @@ latest: 5 let line = format_plan_line("src/repo", "dst/repo", 5, Some(80), &["only-target"]); assert_eq!( line, - "src/repo -> dst/repo: 5 of 80 tags => [only-target]" + "src/repo -> dst/repo [only-target]: 5 tags match for sync out of 80 possible" ); } + #[test] + fn describe_filter_combines_semver_and_latest() { + let tags = TagsConfig { + semver: Some(">=1.0.0".into()), + latest: Some(5), + ..TagsConfig::default() + }; + assert_eq!( + describe_filter(Some(&tags)).as_deref(), + Some("semver >=1.0.0, latest=5") + ); + } + + #[test] + fn describe_filter_returns_none_when_empty() { + let tags = TagsConfig::default(); + assert!(describe_filter(Some(&tags)).is_none()); + assert!(describe_filter(None).is_none()); + } + + // -- NoTagsInfo Display --------------------------------------------- + + fn no_tags_info( + from: &str, + image_count: usize, + artifact_count: usize, + filter_desc: Option<&str>, + samples: &[&str], + ) -> NoTagsInfo { + NoTagsInfo { + from: from.into(), + image_count, + artifact_count, + filter_desc: filter_desc.map(String::from), + samples: samples.iter().map(|s| (*s).into()).collect(), + } + } + + #[test] + fn no_tags_warn_renders_simple_repo() { + // 2 image tags, both shown -- no truncation, no artifact split. + let info = no_tags_info( + "library/nginx", + 2, + 0, + Some("semver >=2.0"), + &["v1.0", "v1.1"], + ); + assert_eq!( + info.to_string(), + "library/nginx: 0 of 2 source tags matched filter (semver >=2.0); skipping. Source: [v1.0, v1.1]" + ); + } + + /// Cosign-heavy repos: WARN must split image vs referrer counts so the + /// 14289-tag chainguard case is not misread as 14289 missing image tags. + #[test] + fn no_tags_warn_splits_image_and_artifact_counts() { + let info = no_tags_info( + "chainguard/nginx", + 2, + 14287, + Some("semver >=1.0.0, latest=5"), + &["latest", "latest-dev"], + ); + let msg = info.to_string(); + assert!( + msg.contains( + "0 of 14289 source tags (2 image tags, 14287 referrer artifacts) matched filter" + ), + "{msg}" + ); + } + + /// Truncation appends `, ...` so the user knows the list is sampled. + #[test] + fn no_tags_warn_appends_ellipsis_when_truncated() { + let info = NoTagsInfo { + from: "library/alpine".into(), + // image_count > samples.len() drives the truncation marker. + image_count: 100, + artifact_count: 0, + filter_desc: Some("semver >=99.0".into()), + samples: (0..5).map(|i| format!("v{i}")).collect(), + }; + assert!(info.samples_truncated()); + let msg = info.to_string(); + assert!(msg.ends_with("Source: [v0, v1, v2, v3, v4, ...]"), "{msg}"); + } + + /// Empty samples render as `` and a missing filter description + /// renders as `no filter configured` -- both ensure the message never + /// has bare parens or `[]`. + #[test] + fn no_tags_warn_renders_empty_markers() { + let info = no_tags_info("x/y", 0, 0, None, &[]); + let msg = info.to_string(); + assert!(msg.contains("(no filter configured)"), "{msg}"); + assert!(msg.ends_with("Source: "), "{msg}"); + } + + // -- WatchLogState transitions -------------------------------------- + + /// First observation triggers a WARN; repeats within the same failure + /// run are suppressed; recovery clears the entry so a relapse warns + /// again. Encodes the contract `run()` depends on. + #[test] + fn watch_log_state_emits_once_per_transition() { + let mut state = WatchLogState::default(); + assert!(state.observe_no_match("repo-a")); + assert!(!state.observe_no_match("repo-a")); + assert!(state.observe_resolved("repo-a")); + assert!(!state.observe_resolved("repo-a")); + assert!(state.observe_no_match("repo-a")); + } + + /// `retain_active` drops entries for mappings no longer in the config + /// so the set does not grow unbounded across the watch process. + #[test] + fn watch_log_state_prunes_removed_mappings() { + let mut state = WatchLogState::default(); + state.observe_no_match("repo-a"); + state.observe_no_match("repo-b"); + state.observe_no_match("repo-removed"); + + state.retain_active(["repo-a", "repo-b"]); + + // After pruning, `repo-removed` re-warns (gap means transition); + // surviving entries continue to suppress. + assert!(!state.observe_no_match("repo-a")); + assert!(!state.observe_no_match("repo-b")); + assert!(state.observe_no_match("repo-removed")); + } + // -- select_filtered_tags wire-up tests --------------------------------- /// `with_report = true` produces a `Some(FilterReport)` whose @@ -1002,7 +1332,7 @@ latest: 5 assert!(out.contains("FAIL"), "{out}"); assert!(out.contains("BelowMinTags"), "{out}"); // And carries the full pipeline trace. - assert!(out.contains("source candidates: 10"), "{out}"); - assert!(out.contains("dropped 10:"), "{out}"); + assert!(out.contains("source tags: 10"), "{out}"); + assert!(out.contains("dropped (10):"), "{out}"); } } diff --git a/src/cli/commands/watch.rs b/src/cli/commands/watch.rs index ac83be49..95dde694 100644 --- a/src/cli/commands/watch.rs +++ b/src/cli/commands/watch.rs @@ -7,7 +7,7 @@ use std::time::Duration; use ocync_sync::cache::TransferStateCache; use tokio::net::TcpListener; -use crate::cli::commands::synchronize; +use crate::cli::commands::synchronize::{self, WatchLogState}; use crate::cli::config::load_config; use crate::cli::health::HealthState; use crate::cli::shutdown::ShutdownSignal; @@ -69,6 +69,11 @@ pub(crate) async fn run( }) }; + // Watch-mode log state: tracks which mappings have already + // emitted a no-tags-matched WARN so we emit one per transition, + // not one per cycle. Pruned each cycle to mappings still in config. + let mut watch_log = WatchLogState::default(); + // Track consecutive config reload failures for backoff. let mut config_failures: u32 = 0; const BACKOFF_THRESHOLD: u32 = 3; @@ -145,6 +150,7 @@ pub(crate) async fn run( Some(&shutdown), Some(Rc::clone(&cache)), verbose, + Some(&mut watch_log), ) .await { diff --git a/src/cli/config.rs b/src/cli/config.rs index 787cf2bd..79ab07ce 100644 --- a/src/cli/config.rs +++ b/src/cli/config.rs @@ -754,7 +754,7 @@ fn validate_artifacts(context: &str, artifacts: &ArtifactsConfig) -> Result<(), ))); } if !artifacts.enabled { - tracing::warn!( + tracing::debug!( context, "artifacts.enabled is false: signatures and SBOMs will be stripped from synced images" ); @@ -769,7 +769,7 @@ fn validate_tags(context: &str, tags: &TagsConfig) -> Result<(), ConfigError> { )); } if tags.semver.is_some() && tags.latest.is_none() { - tracing::warn!( + tracing::debug!( context, "tags.semver is set without tags.latest: every tag matching the version range will sync. \ For long-running mirrors of images with many tags, consider adding 'latest: N' (with 'sort: semver') \ diff --git a/src/main.rs b/src/main.rs index 928aed4d..5974631d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -344,7 +344,8 @@ async fn main() -> std::process::ExitCode { let verbose = cli.verbose >= 1; let result = match cli.command { Commands::Sync(args) => { - cli::commands::synchronize::run(&args, &*progress, Some(&shutdown), None, verbose).await + cli::commands::synchronize::run(&args, &*progress, Some(&shutdown), None, verbose, None) + .await } Commands::Copy(args) => cli::commands::copy::run(&args, &*progress, Some(&shutdown)).await, Commands::Tags(args) => cli::commands::tags::run(&args).await, From 95e1fef566a01a54ee45191734ec7484b3946294 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 07:48:57 -0500 Subject: [PATCH 2/9] fix(observability): drop per-mapping INFO summary in real-sync The "X tags match for sync out of Y possible" line was added with the log-cleanup PR but turns out to be redundant in real-sync and watch modes -- the engine already emits an INFO per image at the moment of transfer ("image synced", with byte counts). The summary repeats the config back at the operator before any work is done. `--dry-run` is the right surface for this preview; the dedicated pretty-print there already covers it. Real-sync and watch now go straight from mapping resolution to engine work, with no per-mapping "about to" announcement to clutter watch-mode logs cycle after cycle. Drops `format_plan_line` and `log_resolved_mappings` plus their tests. `describe_filter` is retained -- it still drives the no-tags WARN's filter rationale. --- src/cli/commands/synchronize.rs | 80 +-------------------------------- 1 file changed, 2 insertions(+), 78 deletions(-) diff --git a/src/cli/commands/synchronize.rs b/src/cli/commands/synchronize.rs index c285326d..9407fbc7 100644 --- a/src/cli/commands/synchronize.rs +++ b/src/cli/commands/synchronize.rs @@ -235,8 +235,6 @@ pub(crate) async fn run( return Ok(ExitCode::Success); } - log_resolved_mappings(&mappings); - let (cache_dir, cache_path) = resolve_cache_path(&config, &args.config); let cache_ttl = resolve_cache_ttl(&config)?; let (cache, should_persist) = match external_cache { @@ -692,57 +690,16 @@ fn select_filtered_tags( } } -/// Format one per-mapping plan line for `INFO`-level emission. -/// -/// Filtered path: `{source} -> {target} [t1, t2]: {kept} tags match for sync -/// out of {N} possible`. Exact-tag fast path (no enumeration): `{kept} tags -/// (exact)`. -fn format_plan_line( - source_repo: &str, - target_repo: &str, - kept: usize, - candidate_count: Option, - target_names: &[&str], -) -> String { - let targets = target_names.join(", "); - match candidate_count { - Some(n) => format!( - "{source_repo} -> {target_repo} [{targets}]: {kept} tags match for sync out of {n} possible" - ), - None => { - format!("{source_repo} -> {target_repo} [{targets}]: {kept} tags (specified directly)") - } - } -} - /// One-line summary of a [`TagsConfig`] suitable for log emission, e.g. /// `semver >=1.0.0, latest=5`. Returns `None` when no filter applies. /// /// Single source of truth: delegates to [`FilterConfig::describe`] after -/// the same conversion the engine uses, so stage labels in the dry-run -/// pipeline and the INFO/WARN filter rationale cannot drift. +/// the same conversion the engine uses, so dry-run stage labels and the +/// no-tags-matched WARN rationale cannot drift. fn describe_filter(tags: Option<&TagsConfig>) -> Option { build_filter(tags).describe() } -/// Emit one INFO log line per resolved mapping summarizing kept/considered -/// tag counts and target list. -fn log_resolved_mappings(mappings: &[ResolvedMapping]) { - for m in mappings { - let target_names: Vec<&str> = m.targets.iter().map(|t| &*t.name).collect(); - tracing::info!( - "{}", - format_plan_line( - m.source_repo.as_str(), - m.target_repo.as_str(), - m.tags.len(), - m.candidate_count, - &target_names, - ) - ); - } -} - /// Write sync output as JSON when `--json` is passed. fn write_output(report: &SyncReport, json: bool) -> Result<(), CliError> { if json { @@ -1015,39 +972,6 @@ latest: 5 assert_eq!(parse_size(" 2GB "), Some(2_000_000_000)); } - #[test] - fn format_plan_line_filtered_path_phrasing() { - let line = format_plan_line( - "docker.io/library/alpine", - "alpine", - 3, - Some(50), - &["ecr-prod", "ghcr-mirror"], - ); - assert_eq!( - line, - "docker.io/library/alpine -> alpine [ecr-prod, ghcr-mirror]: 3 tags match for sync out of 50 possible" - ); - } - - #[test] - fn format_plan_line_exact_tag_path_marks_exact() { - let line = format_plan_line("ghcr.io/foo/bar", "bar", 3, None, &["ghcr-mirror"]); - assert_eq!( - line, - "ghcr.io/foo/bar -> bar [ghcr-mirror]: 3 tags (specified directly)" - ); - } - - #[test] - fn format_plan_line_single_target() { - let line = format_plan_line("src/repo", "dst/repo", 5, Some(80), &["only-target"]); - assert_eq!( - line, - "src/repo -> dst/repo [only-target]: 5 tags match for sync out of 80 possible" - ); - } - #[test] fn describe_filter_combines_semver_and_latest() { let tags = TagsConfig { From 30efb6917fafffdc7fb019bbef32ad8351379a30 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 07:54:58 -0500 Subject: [PATCH 3/9] fix(observability): demote per-tag engine info logs to debug In watch-mode steady-state most tags hit the skip path -- digest match at target, immutable tag at all targets, target tag is immutable. Each was firing INFO per (tag, cycle), producing N x cycles lines for zero new work. The aggregate count is already on the "sync complete" summary line. Demote the per-tag skip events (engine.rs L865, L1433, L1577, L1766) and the artifact-discovery 404 / fallback / referrers-API edge cases (L2871, L2880, L2894) to debug. Verbose mode (-v) brings them back. Kept at INFO: actual transfer events ("image synced" with byte count), leader election, multi-arch platform filtering, rate-limit recovery, and shutdown -- all real-signal lifecycle events, not per-tag chatter. Net effect: a 50-mapping x 5-tag watch cycle in steady state now emits one summary line per cycle (was 250 INFO lines). --- crates/ocync-sync/src/engine.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/ocync-sync/src/engine.rs b/crates/ocync-sync/src/engine.rs index e227e7f1..0c5f5221 100644 --- a/crates/ocync-sync/src/engine.rs +++ b/crates/ocync-sync/src/engine.rs @@ -862,7 +862,7 @@ impl SyncEngine { for tag_pair in &mapping.tags { // Tier 1: immutable tag skip (0 API calls). if mapping.should_skip_immutable(&tag_pair.target) { - info!( + debug!( source_repo = %mapping.source_repo, tag = %tag_pair.target, "skipping -- immutable tag exists at all targets" @@ -1430,7 +1430,7 @@ async fn check_targets_against_digest(params: TargetCheckParams<'_>) -> TargetCh while let Some((target_name, target_client, batch_checker, result)) = head_checks.next().await { match result { Ok(Some(head)) if head.digest == *compare_digest => { - info!( + debug!( source_repo = %source.repo, source_tag = %source.tag, target_repo = %target.repo, @@ -1574,7 +1574,7 @@ async fn full_pull_and_build_tasks(params: FullPullParams<'_>) -> DiscoveryOutco while let Some((target_name, target_client, batch_checker, result)) = head_checks.next().await { match result { Ok(Some(head)) if head.digest == *source_digest => { - info!( + debug!( source_repo = %source.repo, source_tag = %source.tag, target_repo = %target.repo, @@ -1763,7 +1763,7 @@ async fn execute_item( .notify_repo_failed(&item.target_name, &item.target.repo); if is_immutable_tag_error(&err) { - info!( + debug!( source_repo = %item.source.repo, target_repo = %item.target.repo, target_tag = %item.target.tag, @@ -2868,7 +2868,7 @@ async fn discover_referrers( } }, Err(e) if e.is_not_found() => { - info!( + debug!( repo = %source_repo, digest = %parent_digest, "no referrers found (API 404, tag fallback 404)" @@ -2877,7 +2877,7 @@ async fn discover_referrers( } Err(e) => { // Non-404 error on fallback is not fatal; log and continue. - info!( + debug!( repo = %source_repo, digest = %parent_digest, error = %e, @@ -2891,7 +2891,7 @@ async fn discover_referrers( Err(e) => { // Non-404 error from referrers API. Log and continue rather // than failing the entire image sync for an artifact query. - info!( + debug!( repo = %source_repo, digest = %parent_digest, error = %e, From bbcdd995e287cc075bf272a76afdd666f7b86b98 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 08:47:53 -0500 Subject: [PATCH 4/9] fix(observability): dedupe watch-mode summary, drop redundant cycle INFO In watch mode the per-cycle "sync complete: ..." line was repeating verbatim every cycle in steady state, paired with an "INFO sync cycle complete" wrapper that conveyed the same fact. For an idle pod cycling every 60s, the log stream was N pairs of identical lines per hour. - Add DedupingWatchProgress, a ProgressReporter wrapper that compares the new SyncStats to the prior cycle's and only forwards run_completed when they differ. First cycle always emits; identical follow-ups go silent. Wraps the user's reporter so per-image events still pass through. - Stats comparison ignores SyncReport.duration on purpose -- wall-clock drift cycle-to-cycle in steady state would otherwise re-emit every time. Test pins the contract. - Drop "INFO sync cycle complete" from the watch loop. Cycle completion is conveyed by the dedup-aware "sync complete:" line on stdout (when stats change) and by /healthz (always). The INFO added nothing. - Derive Clone, PartialEq, Eq on SyncStats so the wrapper can compare without writing a digest helper. Net effect: a steady-state watch loop emits log volume proportional to state transitions, not cycle count. Sync-mode (one-off) is unchanged -- the user's progress reporter is passed through verbatim. --- crates/ocync-sync/src/lib.rs | 2 +- src/cli/commands/watch.rs | 12 ++- src/cli/progress.rs | 154 ++++++++++++++++++++++++++++++++++- 3 files changed, 164 insertions(+), 4 deletions(-) diff --git a/crates/ocync-sync/src/lib.rs b/crates/ocync-sync/src/lib.rs index 3cf88e26..579cf6be 100644 --- a/crates/ocync-sync/src/lib.rs +++ b/crates/ocync-sync/src/lib.rs @@ -184,7 +184,7 @@ impl std::fmt::Display for ErrorKind { } /// Aggregate statistics for a sync run. -#[derive(Debug, Default, Serialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize)] pub struct SyncStats { /// Number of images successfully synced. pub images_synced: u64, diff --git a/src/cli/commands/watch.rs b/src/cli/commands/watch.rs index 95dde694..14955c27 100644 --- a/src/cli/commands/watch.rs +++ b/src/cli/commands/watch.rs @@ -10,6 +10,7 @@ use tokio::net::TcpListener; use crate::cli::commands::synchronize::{self, WatchLogState}; use crate::cli::config::load_config; use crate::cli::health::HealthState; +use crate::cli::progress::DedupingWatchProgress; use crate::cli::shutdown::ShutdownSignal; use crate::cli::{CliError, ExitCode}; use crate::{SyncArgs, WatchArgs}; @@ -25,6 +26,11 @@ pub(crate) async fn run( let interval = Duration::from_secs(args.interval); tracing::info!(interval_secs = args.interval, "starting watch mode"); + // Wrap the caller's progress reporter so the per-cycle "sync complete" + // line is emitted only when the aggregate stats actually change. An + // all-skip steady-state watch goes silent after the first cycle. + let dedup_progress = DedupingWatchProgress::new(progress); + let health_state = Rc::new(RefCell::new(HealthState::new(interval))); // Resolve cache path and TTL from the initial config load. These are @@ -146,7 +152,7 @@ pub(crate) async fn run( match synchronize::run( &sync_args, - progress, + &dedup_progress, Some(&shutdown), Some(Rc::clone(&cache)), verbose, @@ -155,7 +161,9 @@ pub(crate) async fn run( .await { Ok(code) => { - tracing::info!(exit_code = ?code, "sync cycle complete"); + // Cycle completion is conveyed by the dedup-aware + // "sync complete: ..." line on stdout (when stats + // change) and by /healthz; no separate INFO needed. if matches!(code, ExitCode::Success | ExitCode::PartialFailure) { health_state.borrow_mut().record_success(); } diff --git a/src/cli/progress.rs b/src/cli/progress.rs index 3429640d..69af88f7 100644 --- a/src/cli/progress.rs +++ b/src/cli/progress.rs @@ -7,7 +7,7 @@ use std::cell::RefCell; use std::io::{self, Write}; use ocync_sync::progress::ProgressReporter; -use ocync_sync::{ImageResult, ImageStatus, SyncReport}; +use ocync_sync::{ImageResult, ImageStatus, SyncReport, SyncStats}; use crate::cli::output::{format_bytes, format_duration}; @@ -176,6 +176,48 @@ impl ProgressReporter for TextProgress { } } +/// Watch-mode wrapper that dedupes the per-cycle summary so an idle pod +/// stops re-emitting the same `sync complete: 0 synced, N skipped, ...` +/// line once per cycle. Per-image events still flow through the inner +/// reporter unchanged. +/// +/// The first cycle always emits. Subsequent cycles emit only when the +/// aggregate [`SyncStats`] differ from the prior cycle's -- so a transfer, +/// failure, or count change is visible, but a steady-state all-skip cycle +/// is silent. +pub(crate) struct DedupingWatchProgress<'a> { + inner: &'a dyn ProgressReporter, + last_stats: RefCell>, +} + +impl<'a> DedupingWatchProgress<'a> { + pub(crate) fn new(inner: &'a dyn ProgressReporter) -> Self { + Self { + inner, + last_stats: RefCell::new(None), + } + } +} + +impl ProgressReporter for DedupingWatchProgress<'_> { + fn image_started(&self, source: &str, target: &str) { + self.inner.image_started(source, target); + } + + fn image_completed(&self, result: &ImageResult) { + self.inner.image_completed(result); + } + + fn run_completed(&self, report: &SyncReport) { + let mut last = self.last_stats.borrow_mut(); + let changed = last.as_ref().is_none_or(|prev| prev != &report.stats); + if changed { + self.inner.run_completed(report); + *last = Some(report.stats.clone()); + } + } +} + #[cfg(test)] mod tests { use std::rc::Rc; @@ -845,4 +887,114 @@ mod tests { "suppress_summary should suppress stdout" ); } + + // -- DedupingWatchProgress ------------------------------------------- + + /// Counting progress reporter that records each `run_completed` call. + /// Used to assert how many times the wrapper passes through. + #[derive(Default)] + struct CountingProgress { + runs: RefCell, + } + impl ProgressReporter for CountingProgress { + fn image_started(&self, _: &str, _: &str) {} + fn image_completed(&self, _: &ImageResult) {} + fn run_completed(&self, _: &SyncReport) { + *self.runs.borrow_mut() += 1; + } + } + + fn report_with(stats: SyncStats) -> SyncReport { + SyncReport { + run_id: Uuid::now_v7(), + images: Vec::new(), + stats, + // Duration intentionally varies cycle-to-cycle in production; + // pick non-zero here so tests notice if the dedup keys on it. + duration: Duration::from_secs(1), + } + } + + /// First cycle always passes through; identical follow-up cycles are + /// suppressed; a third cycle that differs passes through again. + #[test] + fn deduping_watch_emits_only_when_stats_change() { + let inner = CountingProgress::default(); + let dedup = DedupingWatchProgress::new(&inner as &dyn ProgressReporter); + + let steady = SyncStats { + images_skipped: 250, + ..SyncStats::default() + }; + let active = SyncStats { + images_synced: 1, + images_skipped: 249, + ..SyncStats::default() + }; + + dedup.run_completed(&report_with(steady.clone())); // cycle 1: emit + dedup.run_completed(&report_with(steady.clone())); // cycle 2: suppress + dedup.run_completed(&report_with(steady.clone())); // cycle 3: suppress + dedup.run_completed(&report_with(active.clone())); // cycle 4: emit (changed) + dedup.run_completed(&report_with(active)); // cycle 5: suppress + dedup.run_completed(&report_with(steady)); // cycle 6: emit (changed) + + assert_eq!(*inner.runs.borrow(), 3); + } + + /// Wall-clock duration varies cycle-to-cycle even in steady state; the + /// dedup must key on stats only, not on the report's `duration`. + #[test] + fn deduping_watch_ignores_duration_drift() { + let inner = CountingProgress::default(); + let dedup = DedupingWatchProgress::new(&inner as &dyn ProgressReporter); + + let stats = SyncStats { + images_skipped: 5, + ..SyncStats::default() + }; + + let mut report1 = report_with(stats.clone()); + report1.duration = Duration::from_millis(800); + let mut report2 = report_with(stats); + report2.duration = Duration::from_millis(1_400); + + dedup.run_completed(&report1); + dedup.run_completed(&report2); + + assert_eq!(*inner.runs.borrow(), 1, "duration drift must not re-emit"); + } + + /// Per-image events are never deduped -- they describe distinct + /// transfers and must always reach the inner reporter. + #[test] + fn deduping_watch_passes_image_events_through() { + struct ImageCounter { + started: RefCell, + completed: RefCell, + } + impl ProgressReporter for ImageCounter { + fn image_started(&self, _: &str, _: &str) { + *self.started.borrow_mut() += 1; + } + fn image_completed(&self, _: &ImageResult) { + *self.completed.borrow_mut() += 1; + } + fn run_completed(&self, _: &SyncReport) {} + } + let inner = ImageCounter { + started: RefCell::new(0), + completed: RefCell::new(0), + }; + let dedup = DedupingWatchProgress::new(&inner as &dyn ProgressReporter); + + dedup.image_started("a", "b"); + dedup.image_started("c", "d"); + dedup.image_completed(&make_result(ImageStatus::Synced, 1)); + dedup.image_completed(&make_result(ImageStatus::Synced, 2)); + dedup.image_completed(&make_result(ImageStatus::Synced, 3)); + + assert_eq!(*inner.started.borrow(), 2); + assert_eq!(*inner.completed.borrow(), 3); + } } From 0dbf91a2f520dcf5dd5954d701de30f48091afcc Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 09:01:31 -0500 Subject: [PATCH 5/9] fix(observability): per-mapping outcome line with src/dst context The aggregate stdout summary ("sync complete: 0 synced, 250 skipped...") named no mapping. For a 50-mapping watch in steady state, the operator got identical aggregate counts every cycle with zero context about what was tracked or where it was going. The user's exact complaint: "no mention/reference to the image being synced - pure unknown noise". Replace it with a per-mapping post-event INFO/WARN line that names the specific mapping: library/alpine -> ocync-test/alpine-1h [ttl]: synced 1 (28.5 MB) library/alpine -> ocync-test/alpine-1h [ttl]: skipped 1 library/alpine -> ocync-test/alpine-1h [ttl]: failed 1 <- WARN Implementation: - Drop TextProgress::run_completed stdout aggregate (was the contextless noise) and the `suppress_summary` plumbing it required. JSON output still owns stdout in --json mode via write_output, unchanged. - Drop DedupingWatchProgress -- replaced by per-mapping dedup on the more-informative per-mapping line. - After engine.run returns, group ImageResults by mapping (source_repo + target_repo prefix) into MappingOutcome { synced, skipped, failed, bytes }. Emit one INFO per mapping; WARN when any failed > 0. - Watch mode plumbs through WatchLogState.last_outcomes (HashMap) and suppresses follow-up cycles where the outcome is identical to the prior cycle. retain_active prunes stale entries on config edit. Format: zero counts are omitted ("synced 1" not "synced 1, skipped 0, failed 0"); bytes clause appears only when > 0; fields are also attached as structured tracing fields (from, to, synced, skipped, failed, bytes) for log aggregators. --- src/cli/commands/synchronize.rs | 325 ++++++++++++++- src/cli/commands/watch.rs | 8 +- src/cli/progress.rs | 705 ++------------------------------ src/main.rs | 15 +- 4 files changed, 363 insertions(+), 690 deletions(-) diff --git a/src/cli/commands/synchronize.rs b/src/cli/commands/synchronize.rs index 9407fbc7..6c74f33a 100644 --- a/src/cli/commands/synchronize.rs +++ b/src/cli/commands/synchronize.rs @@ -115,14 +115,21 @@ impl std::fmt::Display for NoTagsInfo { } } -/// Per-process state that lets watch-mode emit one no-tags WARN per -/// transition into the failure state rather than one per cycle. Sync mode -/// passes `None`. State lives in `watch::run` so it spans loop iterations. +/// Per-process state that lets watch-mode log on transitions instead of +/// every cycle. Sync mode passes `None`. State lives in `watch::run` so it +/// spans loop iterations. +/// +/// Tracks two pieces of cross-cycle context: +/// +/// 1. **No-tags failure set**: mappings whose filter rejected every source +/// tag, used to emit one WARN per failure run instead of per cycle. +/// 2. **Per-mapping outcomes**: the prior cycle's [`MappingOutcome`] keyed +/// by `mapping.from`, used to suppress identical follow-up cycles in +/// the per-mapping INFO/WARN stream. #[derive(Debug, Default)] pub(crate) struct WatchLogState { - /// Mappings (keyed by `mapping.from`) that emitted a no-tags WARN in a - /// prior cycle and have not since recovered. warned_no_tags: HashSet, + last_outcomes: HashMap, } impl WatchLogState { @@ -140,12 +147,27 @@ impl WatchLogState { self.warned_no_tags.remove(from) } + /// Record `outcome` as the latest result for `from`. Returns `true` when + /// the caller should emit (first observation, or outcome differs from + /// the prior cycle); `false` when identical to the last seen value. + fn observe_mapping_outcome(&mut self, from: &str, outcome: &MappingOutcome) -> bool { + match self.last_outcomes.get(from) { + Some(prev) if prev == outcome => false, + _ => { + self.last_outcomes.insert(from.to_string(), outcome.clone()); + true + } + } + } + /// Drop entries for mappings no longer present in the active set so the /// state does not grow unbounded across edits to the config. fn retain_active<'a>(&mut self, active: impl IntoIterator) { let active_set: HashSet<&str> = active.into_iter().collect(); self.warned_no_tags .retain(|k| active_set.contains(k.as_str())); + self.last_outcomes + .retain(|k, _| active_set.contains(k.as_str())); } } @@ -292,6 +314,18 @@ pub(crate) async fn run( .map_or(DEFAULT_MAX_CONCURRENT_TRANSFERS, |g| { g.max_concurrent_transfers }); + // Capture per-mapping metadata before the engine consumes `mappings`. + // Used to emit one INFO line per mapping after the engine returns, + // grouped from the report's per-image outcomes. + let descriptors: Vec = mappings + .iter() + .map(|m| MappingDescriptor { + from: m.source_repo.as_str().to_string(), + target_repo: m.target_repo.as_str().to_string(), + target_names: m.targets.iter().map(|t| (*t.name).to_string()).collect(), + }) + .collect(); + let engine = SyncEngine::new(RetryConfig::default(), max_concurrent); let report = engine .run(mappings, cache.clone(), staging, progress, shutdown) @@ -304,11 +338,134 @@ pub(crate) async fn run( } } + emit_mapping_outcomes(&descriptors, &report, watch_log); + write_output(&report, args.json)?; Ok(ExitCode::from_report(report.exit_code())) } +/// Per-mapping metadata captured before the engine consumes `mappings`, +/// so we can join it with the engine's per-image report after the fact +/// to emit one log line per mapping (with source/target context). +struct MappingDescriptor { + from: String, + target_repo: String, + target_names: Vec, +} + +/// Per-mapping aggregated outcome derived from [`SyncReport.images`]. +/// Used for log emission and watch-mode change detection. +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub(crate) struct MappingOutcome { + pub synced: u64, + pub skipped: u64, + pub failed: u64, + pub bytes: u64, +} + +impl MappingOutcome { + fn is_empty(&self) -> bool { + self.synced == 0 && self.skipped == 0 && self.failed == 0 + } +} + +/// Emit one INFO (or WARN, on failures) per mapping summarizing what its +/// configured tags did this cycle. In watch mode (when `watch_log` is +/// `Some`), suppress mappings whose outcome is unchanged from the prior +/// cycle so steady-state pods log only on transition. +fn emit_mapping_outcomes( + descriptors: &[MappingDescriptor], + report: &SyncReport, + mut watch_log: Option<&mut WatchLogState>, +) { + for d in descriptors { + let outcome = aggregate_mapping_outcome(&d.from, &d.target_repo, report); + // No images for this mapping in the report (e.g. the mapping was + // resolved to zero tags by an upstream filter that the engine + // never saw). The no-tags WARN already covered it; skip here. + if outcome.is_empty() { + continue; + } + let should_emit = match watch_log.as_deref_mut() { + Some(state) => state.observe_mapping_outcome(&d.from, &outcome), + None => true, + }; + if !should_emit { + continue; + } + let line = format_mapping_outcome(d, &outcome); + if outcome.failed > 0 { + tracing::warn!( + from = %d.from, + to = %d.target_repo, + synced = outcome.synced, + skipped = outcome.skipped, + failed = outcome.failed, + bytes = outcome.bytes, + "{line}" + ); + } else { + tracing::info!( + from = %d.from, + to = %d.target_repo, + synced = outcome.synced, + skipped = outcome.skipped, + bytes = outcome.bytes, + "{line}" + ); + } + } +} + +fn aggregate_mapping_outcome( + source_repo: &str, + target_repo: &str, + report: &SyncReport, +) -> MappingOutcome { + let src_prefix = format!("{source_repo}:"); + let tgt_prefix = format!("{target_repo}:"); + let mut o = MappingOutcome::default(); + for r in &report.images { + if !(r.source.starts_with(&src_prefix) && r.target.starts_with(&tgt_prefix)) { + continue; + } + match r.status { + ocync_sync::ImageStatus::Synced => { + o.synced += 1; + o.bytes += r.bytes_transferred; + } + ocync_sync::ImageStatus::Skipped { .. } => o.skipped += 1, + ocync_sync::ImageStatus::Failed { .. } => o.failed += 1, + } + } + o +} + +fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome) -> String { + let targets = d.target_names.join(", "); + let mut parts = Vec::with_capacity(3); + if o.synced > 0 { + parts.push(format!("synced {}", o.synced)); + } + if o.skipped > 0 { + parts.push(format!("skipped {}", o.skipped)); + } + if o.failed > 0 { + parts.push(format!("failed {}", o.failed)); + } + let counts = parts.join(", "); + let bytes_clause = if o.bytes > 0 { + format!(" ({})", crate::cli::output::format_bytes(o.bytes)) + } else { + String::new() + }; + format!( + "{} -> {} [{targets}]: {counts}{bytes_clause}", + d.from, d.target_repo + ) +} + /// Parse a human-readable duration string into a [`Duration`]. /// /// Accepts: @@ -1106,6 +1263,164 @@ latest: 5 assert!(state.observe_no_match("repo-removed")); } + // -- per-mapping outcome aggregation + dedup --------------------------- + + fn img( + source: &str, + target: &str, + status: ocync_sync::ImageStatus, + bytes: u64, + ) -> ocync_sync::ImageResult { + use ocync_sync::{BlobTransferStats, ImageResult}; + ImageResult { + image_id: uuid::Uuid::now_v7(), + source: source.into(), + target: target.into(), + status, + bytes_transferred: bytes, + blob_stats: BlobTransferStats::default(), + duration: Duration::from_secs(1), + artifacts_skipped: false, + } + } + + fn report_with(images: Vec) -> SyncReport { + SyncReport { + run_id: uuid::Uuid::now_v7(), + images, + stats: ocync_sync::SyncStats::default(), + duration: Duration::from_secs(1), + } + } + + /// Aggregation groups by `source_repo:` + `target_repo:` prefix so + /// images from a different mapping (same source repo, different target) + /// don't bleed into this mapping's counts. + #[test] + fn aggregate_mapping_outcome_groups_by_source_and_target() { + let report = report_with(vec![ + img( + "library/alpine:3.20", + "mirror/a:3.20", + ocync_sync::ImageStatus::Synced, + 100, + ), + img( + "library/alpine:3.21", + "mirror/a:3.21", + ocync_sync::ImageStatus::Synced, + 200, + ), + img( + "library/alpine:3.21", + "mirror/b:3.21", + ocync_sync::ImageStatus::Skipped { + reason: ocync_sync::SkipReason::DigestMatch, + }, + 0, + ), + ]); + let o = aggregate_mapping_outcome("library/alpine", "mirror/a", &report); + assert_eq!(o.synced, 2); + assert_eq!(o.skipped, 0); + assert_eq!(o.bytes, 300); + } + + /// Empty mappings (no images in the report) skip silently -- the + /// no-tags WARN is the right surface for that case, not this one. + #[test] + fn empty_outcome_is_recognized() { + let outcome = MappingOutcome::default(); + assert!(outcome.is_empty()); + let with_skip = MappingOutcome { + skipped: 1, + ..MappingOutcome::default() + }; + assert!(!with_skip.is_empty()); + } + + /// First observation emits; identical follow-up suppresses; outcome + /// change emits again. Mirrors the no-tags transition contract. + #[test] + fn watch_log_state_dedupes_identical_mapping_outcomes() { + let mut state = WatchLogState::default(); + let steady = MappingOutcome { + skipped: 5, + ..MappingOutcome::default() + }; + let active = MappingOutcome { + synced: 1, + skipped: 4, + bytes: 1024, + ..MappingOutcome::default() + }; + + assert!(state.observe_mapping_outcome("repo-a", &steady)); // first: emit + assert!(!state.observe_mapping_outcome("repo-a", &steady)); // same: suppress + assert!(!state.observe_mapping_outcome("repo-a", &steady)); // same: suppress + assert!(state.observe_mapping_outcome("repo-a", &active)); // changed: emit + assert!(!state.observe_mapping_outcome("repo-a", &active)); // same: suppress + assert!(state.observe_mapping_outcome("repo-a", &steady)); // changed back: emit + } + + /// `retain_active` also prunes per-mapping outcome cache so a removed + /// mapping doesn't keep its stale entry forever. + #[test] + fn watch_log_state_retain_active_also_prunes_outcomes() { + let mut state = WatchLogState::default(); + let outcome = MappingOutcome { + skipped: 1, + ..MappingOutcome::default() + }; + state.observe_mapping_outcome("keep", &outcome); + state.observe_mapping_outcome("drop", &outcome); + + state.retain_active(["keep"]); + + // Re-observation of "drop" emits because its prior entry was pruned. + assert!(state.observe_mapping_outcome("drop", &outcome)); + // "keep" still suppresses identical follow-up. + assert!(!state.observe_mapping_outcome("keep", &outcome)); + } + + /// `format_mapping_outcome` omits zero counts so the line stays terse, + /// and elides the bytes clause when nothing transferred. + #[test] + fn format_mapping_outcome_omits_zero_counts() { + let d = MappingDescriptor { + from: "library/alpine".into(), + target_repo: "mirror/alpine".into(), + target_names: vec!["ttl".into()], + }; + let synced_only = MappingOutcome { + synced: 3, + bytes: 1024, + ..MappingOutcome::default() + }; + assert_eq!( + format_mapping_outcome(&d, &synced_only), + "library/alpine -> mirror/alpine [ttl]: synced 3 (1.0 KB)" + ); + let skipped_only = MappingOutcome { + skipped: 5, + ..MappingOutcome::default() + }; + assert_eq!( + format_mapping_outcome(&d, &skipped_only), + "library/alpine -> mirror/alpine [ttl]: skipped 5" + ); + let mixed = MappingOutcome { + synced: 1, + skipped: 2, + failed: 1, + bytes: 2048, + }; + assert_eq!( + format_mapping_outcome(&d, &mixed), + "library/alpine -> mirror/alpine [ttl]: synced 1, skipped 2, failed 1 (2.0 KB)" + ); + } + // -- select_filtered_tags wire-up tests --------------------------------- /// `with_report = true` produces a `Some(FilterReport)` whose diff --git a/src/cli/commands/watch.rs b/src/cli/commands/watch.rs index 14955c27..67781d5d 100644 --- a/src/cli/commands/watch.rs +++ b/src/cli/commands/watch.rs @@ -10,7 +10,6 @@ use tokio::net::TcpListener; use crate::cli::commands::synchronize::{self, WatchLogState}; use crate::cli::config::load_config; use crate::cli::health::HealthState; -use crate::cli::progress::DedupingWatchProgress; use crate::cli::shutdown::ShutdownSignal; use crate::cli::{CliError, ExitCode}; use crate::{SyncArgs, WatchArgs}; @@ -26,11 +25,6 @@ pub(crate) async fn run( let interval = Duration::from_secs(args.interval); tracing::info!(interval_secs = args.interval, "starting watch mode"); - // Wrap the caller's progress reporter so the per-cycle "sync complete" - // line is emitted only when the aggregate stats actually change. An - // all-skip steady-state watch goes silent after the first cycle. - let dedup_progress = DedupingWatchProgress::new(progress); - let health_state = Rc::new(RefCell::new(HealthState::new(interval))); // Resolve cache path and TTL from the initial config load. These are @@ -152,7 +146,7 @@ pub(crate) async fn run( match synchronize::run( &sync_args, - &dedup_progress, + progress, Some(&shutdown), Some(Rc::clone(&cache)), verbose, diff --git a/src/cli/progress.rs b/src/cli/progress.rs index 69af88f7..343088ea 100644 --- a/src/cli/progress.rs +++ b/src/cli/progress.rs @@ -1,13 +1,15 @@ //! Verbosity-aware progress reporters for sync output. //! -//! [`TextProgress`] writes plain status lines to stderr (non-TTY and TTY -//! alike). The run summary always goes to stdout. +//! [`TextProgress`] writes per-image status lines to stderr. There is no +//! per-cycle aggregate stdout line: the CLI driver emits a per-mapping +//! INFO line via tracing after the engine returns, which carries the +//! source/target context an aggregate cannot. use std::cell::RefCell; use std::io::{self, Write}; use ocync_sync::progress::ProgressReporter; -use ocync_sync::{ImageResult, ImageStatus, SyncReport, SyncStats}; +use ocync_sync::{ImageResult, ImageStatus, SyncReport}; use crate::cli::output::{format_bytes, format_duration}; @@ -49,111 +51,29 @@ fn format_image_line(result: &ImageResult, verbosity: u8) -> Option { } } -/// Write the run summary to `stdout`, or do nothing if `suppress_summary` -/// is true or the report contains no images. -fn write_run_summary( - stdout: &RefCell>, - report: &SyncReport, - suppress_summary: bool, -) { - if suppress_summary { - return; - } - if report.images.is_empty() { - return; - } - let s = &report.stats; - let has_discovery = s.discovery_cache_hits > 0 - || s.discovery_cache_misses > 0 - || s.discovery_head_first_skips > 0 - || s.immutable_tag_skips > 0; - let discovery = if has_discovery { - let head_first_suffix = if s.discovery_head_first_skips > 0 { - format!(", {} head_first", s.discovery_head_first_skips) - } else { - String::new() - }; - let immutable_suffix = if s.immutable_tag_skips > 0 { - format!(", {} immutable", s.immutable_tag_skips) - } else { - String::new() - }; - format!( - " | discovery: {} cached, {} pulled{}{}", - s.discovery_cache_hits, s.discovery_cache_misses, head_first_suffix, immutable_suffix, - ) - } else { - String::new() - }; - let artifacts_warn = if s.artifacts_skipped > 0 { - format!(" | {} artifacts skipped", s.artifacts_skipped) - } else { - String::new() - }; - if let Err(e) = writeln!( - stdout.borrow_mut(), - "sync complete: {} synced, {} skipped, {} failed | blobs: {} transferred, {} skipped, {} mounted | {} in {}{}{}", - s.images_synced, - s.images_skipped, - s.images_failed, - s.blobs_transferred, - s.blobs_skipped, - s.blobs_mounted, - format_bytes(s.bytes_transferred), - format_duration(report.duration), - discovery, - artifacts_warn, - ) { - tracing::warn!(error = %e, "failed to write progress summary to stdout"); - } -} - /// Text progress reporter with configurable verbosity. /// -/// Per-image status lines go to stderr (alongside tracing logs). -/// The run summary goes to stdout (pipeable, parseable). -/// -/// Uses [`RefCell`] for interior mutability because the -/// [`ProgressReporter`] trait takes `&self` and the engine runs on a -/// single-threaded tokio runtime. +/// Per-image status lines (`synced` / `FAILED`) go to stderr. There is no +/// stdout per-cycle aggregate; the CLI emits per-mapping INFO lines from +/// the sync driver instead. pub(crate) struct TextProgress { verbosity: u8, - /// When true, suppress the stdout summary line. Used when JSON output - /// owns stdout (`--json`) or when the summary is redundant (e.g., `copy` - /// with a single image where the per-image line says everything). - suppress_summary: bool, stderr: RefCell>, - stdout: RefCell>, } impl TextProgress { - /// Create a new text progress reporter writing to real stderr/stdout. - /// - /// When `suppress_summary` is true, the run summary is suppressed on - /// stdout. Per-image status lines still go to stderr. Used when JSON - /// output owns stdout or when the summary is redundant (single-image copy). - pub(crate) fn new(verbosity: u8, suppress_summary: bool) -> Self { + pub(crate) fn new(verbosity: u8) -> Self { Self { verbosity, - suppress_summary, stderr: RefCell::new(Box::new(io::stderr())), - stdout: RefCell::new(Box::new(io::stdout())), } } - /// Create a text progress reporter with custom writers (for testing). #[cfg(test)] - fn with_writers( - verbosity: u8, - suppress_summary: bool, - stderr: Box, - stdout: Box, - ) -> Self { + fn with_writer(verbosity: u8, stderr: Box) -> Self { Self { verbosity, - suppress_summary, stderr: RefCell::new(stderr), - stdout: RefCell::new(stdout), } } } @@ -171,50 +91,12 @@ impl ProgressReporter for TextProgress { } } - fn run_completed(&self, report: &SyncReport) { - write_run_summary(&self.stdout, report, self.suppress_summary); - } -} - -/// Watch-mode wrapper that dedupes the per-cycle summary so an idle pod -/// stops re-emitting the same `sync complete: 0 synced, N skipped, ...` -/// line once per cycle. Per-image events still flow through the inner -/// reporter unchanged. -/// -/// The first cycle always emits. Subsequent cycles emit only when the -/// aggregate [`SyncStats`] differ from the prior cycle's -- so a transfer, -/// failure, or count change is visible, but a steady-state all-skip cycle -/// is silent. -pub(crate) struct DedupingWatchProgress<'a> { - inner: &'a dyn ProgressReporter, - last_stats: RefCell>, -} - -impl<'a> DedupingWatchProgress<'a> { - pub(crate) fn new(inner: &'a dyn ProgressReporter) -> Self { - Self { - inner, - last_stats: RefCell::new(None), - } - } -} - -impl ProgressReporter for DedupingWatchProgress<'_> { - fn image_started(&self, source: &str, target: &str) { - self.inner.image_started(source, target); - } - - fn image_completed(&self, result: &ImageResult) { - self.inner.image_completed(result); - } - - fn run_completed(&self, report: &SyncReport) { - let mut last = self.last_stats.borrow_mut(); - let changed = last.as_ref().is_none_or(|prev| prev != &report.stats); - if changed { - self.inner.run_completed(report); - *last = Some(report.stats.clone()); - } + fn run_completed(&self, _report: &SyncReport) { + // Per-cycle aggregate is no longer emitted here; the CLI driver + // emits a per-mapping line via tracing INFO after the engine + // returns, which carries the source/target context the aggregate + // lacked. The `--json` path writes the structured report to stdout + // separately in `write_output`. } } @@ -442,559 +324,54 @@ mod tests { "skipped source/repo:v1 -> target/repo:v1 (digest match)" ); } + // - TextProgress IO tests (stderr only) -- - // - write_run_summary tests -- - - #[test] - fn summary_exact_format() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 3, - images_skipped: 47, - images_failed: 1, - blobs_transferred: 12, - blobs_skipped: 5, - blobs_mounted: 34, - bytes_transferred: 432_000_000, - ..SyncStats::default() - }, - duration: Duration::from_secs(47), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert_eq!( - output, - "sync complete: 3 synced, 47 skipped, 1 failed | blobs: 12 transferred, 5 skipped, 34 mounted | 432.0 MB in 47s\n" - ); - } - - #[test] - fn summary_with_discovery_stats() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 3, - images_skipped: 47, - images_failed: 0, - blobs_transferred: 12, - blobs_skipped: 5, - blobs_mounted: 34, - bytes_transferred: 432_000_000, - discovery_cache_hits: 40, - discovery_cache_misses: 10, - discovery_head_failures: 2, - discovery_target_stale: 1, - discovery_head_first_skips: 0, - immutable_tag_skips: 0, - artifacts_skipped: 0, - }, - duration: Duration::from_secs(47), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert_eq!( - output, - "sync complete: 3 synced, 47 skipped, 0 failed | blobs: 12 transferred, 5 skipped, 34 mounted | 432.0 MB in 47s | discovery: 40 cached, 10 pulled\n" - ); + fn text_progress(verbosity: u8) -> (TextProgress, Buf) { + let stderr_buf: Buf = Rc::new(RefCell::new(Vec::new())); + let progress = + TextProgress::with_writer(verbosity, Box::new(RcWriter(Rc::clone(&stderr_buf)))); + (progress, stderr_buf) } #[test] - fn summary_omits_discovery_when_zero() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = make_report(vec![make_result(ImageStatus::Synced, 1024)]); - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!(!output.contains("discovery"), "got: {output}"); - } - - #[test] - fn summary_with_only_cache_hits_includes_discovery() { - // Distinguishes the `||` from `&&` in the discovery condition: - // even when misses == 0, hits > 0 should show the discovery suffix. - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 1, - discovery_cache_hits: 5, - discovery_cache_misses: 0, - ..SyncStats::default() - }, - duration: Duration::from_secs(1), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!( - output.contains("discovery: 5 cached, 0 pulled"), - "got: {output}" - ); - } - - #[test] - fn summary_with_only_cache_misses_includes_discovery() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 1, - discovery_cache_hits: 0, - discovery_cache_misses: 3, - ..SyncStats::default() - }, - duration: Duration::from_secs(1), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!( - output.contains("discovery: 0 cached, 3 pulled"), - "got: {output}" - ); - } - - #[test] - fn summary_with_head_first_skips_includes_suffix() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 1, - images_skipped: 3, - discovery_cache_hits: 2, - discovery_cache_misses: 1, - discovery_head_first_skips: 3, - ..SyncStats::default() - }, - duration: Duration::from_secs(5), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!( - output.contains("discovery: 2 cached, 1 pulled, 3 head_first"), - "got: {output}" - ); - } - - #[test] - fn summary_with_only_head_first_skips_includes_discovery() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 1, - discovery_head_first_skips: 5, - ..SyncStats::default() - }, - duration: Duration::from_secs(1), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!( - output.contains("discovery: 0 cached, 0 pulled, 5 head_first"), - "got: {output}" - ); - } - - #[test] - fn summary_with_immutable_skips_includes_suffix() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 1, - images_skipped: 10, - discovery_cache_hits: 2, - discovery_cache_misses: 1, - immutable_tag_skips: 8, - ..SyncStats::default() - }, - duration: Duration::from_secs(3), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!( - output.contains("discovery: 2 cached, 1 pulled, 8 immutable"), - "got: {output}" - ); - } - - #[test] - fn summary_with_only_immutable_skips_includes_discovery() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 1, - immutable_tag_skips: 50, - ..SyncStats::default() - }, - duration: Duration::from_secs(1), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!( - output.contains("discovery: 0 cached, 0 pulled, 50 immutable"), - "got: {output}" - ); - } - - #[test] - fn summary_with_artifacts_skipped() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![make_result(ImageStatus::Synced, 1024)], - stats: SyncStats { - images_synced: 5, - artifacts_skipped: 2, - ..SyncStats::default() - }, - duration: Duration::from_secs(10), - }; - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!(output.contains("2 artifacts skipped"), "got: {output}"); - } - - #[test] - fn summary_without_artifacts_skipped_omits_suffix() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = make_report(vec![make_result(ImageStatus::Synced, 1024)]); - write_run_summary(&stdout, &report, false); - let output = String::from_utf8(buf.borrow().clone()).unwrap(); - assert!(!output.contains("artifacts skipped"), "got: {output}"); - } - - #[test] - fn summary_suppressed_produces_no_output() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = make_report(vec![make_result(ImageStatus::Synced, 1024)]); - write_run_summary(&stdout, &report, true); - assert!(buf.borrow().is_empty()); - } - - #[test] - fn summary_empty_report_produces_no_output() { - let buf: Buf = Rc::new(RefCell::new(Vec::new())); - let stdout: RefCell> = RefCell::new(Box::new(RcWriter(Rc::clone(&buf)))); - let report = SyncReport { - run_id: Uuid::now_v7(), - images: vec![], - stats: SyncStats::default(), - duration: Duration::ZERO, - }; - write_run_summary(&stdout, &report, false); - assert!(buf.borrow().is_empty()); - } - - // - TextProgress tests (wiring: writes to correct streams) -- - - fn test_text_progress(verbosity: u8) -> (TextProgress, Buf, Buf) { - test_text_progress_with_suppress(verbosity, false) - } - - fn test_text_progress_with_suppress( - verbosity: u8, - suppress_summary: bool, - ) -> (TextProgress, Buf, Buf) { - let stderr_buf = Rc::new(RefCell::new(Vec::new())); - let stdout_buf = Rc::new(RefCell::new(Vec::new())); - let progress = TextProgress::with_writers( - verbosity, - suppress_summary, - Box::new(RcWriter(Rc::clone(&stderr_buf))), - Box::new(RcWriter(Rc::clone(&stdout_buf))), - ); - (progress, stderr_buf, stdout_buf) - } - - #[test] - fn text_image_started_is_noop() { - let (progress, stderr, stdout) = test_text_progress(1); - progress.image_started("source/repo:v1", "target/repo:v1"); - assert!( - stderr.borrow().is_empty(), - "image_started should not write to stderr" - ); - assert!( - stdout.borrow().is_empty(), - "image_started should not write to stdout" - ); - } - - #[test] - fn text_image_completed_writes_to_stderr() { - let (progress, stderr, stdout) = test_text_progress(1); - let result = make_result(ImageStatus::Synced, 187_000_000); - progress.image_completed(&result); - let output = String::from_utf8(stderr.borrow().clone()).unwrap(); - assert!(output.starts_with("synced "), "got: {output}"); - assert!( - stdout.borrow().is_empty(), - "per-image output must NOT go to stdout" - ); + fn text_image_completed_writes_to_stderr_at_v1() { + let (progress, stderr) = text_progress(1); + progress.image_completed(&make_result(ImageStatus::Synced, 1024)); + let out = String::from_utf8(stderr.borrow().clone()).unwrap(); + assert!(out.starts_with("synced "), "got: {out}"); } #[test] fn text_image_completed_silent_at_v0() { - let (progress, stderr, stdout) = test_text_progress(0); - let result = make_result(ImageStatus::Synced, 187_000_000); - progress.image_completed(&result); + let (progress, stderr) = text_progress(0); + progress.image_completed(&make_result(ImageStatus::Synced, 1024)); assert!(stderr.borrow().is_empty()); - assert!(stdout.borrow().is_empty()); } #[test] fn text_failed_always_writes_to_stderr() { - let (progress, stderr, stdout) = test_text_progress(0); - let result = make_result( - ImageStatus::Failed { - kind: ErrorKind::ManifestPush, - error: "timeout".into(), - retries: 2, - status_code: None, - }, - 0, - ); - progress.image_completed(&result); - let output = String::from_utf8(stderr.borrow().clone()).unwrap(); - assert!(output.starts_with("FAILED "), "got: {output}"); - assert!( - stdout.borrow().is_empty(), - "per-image output must NOT go to stdout" - ); - } - - #[test] - fn text_stream_separation() { - let (progress, stderr, stdout) = test_text_progress(0); - let failed = make_result( - ImageStatus::Failed { - kind: ErrorKind::ManifestPull, - error: "timeout".into(), - retries: 2, - status_code: None, - }, - 0, - ); - progress.image_completed(&failed); - - let report = make_report(vec![make_result(ImageStatus::Synced, 1024)]); - progress.run_completed(&report); - - let stderr_text = String::from_utf8(stderr.borrow().clone()).unwrap(); - let stdout_text = String::from_utf8(stdout.borrow().clone()).unwrap(); - - // Per-image output on stderr, summary on stdout, never crossed. - assert!(stderr_text.contains("FAILED"), "FAILED should be on stderr"); - assert!( - !stdout_text.contains("FAILED"), - "FAILED must NOT be on stdout" - ); - assert!( - stdout_text.contains("sync complete:"), - "summary should be on stdout" - ); - assert!( - !stderr_text.contains("sync complete:"), - "summary must NOT be on stderr" - ); - } - - #[test] - fn text_multiple_images_mixed_status() { - let (progress, stderr, _stdout) = test_text_progress(1); - - progress.image_completed(&make_result(ImageStatus::Synced, 100_000_000)); - progress.image_completed(&make_result(ImageStatus::Synced, 200_000_000)); - progress.image_completed(&make_result( - ImageStatus::Skipped { - reason: SkipReason::DigestMatch, - }, - 0, - )); + let (progress, stderr) = text_progress(0); progress.image_completed(&make_result( ImageStatus::Failed { kind: ErrorKind::BlobTransfer, - error: "connection lost".into(), + error: "timeout".into(), retries: 1, status_code: None, }, 0, )); - - let output = String::from_utf8(stderr.borrow().clone()).unwrap(); - let lines: Vec<&str> = output.lines().collect(); - assert_eq!( - lines.iter().filter(|l| l.starts_with("synced ")).count(), - 2 - ); - assert_eq!( - lines.iter().filter(|l| l.starts_with("skipped ")).count(), - 1 - ); - assert_eq!( - lines.iter().filter(|l| l.starts_with("FAILED ")).count(), - 1 - ); + let out = String::from_utf8(stderr.borrow().clone()).unwrap(); + assert!(out.starts_with("FAILED "), "got: {out}"); } + /// `run_completed` is intentionally a no-op now -- the per-cycle + /// aggregate moved to per-mapping INFO lines emitted by the CLI driver. + /// Lock that contract: even with a non-empty report, nothing reaches + /// stderr from this method. #[test] - fn text_suppress_summary_still_prints_failures() { - let (progress, stderr, stdout) = test_text_progress_with_suppress(0, true); - let result = make_result( - ImageStatus::Failed { - kind: ErrorKind::ManifestPush, - error: "timeout".into(), - retries: 2, - status_code: None, - }, - 0, - ); - progress.image_completed(&result); - - let report = make_report(vec![make_result(ImageStatus::Synced, 1024)]); - progress.run_completed(&report); - - assert!( - !stderr.borrow().is_empty(), - "failures should still go to stderr" - ); - assert!( - stdout.borrow().is_empty(), - "suppress_summary should suppress stdout" - ); - } - - // -- DedupingWatchProgress ------------------------------------------- - - /// Counting progress reporter that records each `run_completed` call. - /// Used to assert how many times the wrapper passes through. - #[derive(Default)] - struct CountingProgress { - runs: RefCell, - } - impl ProgressReporter for CountingProgress { - fn image_started(&self, _: &str, _: &str) {} - fn image_completed(&self, _: &ImageResult) {} - fn run_completed(&self, _: &SyncReport) { - *self.runs.borrow_mut() += 1; - } - } - - fn report_with(stats: SyncStats) -> SyncReport { - SyncReport { - run_id: Uuid::now_v7(), - images: Vec::new(), - stats, - // Duration intentionally varies cycle-to-cycle in production; - // pick non-zero here so tests notice if the dedup keys on it. - duration: Duration::from_secs(1), - } - } - - /// First cycle always passes through; identical follow-up cycles are - /// suppressed; a third cycle that differs passes through again. - #[test] - fn deduping_watch_emits_only_when_stats_change() { - let inner = CountingProgress::default(); - let dedup = DedupingWatchProgress::new(&inner as &dyn ProgressReporter); - - let steady = SyncStats { - images_skipped: 250, - ..SyncStats::default() - }; - let active = SyncStats { - images_synced: 1, - images_skipped: 249, - ..SyncStats::default() - }; - - dedup.run_completed(&report_with(steady.clone())); // cycle 1: emit - dedup.run_completed(&report_with(steady.clone())); // cycle 2: suppress - dedup.run_completed(&report_with(steady.clone())); // cycle 3: suppress - dedup.run_completed(&report_with(active.clone())); // cycle 4: emit (changed) - dedup.run_completed(&report_with(active)); // cycle 5: suppress - dedup.run_completed(&report_with(steady)); // cycle 6: emit (changed) - - assert_eq!(*inner.runs.borrow(), 3); - } - - /// Wall-clock duration varies cycle-to-cycle even in steady state; the - /// dedup must key on stats only, not on the report's `duration`. - #[test] - fn deduping_watch_ignores_duration_drift() { - let inner = CountingProgress::default(); - let dedup = DedupingWatchProgress::new(&inner as &dyn ProgressReporter); - - let stats = SyncStats { - images_skipped: 5, - ..SyncStats::default() - }; - - let mut report1 = report_with(stats.clone()); - report1.duration = Duration::from_millis(800); - let mut report2 = report_with(stats); - report2.duration = Duration::from_millis(1_400); - - dedup.run_completed(&report1); - dedup.run_completed(&report2); - - assert_eq!(*inner.runs.borrow(), 1, "duration drift must not re-emit"); - } - - /// Per-image events are never deduped -- they describe distinct - /// transfers and must always reach the inner reporter. - #[test] - fn deduping_watch_passes_image_events_through() { - struct ImageCounter { - started: RefCell, - completed: RefCell, - } - impl ProgressReporter for ImageCounter { - fn image_started(&self, _: &str, _: &str) { - *self.started.borrow_mut() += 1; - } - fn image_completed(&self, _: &ImageResult) { - *self.completed.borrow_mut() += 1; - } - fn run_completed(&self, _: &SyncReport) {} - } - let inner = ImageCounter { - started: RefCell::new(0), - completed: RefCell::new(0), - }; - let dedup = DedupingWatchProgress::new(&inner as &dyn ProgressReporter); - - dedup.image_started("a", "b"); - dedup.image_started("c", "d"); - dedup.image_completed(&make_result(ImageStatus::Synced, 1)); - dedup.image_completed(&make_result(ImageStatus::Synced, 2)); - dedup.image_completed(&make_result(ImageStatus::Synced, 3)); - - assert_eq!(*inner.started.borrow(), 2); - assert_eq!(*inner.completed.borrow(), 3); + fn text_run_completed_emits_nothing() { + let (progress, stderr) = text_progress(2); + progress.run_completed(&make_report(vec![make_result(ImageStatus::Synced, 1)])); + assert!(stderr.borrow().is_empty()); } } diff --git a/src/main.rs b/src/main.rs index 5974631d..ad7ef602 100644 --- a/src/main.rs +++ b/src/main.rs @@ -313,16 +313,6 @@ async fn main() -> std::process::ExitCode { let shutdown = cli::shutdown::ShutdownSignal::new(); cli::shutdown::install_signal_handlers(shutdown.clone()); - // Suppress the text summary on stdout when JSON owns stdout or when - // the summary is redundant (single-image copy). - let suppress_summary = match &cli.command { - Commands::Sync(args) => args.json, - Commands::Watch(args) => args.json, - Commands::Analyze(args) => args.json, - Commands::Copy(_) => true, - _ => false, - }; - let effective_verbosity = match &cli.command { // Copy always shows per-image output -- users expect to see what was copied. Commands::Copy(_) => cli.verbose.max(1), @@ -332,10 +322,7 @@ async fn main() -> std::process::ExitCode { let progress: Box = if cli.quiet { Box::new(NullProgress) } else { - Box::new(cli::progress::TextProgress::new( - effective_verbosity, - suppress_summary, - )) + Box::new(cli::progress::TextProgress::new(effective_verbosity)) }; // Dry-run / log-emission verbose toggle: any -v level removes the sample From 6f6305a77302cff85971e498a23886ab61e0c365 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 09:15:43 -0500 Subject: [PATCH 6/9] feat(observability): cycle tail, recovery marker, idle heartbeat Three follow-ups from the post-merge audit, all watch-mode UX: - Cycle tail: emit a `summary: N mappings | X synced, Y skipped, Z failed | bytes in duration` INFO/WARN at the end of each cycle that emitted anything. Sync mode: always. Watch mode: gated on cycle_emit_count > 0. Restores cycle-level rollup the per-mapping refactor removed; named context comes from the per-mapping lines above it. - Recovery marker: when a mapping transitions from `failed > 0` to `failed == 0`, append ` [recovered]` to the per-mapping line so an operator scanning logs sees the recovery without correlating WARN -> INFO across cycles. WatchLogState.observe_mapping_outcome now returns the prior outcome alongside `changed`, so the caller can detect the transition. - Idle heartbeat: after one hour of silence, emit a "watch alive: no state changes; sync loop healthy" INFO with idle_secs. WatchLogState exposes `begin_cycle()` / `cycle_emit_count()` to let watch.rs gate the heartbeat on per-cycle activity. /healthz remains the kubelet probe; this gives log scrapers a recent anchor on idle pods. All three are dedup-aware: a steady-state pod still goes silent for hours between heartbeats and only emits when something genuinely transitions. --- src/cli/commands/synchronize.rs | 230 ++++++++++++++++++++++++++------ src/cli/commands/watch.rs | 29 +++- 2 files changed, 218 insertions(+), 41 deletions(-) diff --git a/src/cli/commands/synchronize.rs b/src/cli/commands/synchronize.rs index 6c74f33a..8bdac831 100644 --- a/src/cli/commands/synchronize.rs +++ b/src/cli/commands/synchronize.rs @@ -115,49 +115,90 @@ impl std::fmt::Display for NoTagsInfo { } } +/// Result of recording a per-mapping outcome observation. The caller uses +/// `changed` to decide whether to emit and `prior` to detect failure -> +/// not-failure recovery transitions. +pub(crate) struct OutcomeObservation { + pub changed: bool, + pub prior: Option, +} + /// Per-process state that lets watch-mode log on transitions instead of /// every cycle. Sync mode passes `None`. State lives in `watch::run` so it /// spans loop iterations. /// -/// Tracks two pieces of cross-cycle context: +/// Tracks three pieces of cross-cycle context: /// /// 1. **No-tags failure set**: mappings whose filter rejected every source /// tag, used to emit one WARN per failure run instead of per cycle. /// 2. **Per-mapping outcomes**: the prior cycle's [`MappingOutcome`] keyed /// by `mapping.from`, used to suppress identical follow-up cycles in -/// the per-mapping INFO/WARN stream. +/// the per-mapping INFO/WARN stream and to detect recovery transitions. +/// 3. **Per-cycle emit counter**: how many lines were emitted this cycle, +/// consumed by the watch loop to gate the idle heartbeat. #[derive(Debug, Default)] pub(crate) struct WatchLogState { warned_no_tags: HashSet, last_outcomes: HashMap, + cycle_emit_count: u32, } impl WatchLogState { + /// Reset the per-cycle emit counter. Call at the top of each watch cycle. + pub(crate) fn begin_cycle(&mut self) { + self.cycle_emit_count = 0; + } + + /// Number of lines emitted in the cycle that just ran. Read after the + /// cycle to decide whether to emit the idle heartbeat. + pub(crate) fn cycle_emit_count(&self) -> u32 { + self.cycle_emit_count + } + /// Record a no-match observation for `from`. Returns `true` when this is /// a transition into the failure state (caller should emit a WARN); /// `false` when the mapping was already in the failure set (suppress). fn observe_no_match(&mut self, from: &str) -> bool { - self.warned_no_tags.insert(from.to_string()) + let changed = self.warned_no_tags.insert(from.to_string()); + if changed { + self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); + } + changed } /// Record a successful resolution for `from`. Returns `true` when the /// mapping was previously in the failure set (caller should emit a /// "recovered" INFO); `false` when there was no transition. fn observe_resolved(&mut self, from: &str) -> bool { - self.warned_no_tags.remove(from) - } - - /// Record `outcome` as the latest result for `from`. Returns `true` when - /// the caller should emit (first observation, or outcome differs from - /// the prior cycle); `false` when identical to the last seen value. - fn observe_mapping_outcome(&mut self, from: &str, outcome: &MappingOutcome) -> bool { - match self.last_outcomes.get(from) { - Some(prev) if prev == outcome => false, - _ => { - self.last_outcomes.insert(from.to_string(), outcome.clone()); - true - } + let changed = self.warned_no_tags.remove(from); + if changed { + self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); } + changed + } + + /// Record `outcome` as the latest result for `from`. Returns the prior + /// observation (if any) alongside whether the outcome changed. The + /// caller uses `prior` to detect failure -> not-failure recovery so it + /// can attach a `[recovered]` marker on the resulting log line. + fn observe_mapping_outcome( + &mut self, + from: &str, + outcome: &MappingOutcome, + ) -> OutcomeObservation { + let prior = self.last_outcomes.get(from).cloned(); + let changed = !matches!(&prior, Some(p) if p == outcome); + if changed { + self.last_outcomes.insert(from.to_string(), outcome.clone()); + self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); + } + OutcomeObservation { changed, prior } + } + + /// Bump the cycle emit counter directly. Used for the cycle-tail line + /// (which has no per-mapping observation to attribute it to). + fn note_emit(&mut self) { + self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); } /// Drop entries for mappings no longer present in the active set so the @@ -338,7 +379,8 @@ pub(crate) async fn run( } } - emit_mapping_outcomes(&descriptors, &report, watch_log); + emit_mapping_outcomes(&descriptors, &report, watch_log.as_deref_mut()); + emit_cycle_tail(&descriptors, &report, watch_log); write_output(&report, args.json)?; @@ -387,14 +429,21 @@ fn emit_mapping_outcomes( if outcome.is_empty() { continue; } - let should_emit = match watch_log.as_deref_mut() { - Some(state) => state.observe_mapping_outcome(&d.from, &outcome), - None => true, + // Detect failure -> not-failure recovery so the line can advertise + // it explicitly instead of relying on a level-change between cycles. + let recovered = match watch_log.as_deref_mut() { + Some(state) => { + let obs = state.observe_mapping_outcome(&d.from, &outcome); + if !obs.changed { + continue; + } + obs.prior + .as_ref() + .is_some_and(|p| p.failed > 0 && outcome.failed == 0) + } + None => false, }; - if !should_emit { - continue; - } - let line = format_mapping_outcome(d, &outcome); + let line = format_mapping_outcome(d, &outcome, recovered); if outcome.failed > 0 { tracing::warn!( from = %d.from, @@ -412,6 +461,7 @@ fn emit_mapping_outcomes( synced = outcome.synced, skipped = outcome.skipped, bytes = outcome.bytes, + recovered, "{line}" ); } @@ -442,7 +492,7 @@ fn aggregate_mapping_outcome( o } -fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome) -> String { +fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome, recovered: bool) -> String { let targets = d.target_names.join(", "); let mut parts = Vec::with_capacity(3); if o.synced > 0 { @@ -460,12 +510,60 @@ fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome) -> String { } else { String::new() }; + let recovered_clause = if recovered { " [recovered]" } else { "" }; format!( - "{} -> {} [{targets}]: {counts}{bytes_clause}", + "{} -> {} [{targets}]: {counts}{bytes_clause}{recovered_clause}", d.from, d.target_repo ) } +/// One-line cycle tail rolling up totals across all mappings. Only emitted +/// when at least one per-mapping line fired this cycle (or always in sync +/// mode); the tail itself is part of the cycle's emit count, so it's +/// suppressed in idle watch cycles alongside the per-mapping lines. +fn emit_cycle_tail( + descriptors: &[MappingDescriptor], + report: &SyncReport, + watch_log: Option<&mut WatchLogState>, +) { + if let Some(state) = watch_log.as_deref() { + if state.cycle_emit_count() == 0 { + return; + } + } + let s = &report.stats; + let bytes = crate::cli::output::format_bytes(s.bytes_transferred); + let dur = crate::cli::output::format_duration(report.duration); + let line = format!( + "summary: {} mappings | {} synced, {} skipped, {} failed | {bytes} in {dur}", + descriptors.len(), + s.images_synced, + s.images_skipped, + s.images_failed, + ); + if let Some(state) = watch_log { + state.note_emit(); + } + if s.images_failed > 0 { + tracing::warn!( + mappings = descriptors.len(), + synced = s.images_synced, + skipped = s.images_skipped, + failed = s.images_failed, + bytes = s.bytes_transferred, + "{line}" + ); + } else { + tracing::info!( + mappings = descriptors.len(), + synced = s.images_synced, + skipped = s.images_skipped, + bytes = s.bytes_transferred, + "{line}" + ); + } +} + /// Parse a human-readable duration string into a [`Duration`]. /// /// Accepts: @@ -1355,12 +1453,38 @@ latest: 5 ..MappingOutcome::default() }; - assert!(state.observe_mapping_outcome("repo-a", &steady)); // first: emit - assert!(!state.observe_mapping_outcome("repo-a", &steady)); // same: suppress - assert!(!state.observe_mapping_outcome("repo-a", &steady)); // same: suppress - assert!(state.observe_mapping_outcome("repo-a", &active)); // changed: emit - assert!(!state.observe_mapping_outcome("repo-a", &active)); // same: suppress - assert!(state.observe_mapping_outcome("repo-a", &steady)); // changed back: emit + assert!(state.observe_mapping_outcome("repo-a", &steady).changed); + assert!(!state.observe_mapping_outcome("repo-a", &steady).changed); + assert!(!state.observe_mapping_outcome("repo-a", &steady).changed); + assert!(state.observe_mapping_outcome("repo-a", &active).changed); + assert!(!state.observe_mapping_outcome("repo-a", &active).changed); + assert!(state.observe_mapping_outcome("repo-a", &steady).changed); + } + + /// Recovery detection: prior outcome with `failed > 0` followed by an + /// outcome with `failed == 0` is an explicit recovery transition the + /// caller can mark with `[recovered]`. + #[test] + fn watch_log_state_surfaces_failure_to_clean_transition() { + let mut state = WatchLogState::default(); + let failing = MappingOutcome { + failed: 1, + ..MappingOutcome::default() + }; + let healthy = MappingOutcome { + synced: 1, + ..MappingOutcome::default() + }; + + let first = state.observe_mapping_outcome("r", &failing); + assert!(first.changed && first.prior.is_none()); + + let recovery = state.observe_mapping_outcome("r", &healthy); + assert!(recovery.changed); + assert_eq!(recovery.prior.as_ref().unwrap().failed, 1); + + // Cycle counter increments on each transition. + assert_eq!(state.cycle_emit_count(), 2); } /// `retain_active` also prunes per-mapping outcome cache so a removed @@ -1378,13 +1502,37 @@ latest: 5 state.retain_active(["keep"]); // Re-observation of "drop" emits because its prior entry was pruned. - assert!(state.observe_mapping_outcome("drop", &outcome)); + assert!(state.observe_mapping_outcome("drop", &outcome).changed); // "keep" still suppresses identical follow-up. - assert!(!state.observe_mapping_outcome("keep", &outcome)); + assert!(!state.observe_mapping_outcome("keep", &outcome).changed); + } + + /// `begin_cycle` resets the per-cycle emit counter; transitions during + /// the cycle bump it; the watch loop reads it after the cycle to gate + /// the idle heartbeat. + #[test] + fn watch_log_state_cycle_emit_counter_resets_and_increments() { + let mut state = WatchLogState::default(); + state.begin_cycle(); + assert_eq!(state.cycle_emit_count(), 0); + + let o = MappingOutcome { + skipped: 1, + ..MappingOutcome::default() + }; + state.observe_mapping_outcome("r1", &o); + state.observe_mapping_outcome("r2", &o); + assert_eq!(state.cycle_emit_count(), 2); + + state.begin_cycle(); + // Identical follow-up suppresses; counter stays at 0. + state.observe_mapping_outcome("r1", &o); + assert_eq!(state.cycle_emit_count(), 0); } /// `format_mapping_outcome` omits zero counts so the line stays terse, - /// and elides the bytes clause when nothing transferred. + /// elides the bytes clause when nothing transferred, and tags the + /// recovery transition explicitly. #[test] fn format_mapping_outcome_omits_zero_counts() { let d = MappingDescriptor { @@ -1398,7 +1546,7 @@ latest: 5 ..MappingOutcome::default() }; assert_eq!( - format_mapping_outcome(&d, &synced_only), + format_mapping_outcome(&d, &synced_only, false), "library/alpine -> mirror/alpine [ttl]: synced 3 (1.0 KB)" ); let skipped_only = MappingOutcome { @@ -1406,7 +1554,7 @@ latest: 5 ..MappingOutcome::default() }; assert_eq!( - format_mapping_outcome(&d, &skipped_only), + format_mapping_outcome(&d, &skipped_only, false), "library/alpine -> mirror/alpine [ttl]: skipped 5" ); let mixed = MappingOutcome { @@ -1416,9 +1564,15 @@ latest: 5 bytes: 2048, }; assert_eq!( - format_mapping_outcome(&d, &mixed), + format_mapping_outcome(&d, &mixed, false), "library/alpine -> mirror/alpine [ttl]: synced 1, skipped 2, failed 1 (2.0 KB)" ); + // Recovery marker appears at the end so the line still reads + // outcome-first. + assert_eq!( + format_mapping_outcome(&d, &synced_only, true), + "library/alpine -> mirror/alpine [ttl]: synced 3 (1.0 KB) [recovered]" + ); } // -- select_filtered_tags wire-up tests --------------------------------- diff --git a/src/cli/commands/watch.rs b/src/cli/commands/watch.rs index 67781d5d..d00c478b 100644 --- a/src/cli/commands/watch.rs +++ b/src/cli/commands/watch.rs @@ -2,7 +2,7 @@ use std::cell::RefCell; use std::rc::Rc; -use std::time::Duration; +use std::time::{Duration, Instant}; use ocync_sync::cache::TransferStateCache; use tokio::net::TcpListener; @@ -74,6 +74,13 @@ pub(crate) async fn run( // not one per cycle. Pruned each cycle to mappings still in config. let mut watch_log = WatchLogState::default(); + // Heartbeat: when no log line has been emitted for an extended + // period (idle steady-state watch), emit a "still alive" INFO + // so log scrapers have a recent anchor confirming the process + // is doing its job. Cadence is decoupled from the sync interval. + const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(3600); + let mut last_emit_at = Instant::now(); + // Track consecutive config reload failures for backoff. let mut config_failures: u32 = 0; const BACKOFF_THRESHOLD: u32 = 3; @@ -144,6 +151,7 @@ pub(crate) async fn run( json: args.json, }; + watch_log.begin_cycle(); match synchronize::run( &sync_args, progress, @@ -156,8 +164,8 @@ pub(crate) async fn run( { Ok(code) => { // Cycle completion is conveyed by the dedup-aware - // "sync complete: ..." line on stdout (when stats - // change) and by /healthz; no separate INFO needed. + // per-mapping line + cycle tail (when stats change) + // and by /healthz; no separate INFO needed. if matches!(code, ExitCode::Success | ExitCode::PartialFailure) { health_state.borrow_mut().record_success(); } @@ -167,6 +175,21 @@ pub(crate) async fn run( } } + // Heartbeat gate: if anything emitted this cycle, the user + // already has a recent log anchor; reset the timer. Else + // check the elapsed-since-last-emit and fire the heartbeat + // when we've been silent past the threshold. + if watch_log.cycle_emit_count() > 0 { + last_emit_at = Instant::now(); + } else if last_emit_at.elapsed() >= HEARTBEAT_INTERVAL { + let idle_secs = last_emit_at.elapsed().as_secs(); + tracing::info!( + idle_secs, + "watch alive: no state changes; sync loop healthy" + ); + last_emit_at = Instant::now(); + } + // Wait for the interval to elapse, or return early on shutdown. tokio::select! { () = tokio::time::sleep(interval) => {} From a0abcfb9ee47fd9f6998cc9ea59caa0678552546 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 09:25:12 -0500 Subject: [PATCH 7/9] refactor(observability): simplify outcome dedup API Apply audit findings from a follow-up review: - `MappingOutcome` now derives `Copy` (32B of u64s); `last_outcomes` HashMap stores by value, no per-observation clones on the unchanged path. - `observe_mapping_outcome` returns `Option` (None=suppress, Some(recovered)=emit) instead of an `OutcomeObservation` struct that the single caller had to destructure. The struct's `prior` field existed only to recompute `prior.failed > 0 && new.failed == 0`, which the method now does itself. - Use `HashMap::entry()` to avoid the get-then-insert double-hash + key allocation on the changed path. - Drop `WatchLogState::note_emit`. The cycle tail no longer bumps the counter -- it's gated on per-mapping activity, which already drives the counter via the `observe_*` methods. `emit_cycle_tail` becomes a pure formatter; the watch-mode suppression check moved to the call site. - Add `recovered` field to the WARN arm of `emit_mapping_outcomes` so log aggregators see a uniform field set across info/warn (a partial recovery from `failed=2 -> failed=1` still warns; the structured field now exists to be filtered on regardless). - `format_bytes`/`format_duration` now imported at the top, matching `progress.rs` style. - Trim test redundancy: `cycle_emit_counter_resets_and_increments` collapsed into `dedupes_identical_mapping_outcomes` and the recovery test (the counter increment is asserted there). Drops one test, no loss of coverage. No behavioral change to log output. Net -32 LOC. --- src/cli/commands/synchronize.rs | 218 ++++++++++++++------------------ 1 file changed, 93 insertions(+), 125 deletions(-) diff --git a/src/cli/commands/synchronize.rs b/src/cli/commands/synchronize.rs index 8bdac831..32829627 100644 --- a/src/cli/commands/synchronize.rs +++ b/src/cli/commands/synchronize.rs @@ -25,6 +25,7 @@ use crate::SyncArgs; use crate::cli::config::{ AuthType, Config, GlobOrList, MappingConfig, TagsConfig, load_config, resolve_target_names, }; +use crate::cli::output::{format_bytes, format_duration}; use crate::cli::{CliError, ExitCode, bare_hostname, build_registry_client}; /// Default cache TTL: 12 hours. @@ -115,27 +116,18 @@ impl std::fmt::Display for NoTagsInfo { } } -/// Result of recording a per-mapping outcome observation. The caller uses -/// `changed` to decide whether to emit and `prior` to detect failure -> -/// not-failure recovery transitions. -pub(crate) struct OutcomeObservation { - pub changed: bool, - pub prior: Option, -} - /// Per-process state that lets watch-mode log on transitions instead of /// every cycle. Sync mode passes `None`. State lives in `watch::run` so it /// spans loop iterations. /// /// Tracks three pieces of cross-cycle context: /// -/// 1. **No-tags failure set**: mappings whose filter rejected every source -/// tag, used to emit one WARN per failure run instead of per cycle. -/// 2. **Per-mapping outcomes**: the prior cycle's [`MappingOutcome`] keyed -/// by `mapping.from`, used to suppress identical follow-up cycles in -/// the per-mapping INFO/WARN stream and to detect recovery transitions. -/// 3. **Per-cycle emit counter**: how many lines were emitted this cycle, -/// consumed by the watch loop to gate the idle heartbeat. +/// 1. No-tags failure set: mappings whose filter rejected every source tag. +/// 2. Per-mapping outcomes: the prior cycle's [`MappingOutcome`] keyed by +/// `mapping.from`, used to detect both repeated and recovery transitions. +/// 3. Per-cycle emit counter: bumped by every `observe_*` method that +/// reports a transition; the watch loop reads it to gate the idle +/// heartbeat. #[derive(Debug, Default)] pub(crate) struct WatchLogState { warned_no_tags: HashSet, @@ -144,20 +136,16 @@ pub(crate) struct WatchLogState { } impl WatchLogState { - /// Reset the per-cycle emit counter. Call at the top of each watch cycle. pub(crate) fn begin_cycle(&mut self) { self.cycle_emit_count = 0; } - /// Number of lines emitted in the cycle that just ran. Read after the - /// cycle to decide whether to emit the idle heartbeat. pub(crate) fn cycle_emit_count(&self) -> u32 { self.cycle_emit_count } - /// Record a no-match observation for `from`. Returns `true` when this is - /// a transition into the failure state (caller should emit a WARN); - /// `false` when the mapping was already in the failure set (suppress). + /// Record a no-match observation. Returns `true` on transition into the + /// failure state (caller emits a WARN); `false` when already failing. fn observe_no_match(&mut self, from: &str) -> bool { let changed = self.warned_no_tags.insert(from.to_string()); if changed { @@ -166,9 +154,8 @@ impl WatchLogState { changed } - /// Record a successful resolution for `from`. Returns `true` when the - /// mapping was previously in the failure set (caller should emit a - /// "recovered" INFO); `false` when there was no transition. + /// Record a successful resolution. Returns `true` when the mapping was + /// previously in the failure set (caller emits a recovery INFO). fn observe_resolved(&mut self, from: &str) -> bool { let changed = self.warned_no_tags.remove(from); if changed { @@ -177,32 +164,35 @@ impl WatchLogState { changed } - /// Record `outcome` as the latest result for `from`. Returns the prior - /// observation (if any) alongside whether the outcome changed. The - /// caller uses `prior` to detect failure -> not-failure recovery so it - /// can attach a `[recovered]` marker on the resulting log line. - fn observe_mapping_outcome( - &mut self, - from: &str, - outcome: &MappingOutcome, - ) -> OutcomeObservation { - let prior = self.last_outcomes.get(from).cloned(); - let changed = !matches!(&prior, Some(p) if p == outcome); - if changed { - self.last_outcomes.insert(from.to_string(), outcome.clone()); - self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); + /// Record `outcome` as the latest result for `from`. + /// + /// Returns: + /// - `None` when the outcome is identical to the prior cycle (suppress). + /// - `Some(false)` on a non-recovery transition (emit normally). + /// - `Some(true)` when transitioning from `failed > 0` to `failed == 0` + /// (emit with `[recovered]` marker). + fn observe_mapping_outcome(&mut self, from: &str, outcome: &MappingOutcome) -> Option { + use std::collections::hash_map::Entry; + match self.last_outcomes.entry(from.to_string()) { + Entry::Occupied(mut slot) => { + let prev = *slot.get(); + if &prev == outcome { + return None; + } + slot.insert(*outcome); + self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); + Some(prev.failed > 0 && outcome.failed == 0) + } + Entry::Vacant(slot) => { + slot.insert(*outcome); + self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); + Some(false) + } } - OutcomeObservation { changed, prior } } - /// Bump the cycle emit counter directly. Used for the cycle-tail line - /// (which has no per-mapping observation to attribute it to). - fn note_emit(&mut self) { - self.cycle_emit_count = self.cycle_emit_count.saturating_add(1); - } - - /// Drop entries for mappings no longer present in the active set so the - /// state does not grow unbounded across edits to the config. + /// Drop entries for mappings no longer in the active set so the state + /// does not grow unbounded across edits to the config. fn retain_active<'a>(&mut self, active: impl IntoIterator) { let active_set: HashSet<&str> = active.into_iter().collect(); self.warned_no_tags @@ -380,7 +370,14 @@ pub(crate) async fn run( } emit_mapping_outcomes(&descriptors, &report, watch_log.as_deref_mut()); - emit_cycle_tail(&descriptors, &report, watch_log); + // Watch mode: suppress the cycle tail when no per-mapping line emitted + // (steady-state idle); sync mode: always emit as the final marker. + let cycle_had_activity = watch_log + .as_deref() + .is_none_or(|s| s.cycle_emit_count() > 0); + if cycle_had_activity { + emit_cycle_tail(&descriptors, &report); + } write_output(&report, args.json)?; @@ -398,7 +395,7 @@ struct MappingDescriptor { /// Per-mapping aggregated outcome derived from [`SyncReport.images`]. /// Used for log emission and watch-mode change detection. -#[derive(Debug, Default, Clone, PartialEq, Eq)] +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] pub(crate) struct MappingOutcome { pub synced: u64, pub skipped: u64, @@ -429,21 +426,18 @@ fn emit_mapping_outcomes( if outcome.is_empty() { continue; } - // Detect failure -> not-failure recovery so the line can advertise - // it explicitly instead of relying on a level-change between cycles. let recovered = match watch_log.as_deref_mut() { - Some(state) => { - let obs = state.observe_mapping_outcome(&d.from, &outcome); - if !obs.changed { - continue; - } - obs.prior - .as_ref() - .is_some_and(|p| p.failed > 0 && outcome.failed == 0) - } + Some(state) => match state.observe_mapping_outcome(&d.from, &outcome) { + Some(r) => r, + None => continue, + }, None => false, }; let line = format_mapping_outcome(d, &outcome, recovered); + // The `tracing::event!` macro requires a const-expression level, so + // each per-mapping line goes through one of two near-identical + // arms. Keep the structured field set in sync between them so log + // aggregators don't see different shapes for warn vs info. if outcome.failed > 0 { tracing::warn!( from = %d.from, @@ -452,6 +446,7 @@ fn emit_mapping_outcomes( skipped = outcome.skipped, failed = outcome.failed, bytes = outcome.bytes, + recovered, "{line}" ); } else { @@ -460,6 +455,7 @@ fn emit_mapping_outcomes( to = %d.target_repo, synced = outcome.synced, skipped = outcome.skipped, + failed = outcome.failed, bytes = outcome.bytes, recovered, "{line}" @@ -506,7 +502,7 @@ fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome, recovered: } let counts = parts.join(", "); let bytes_clause = if o.bytes > 0 { - format!(" ({})", crate::cli::output::format_bytes(o.bytes)) + format!(" ({})", format_bytes(o.bytes)) } else { String::new() }; @@ -517,33 +513,19 @@ fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome, recovered: ) } -/// One-line cycle tail rolling up totals across all mappings. Only emitted -/// when at least one per-mapping line fired this cycle (or always in sync -/// mode); the tail itself is part of the cycle's emit count, so it's -/// suppressed in idle watch cycles alongside the per-mapping lines. -fn emit_cycle_tail( - descriptors: &[MappingDescriptor], - report: &SyncReport, - watch_log: Option<&mut WatchLogState>, -) { - if let Some(state) = watch_log.as_deref() { - if state.cycle_emit_count() == 0 { - return; - } - } +/// One-line cycle tail rolling up totals across all mappings. The caller +/// is responsible for gating this in watch mode (skip on idle cycles). +fn emit_cycle_tail(descriptors: &[MappingDescriptor], report: &SyncReport) { let s = &report.stats; - let bytes = crate::cli::output::format_bytes(s.bytes_transferred); - let dur = crate::cli::output::format_duration(report.duration); let line = format!( - "summary: {} mappings | {} synced, {} skipped, {} failed | {bytes} in {dur}", + "summary: {} mappings | {} synced, {} skipped, {} failed | {} in {}", descriptors.len(), s.images_synced, s.images_skipped, s.images_failed, + format_bytes(s.bytes_transferred), + format_duration(report.duration), ); - if let Some(state) = watch_log { - state.note_emit(); - } if s.images_failed > 0 { tracing::warn!( mappings = descriptors.len(), @@ -558,6 +540,7 @@ fn emit_cycle_tail( mappings = descriptors.len(), synced = s.images_synced, skipped = s.images_skipped, + failed = s.images_failed, bytes = s.bytes_transferred, "{line}" ); @@ -1453,17 +1436,31 @@ latest: 5 ..MappingOutcome::default() }; - assert!(state.observe_mapping_outcome("repo-a", &steady).changed); - assert!(!state.observe_mapping_outcome("repo-a", &steady).changed); - assert!(!state.observe_mapping_outcome("repo-a", &steady).changed); - assert!(state.observe_mapping_outcome("repo-a", &active).changed); - assert!(!state.observe_mapping_outcome("repo-a", &active).changed); - assert!(state.observe_mapping_outcome("repo-a", &steady).changed); + // First observation: emit, no prior so not a recovery. + assert_eq!( + state.observe_mapping_outcome("repo-a", &steady), + Some(false) + ); + // Same outcome twice: suppress. + assert_eq!(state.observe_mapping_outcome("repo-a", &steady), None); + assert_eq!(state.observe_mapping_outcome("repo-a", &steady), None); + // Different outcome: emit, neither prior nor current was a failure + // so not a recovery either. + assert_eq!( + state.observe_mapping_outcome("repo-a", &active), + Some(false) + ); + assert_eq!(state.observe_mapping_outcome("repo-a", &active), None); + assert_eq!( + state.observe_mapping_outcome("repo-a", &steady), + Some(false) + ); } /// Recovery detection: prior outcome with `failed > 0` followed by an - /// outcome with `failed == 0` is an explicit recovery transition the - /// caller can mark with `[recovered]`. + /// outcome with `failed == 0` returns `Some(true)` so the caller can + /// attach the `[recovered]` marker. Cycle counter advances on each + /// transition so the watch loop sees activity. #[test] fn watch_log_state_surfaces_failure_to_clean_transition() { let mut state = WatchLogState::default(); @@ -1476,19 +1473,15 @@ latest: 5 ..MappingOutcome::default() }; - let first = state.observe_mapping_outcome("r", &failing); - assert!(first.changed && first.prior.is_none()); - - let recovery = state.observe_mapping_outcome("r", &healthy); - assert!(recovery.changed); - assert_eq!(recovery.prior.as_ref().unwrap().failed, 1); - - // Cycle counter increments on each transition. + // First observation can never be a recovery (no prior). + assert_eq!(state.observe_mapping_outcome("r", &failing), Some(false)); + assert_eq!(state.observe_mapping_outcome("r", &healthy), Some(true)); assert_eq!(state.cycle_emit_count(), 2); } /// `retain_active` also prunes per-mapping outcome cache so a removed - /// mapping doesn't keep its stale entry forever. + /// mapping doesn't keep its stale entry forever. Re-observation after + /// pruning emits as a fresh first-observation. #[test] fn watch_log_state_retain_active_also_prunes_outcomes() { let mut state = WatchLogState::default(); @@ -1501,33 +1494,8 @@ latest: 5 state.retain_active(["keep"]); - // Re-observation of "drop" emits because its prior entry was pruned. - assert!(state.observe_mapping_outcome("drop", &outcome).changed); - // "keep" still suppresses identical follow-up. - assert!(!state.observe_mapping_outcome("keep", &outcome).changed); - } - - /// `begin_cycle` resets the per-cycle emit counter; transitions during - /// the cycle bump it; the watch loop reads it after the cycle to gate - /// the idle heartbeat. - #[test] - fn watch_log_state_cycle_emit_counter_resets_and_increments() { - let mut state = WatchLogState::default(); - state.begin_cycle(); - assert_eq!(state.cycle_emit_count(), 0); - - let o = MappingOutcome { - skipped: 1, - ..MappingOutcome::default() - }; - state.observe_mapping_outcome("r1", &o); - state.observe_mapping_outcome("r2", &o); - assert_eq!(state.cycle_emit_count(), 2); - - state.begin_cycle(); - // Identical follow-up suppresses; counter stays at 0. - state.observe_mapping_outcome("r1", &o); - assert_eq!(state.cycle_emit_count(), 0); + assert_eq!(state.observe_mapping_outcome("drop", &outcome), Some(false)); + assert_eq!(state.observe_mapping_outcome("keep", &outcome), None); } /// `format_mapping_outcome` omits zero counts so the line stays terse, From 82566bea7ddfd3e9e94659f31ed36a00543aa836 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 09:37:30 -0500 Subject: [PATCH 8/9] fix(observability): drop redundant `[targets]` bracket on single-target mappings The `[ttl]` / `[ecr]` bracket only carries information when a mapping fans out to multiple destinations (e.g. `[ecr-prod, ghcr-mirror]`). On single-target mappings -- the common case -- the destination is already in the `from -> to` arrow, so the bracket is noise. Emit the bracket only when `target_names.len() > 1`. Structured tracing fields (`from`, `to`, `synced`, ...) are unchanged; this is a human-readable formatting change only. Single-target now reads: library/alpine -> mirror/alpine: skipped 1 Multi-target unchanged: library/alpine -> mirror/alpine [ecr-prod, ghcr-mirror]: synced 1 --- src/cli/commands/synchronize.rs | 50 +++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/src/cli/commands/synchronize.rs b/src/cli/commands/synchronize.rs index 32829627..37f6741e 100644 --- a/src/cli/commands/synchronize.rs +++ b/src/cli/commands/synchronize.rs @@ -489,7 +489,6 @@ fn aggregate_mapping_outcome( } fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome, recovered: bool) -> String { - let targets = d.target_names.join(", "); let mut parts = Vec::with_capacity(3); if o.synced > 0 { parts.push(format!("synced {}", o.synced)); @@ -507,8 +506,16 @@ fn format_mapping_outcome(d: &MappingDescriptor, o: &MappingOutcome, recovered: String::new() }; let recovered_clause = if recovered { " [recovered]" } else { "" }; + // Multi-target mappings need the bracket to disambiguate which targets + // the line refers to. Single-target mappings: omit -- the destination + // is already in the `from -> to` arrow. + let targets_clause = if d.target_names.len() > 1 { + format!(" [{}]", d.target_names.join(", ")) + } else { + String::new() + }; format!( - "{} -> {} [{targets}]: {counts}{bytes_clause}{recovered_clause}", + "{} -> {}{targets_clause}: {counts}{bytes_clause}{recovered_clause}", d.from, d.target_repo ) } @@ -1498,11 +1505,12 @@ latest: 5 assert_eq!(state.observe_mapping_outcome("keep", &outcome), None); } - /// `format_mapping_outcome` omits zero counts so the line stays terse, - /// elides the bytes clause when nothing transferred, and tags the - /// recovery transition explicitly. + /// `format_mapping_outcome` omits zero counts, elides the bytes clause + /// when nothing transferred, tags recovery transitions, and drops the + /// `[targets]` bracket on single-target mappings (the destination is + /// already in the `from -> to` arrow). #[test] - fn format_mapping_outcome_omits_zero_counts() { + fn format_mapping_outcome_single_target_omits_bracket() { let d = MappingDescriptor { from: "library/alpine".into(), target_repo: "mirror/alpine".into(), @@ -1515,7 +1523,7 @@ latest: 5 }; assert_eq!( format_mapping_outcome(&d, &synced_only, false), - "library/alpine -> mirror/alpine [ttl]: synced 3 (1.0 KB)" + "library/alpine -> mirror/alpine: synced 3 (1.0 KB)" ); let skipped_only = MappingOutcome { skipped: 5, @@ -1523,7 +1531,7 @@ latest: 5 }; assert_eq!( format_mapping_outcome(&d, &skipped_only, false), - "library/alpine -> mirror/alpine [ttl]: skipped 5" + "library/alpine -> mirror/alpine: skipped 5" ); let mixed = MappingOutcome { synced: 1, @@ -1533,13 +1541,31 @@ latest: 5 }; assert_eq!( format_mapping_outcome(&d, &mixed, false), - "library/alpine -> mirror/alpine [ttl]: synced 1, skipped 2, failed 1 (2.0 KB)" + "library/alpine -> mirror/alpine: synced 1, skipped 2, failed 1 (2.0 KB)" ); - // Recovery marker appears at the end so the line still reads - // outcome-first. assert_eq!( format_mapping_outcome(&d, &synced_only, true), - "library/alpine -> mirror/alpine [ttl]: synced 3 (1.0 KB) [recovered]" + "library/alpine -> mirror/alpine: synced 3 (1.0 KB) [recovered]" + ); + } + + /// Multi-target mappings keep the `[targets]` bracket so the operator + /// can see which destinations the outcome covers. + #[test] + fn format_mapping_outcome_multi_target_keeps_bracket() { + let d = MappingDescriptor { + from: "library/alpine".into(), + target_repo: "mirror/alpine".into(), + target_names: vec!["ecr-prod".into(), "ghcr-mirror".into()], + }; + let synced = MappingOutcome { + synced: 1, + bytes: 1024, + ..MappingOutcome::default() + }; + assert_eq!( + format_mapping_outcome(&d, &synced, false), + "library/alpine -> mirror/alpine [ecr-prod, ghcr-mirror]: synced 1 (1.0 KB)" ); } From 1a2f7a6613299784fd66105eeeb6c262eebe7f32 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 6 May 2026 09:57:19 -0500 Subject: [PATCH 9/9] fix(observability): drop structured fields that restate the message The text formatter tails each tracing event with `key=value` pairs for every structured field on the call. When those fields restate what the message string already says, the line ends up repeating itself. Three call sites were doing this: - per-mapping outcome (`emit_mapping_outcomes`): had `from= to=` after the message's ` -> ` arrow. Drop both -- the arrow is the canonical render. Counts and `recovered` stay (they carry zero values the terse message elides and a flag scrapers can filter on). - no-tags WARN (`emit_no_tags_warn`): had `from=` after the Display impl already led with the same value. Drop. Counts and `filter` stay. - cycle tail (`emit_cycle_tail`): had `mappings/synced/skipped/failed/ bytes` fields verbatim duplicating the message's "N mappings | X synced, Y skipped, Z failed | bytes in time". Drop all -- the message is fully self-contained. JSON tracing-format consumers parse the message string (or use `--json` for the structured `SyncReport`) instead of these fields. No behavioral change beyond what the operator sees in text logs. --- src/cli/commands/synchronize.rs | 42 +++++++++++++-------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/src/cli/commands/synchronize.rs b/src/cli/commands/synchronize.rs index 37f6741e..210c87b7 100644 --- a/src/cli/commands/synchronize.rs +++ b/src/cli/commands/synchronize.rs @@ -434,14 +434,16 @@ fn emit_mapping_outcomes( None => false, }; let line = format_mapping_outcome(d, &outcome, recovered); - // The `tracing::event!` macro requires a const-expression level, so - // each per-mapping line goes through one of two near-identical - // arms. Keep the structured field set in sync between them so log - // aggregators don't see different shapes for warn vs info. + // `from` / `to` are intentionally NOT structured fields here -- the + // message already names them as `from -> to`, and tracing's text + // formatter would otherwise tail the line with a redundant + // `from=... to=...` block. The count fields remain because they + // carry zero values the terse message elides. + // + // The two arms differ only in level. `tracing::event!` would let + // us pick at runtime, but it requires a const-expression level. if outcome.failed > 0 { tracing::warn!( - from = %d.from, - to = %d.target_repo, synced = outcome.synced, skipped = outcome.skipped, failed = outcome.failed, @@ -451,8 +453,6 @@ fn emit_mapping_outcomes( ); } else { tracing::info!( - from = %d.from, - to = %d.target_repo, synced = outcome.synced, skipped = outcome.skipped, failed = outcome.failed, @@ -533,24 +533,13 @@ fn emit_cycle_tail(descriptors: &[MappingDescriptor], report: &SyncReport) { format_bytes(s.bytes_transferred), format_duration(report.duration), ); + // Counts are already in the message; structured fields would be a + // verbatim restatement in text output. JSON aggregators parse the + // message (or use the SyncReport via `--json`). if s.images_failed > 0 { - tracing::warn!( - mappings = descriptors.len(), - synced = s.images_synced, - skipped = s.images_skipped, - failed = s.images_failed, - bytes = s.bytes_transferred, - "{line}" - ); + tracing::warn!("{line}"); } else { - tracing::info!( - mappings = descriptors.len(), - synced = s.images_synced, - skipped = s.images_skipped, - failed = s.images_failed, - bytes = s.bytes_transferred, - "{line}" - ); + tracing::info!("{line}"); } } @@ -863,8 +852,11 @@ pub(crate) async fn resolve_mapping( /// message (via [`Display`](std::fmt::Display)) and structured fields for /// log aggregators. fn emit_no_tags_warn(info: &NoTagsInfo) { + // `from` is omitted as a structured field -- the message renders it + // first, so the text formatter would otherwise tail with a redundant + // `from=...`. Counts and filter remain (numeric, terse, useful for + // both grep and JSON aggregation). tracing::warn!( - from = %info.from, source_total = info.source_total(), image_count = info.image_count, artifact_count = info.artifact_count,