20260526 增加持续soak监控与本地回放工具
This commit is contained in:
@@ -589,6 +589,48 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
struct FailRrdpThenFailRsyncExecutor {
|
||||
rrdp_count: Arc<AtomicUsize>,
|
||||
rsync_count: Arc<AtomicUsize>,
|
||||
}
|
||||
|
||||
impl RepoTransportExecutor for FailRrdpThenFailRsyncExecutor {
|
||||
fn execute_transport(&self, task: RepoTransportTask) -> RepoTransportResultEnvelope {
|
||||
match task.mode {
|
||||
RepoTransportMode::Rrdp => {
|
||||
self.rrdp_count.fetch_add(1, Ordering::SeqCst);
|
||||
RepoTransportResultEnvelope {
|
||||
dedup_key: task.dedup_key,
|
||||
repo_identity: task.repo_identity,
|
||||
mode: RepoTransportMode::Rrdp,
|
||||
tal_id: task.tal_id,
|
||||
rir_id: task.rir_id,
|
||||
timing_ms: 10,
|
||||
result: RepoTransportResultKind::Failed {
|
||||
detail: "rrdp failed".to_string(),
|
||||
warnings: vec![Warning::new("rrdp failed")],
|
||||
},
|
||||
}
|
||||
}
|
||||
RepoTransportMode::Rsync => {
|
||||
self.rsync_count.fetch_add(1, Ordering::SeqCst);
|
||||
RepoTransportResultEnvelope {
|
||||
dedup_key: task.dedup_key,
|
||||
repo_identity: task.repo_identity,
|
||||
mode: RepoTransportMode::Rsync,
|
||||
tal_id: task.tal_id,
|
||||
rir_id: task.rir_id,
|
||||
timing_ms: 12,
|
||||
result: RepoTransportResultKind::Failed {
|
||||
detail: "rsync failed".to_string(),
|
||||
warnings: vec![Warning::new("rsync failed")],
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn phase1_runtime_waits_for_rrdp_transport_and_returns_rrdp_outcome() {
|
||||
let coordinator = GlobalRunCoordinator::new(
|
||||
@@ -852,6 +894,42 @@ mod tests {
|
||||
assert_eq!(rsync_count.load(Ordering::SeqCst), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn phase1_runtime_terminal_failure_keeps_rsync_failure_duration() {
|
||||
let rrdp_count = Arc::new(AtomicUsize::new(0));
|
||||
let rsync_count = Arc::new(AtomicUsize::new(0));
|
||||
let coordinator = GlobalRunCoordinator::new(
|
||||
ParallelPhase1Config::default(),
|
||||
vec![TalInputSpec::from_url("https://example.test/arin.tal")],
|
||||
);
|
||||
let pool = RepoTransportWorkerPool::new(
|
||||
RepoWorkerPoolConfig { max_workers: 1 },
|
||||
FailRrdpThenFailRsyncExecutor {
|
||||
rrdp_count: Arc::clone(&rrdp_count),
|
||||
rsync_count: Arc::clone(&rsync_count),
|
||||
},
|
||||
)
|
||||
.expect("pool");
|
||||
let runtime = Phase1RepoSyncRuntime::new(
|
||||
coordinator,
|
||||
pool,
|
||||
Arc::new(|_base: &str| "rsync://example.test/module/".to_string()),
|
||||
SyncPreference::RrdpThenRsync,
|
||||
);
|
||||
|
||||
let outcome = runtime
|
||||
.sync_publication_point_repo(&sample_ca("rsync://example.test/repo/root.mft"))
|
||||
.expect("sync repo");
|
||||
assert!(!outcome.repo_sync_ok);
|
||||
assert_eq!(
|
||||
outcome.repo_sync_phase.as_deref(),
|
||||
Some("rrdp_failed_rsync_failed")
|
||||
);
|
||||
assert_eq!(outcome.repo_sync_duration_ms, 12);
|
||||
assert_eq!(rrdp_count.load(Ordering::SeqCst), 1);
|
||||
assert_eq!(rsync_count.load(Ordering::SeqCst), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn phase1_runtime_prefetch_submits_transport_task_before_consumption() {
|
||||
let rrdp_count = Arc::new(AtomicUsize::new(0));
|
||||
|
||||
Reference in New Issue
Block a user