20260618 优化PP cache hit child恢复
This commit is contained in:
@@ -2037,6 +2037,96 @@ fn runner_publication_point_cache_reuses_projection_outputs_children_and_ccr() {
|
||||
assert!(phase_keys.contains("publication_point_cache_build_objects_total"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn publication_point_cache_restore_children_parallel_keeps_order_and_audit() {
|
||||
let store_dir = tempfile::tempdir().expect("store dir");
|
||||
let store = RocksStore::open(store_dir.path()).expect("open rocksdb");
|
||||
let policy = Policy::default();
|
||||
let validation_time = time::OffsetDateTime::UNIX_EPOCH + time::Duration::minutes(1);
|
||||
let ca = publication_point_cache_fixture_ca();
|
||||
seed_publication_point_cache_projection(&store, &policy, &ca, validation_time);
|
||||
let mut projection = store
|
||||
.get_publication_point_cache_projection(&ca.manifest_rsync_uri)
|
||||
.expect("load projection")
|
||||
.expect("projection");
|
||||
let template = projection.children[0].clone();
|
||||
let mut blobs = Vec::new();
|
||||
let mut children = Vec::new();
|
||||
for index in 0..300 {
|
||||
let bytes = format!("child-cert-{index}").into_bytes();
|
||||
let child_hash = sha256_hex(&bytes);
|
||||
let mut child = template.clone();
|
||||
child.child_cert_hash = child_hash.clone();
|
||||
child.child_cert_rsync_uri = format!("rsync://example.test/repo/issuer/child-{index}.cer");
|
||||
child.child_manifest_rsync_uri =
|
||||
format!("rsync://example.test/repo/child-{index}/child.mft");
|
||||
child.child_publication_point_rsync_uri =
|
||||
format!("rsync://example.test/repo/child-{index}/");
|
||||
child.child_rsync_base_uri = child.child_publication_point_rsync_uri.clone();
|
||||
blobs.push((child_hash, bytes));
|
||||
children.push(child);
|
||||
}
|
||||
projection.children = children;
|
||||
store.put_blob_bytes_batch(&blobs).expect("put child blobs");
|
||||
let timing = crate::analysis::timing::TimingHandle::new(crate::analysis::timing::TimingMeta {
|
||||
recorded_at_utc_rfc3339: "2026-01-01T00:00:00Z".to_string(),
|
||||
validation_time_utc_rfc3339: "2026-01-01T00:00:00Z".to_string(),
|
||||
tal_url: None,
|
||||
db_path: None,
|
||||
});
|
||||
let mut warnings = Vec::new();
|
||||
|
||||
let (restored_children, audits) = restore_children_from_publication_point_cache(
|
||||
&store,
|
||||
&ca,
|
||||
&projection,
|
||||
validation_time,
|
||||
&mut warnings,
|
||||
4,
|
||||
Some(&timing),
|
||||
);
|
||||
|
||||
assert!(warnings.is_empty());
|
||||
assert_eq!(restored_children.len(), 300);
|
||||
assert_eq!(audits.len(), 300);
|
||||
assert_eq!(
|
||||
restored_children[0].handle.ca_certificate_der,
|
||||
b"child-cert-0"
|
||||
);
|
||||
assert_eq!(
|
||||
restored_children[299].handle.ca_certificate_der,
|
||||
b"child-cert-299"
|
||||
);
|
||||
assert_eq!(
|
||||
restored_children[0].handle.manifest_rsync_uri,
|
||||
"rsync://example.test/repo/child-0/child.mft"
|
||||
);
|
||||
assert!(
|
||||
audits
|
||||
.iter()
|
||||
.all(|audit| audit.result == AuditObjectResult::Ok)
|
||||
);
|
||||
let counts = timing.counts_snapshot();
|
||||
assert_eq!(
|
||||
counts
|
||||
.get("publication_point_cache_restore_children_parallel_publication_points")
|
||||
.copied(),
|
||||
Some(1)
|
||||
);
|
||||
assert_eq!(
|
||||
counts
|
||||
.get("publication_point_cache_restore_children_parallel_children")
|
||||
.copied(),
|
||||
Some(300)
|
||||
);
|
||||
assert_eq!(
|
||||
counts
|
||||
.get("publication_point_cache_restore_children_workers_total")
|
||||
.copied(),
|
||||
Some(4)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn runner_publication_point_cache_blocks_parent_policy_and_output_time_mismatch() {
|
||||
let store_dir = tempfile::tempdir().expect("store dir");
|
||||
|
||||
Reference in New Issue
Block a user