20260326 完成数据库model迁移;20260327 增加一键replay脚本
This commit is contained in:
@@ -3,9 +3,9 @@ use std::path::PathBuf;
|
||||
|
||||
use rocksdb::{DB, IteratorMode, Options};
|
||||
use rpki::storage::{
|
||||
ALL_COLUMN_FAMILY_NAMES, CF_AUDIT_RULE_INDEX, CF_RAW_BY_HASH, CF_RAW_OBJECTS,
|
||||
CF_REPOSITORY_VIEW, CF_RRDP_OBJECT_INDEX, CF_RRDP_SOURCE, CF_RRDP_SOURCE_MEMBER, CF_RRDP_STATE,
|
||||
CF_RRDP_URI_OWNER, CF_VCIR, column_family_descriptors,
|
||||
ALL_COLUMN_FAMILY_NAMES, CF_AUDIT_RULE_INDEX, CF_RAW_BY_HASH, CF_REPOSITORY_VIEW,
|
||||
CF_RRDP_SOURCE, CF_RRDP_SOURCE_MEMBER, CF_RRDP_URI_OWNER, CF_VCIR,
|
||||
column_family_descriptors,
|
||||
};
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
@@ -48,8 +48,7 @@ Options:
|
||||
Output groups:
|
||||
- current_repository_view: repository_view + raw_by_hash
|
||||
- current_validation_state: vcir + audit_rule_index
|
||||
- current_rrdp_state: rrdp_state + rrdp_source + rrdp_source_member + rrdp_uri_owner
|
||||
- legacy_compatibility: raw_objects + rrdp_object_index
|
||||
- current_rrdp_state: rrdp_source + rrdp_source_member + rrdp_uri_owner
|
||||
"
|
||||
)
|
||||
}
|
||||
@@ -78,10 +77,9 @@ fn cf_group(cf_name: &str) -> CfGroup {
|
||||
match cf_name {
|
||||
CF_REPOSITORY_VIEW | CF_RAW_BY_HASH => CfGroup::CurrentRepositoryView,
|
||||
CF_VCIR | CF_AUDIT_RULE_INDEX => CfGroup::CurrentValidationState,
|
||||
CF_RRDP_STATE | CF_RRDP_SOURCE | CF_RRDP_SOURCE_MEMBER | CF_RRDP_URI_OWNER => {
|
||||
CF_RRDP_SOURCE | CF_RRDP_SOURCE_MEMBER | CF_RRDP_URI_OWNER => {
|
||||
CfGroup::CurrentRrdpState
|
||||
}
|
||||
CF_RAW_OBJECTS | CF_RRDP_OBJECT_INDEX => CfGroup::LegacyCompatibility,
|
||||
_ => CfGroup::LegacyCompatibility,
|
||||
}
|
||||
}
|
||||
@@ -175,7 +173,7 @@ mod tests {
|
||||
);
|
||||
assert_eq!(cf_group(CF_RRDP_SOURCE), CfGroup::CurrentRrdpState);
|
||||
assert_eq!(cf_group(CF_RRDP_URI_OWNER), CfGroup::CurrentRrdpState);
|
||||
assert_eq!(cf_group(CF_RAW_OBJECTS), CfGroup::LegacyCompatibility);
|
||||
assert_eq!(cf_group("unknown_legacy"), CfGroup::LegacyCompatibility);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -185,15 +183,13 @@ mod tests {
|
||||
(CF_RAW_BY_HASH, 7),
|
||||
(CF_VCIR, 11),
|
||||
(CF_AUDIT_RULE_INDEX, 13),
|
||||
(CF_RRDP_STATE, 17),
|
||||
(CF_RRDP_SOURCE_MEMBER, 19),
|
||||
(CF_RRDP_OBJECT_INDEX, 29),
|
||||
]);
|
||||
|
||||
assert_eq!(grouped.get(&CfGroup::CurrentRepositoryView), Some(&12));
|
||||
assert_eq!(grouped.get(&CfGroup::CurrentValidationState), Some(&24));
|
||||
assert_eq!(grouped.get(&CfGroup::CurrentRrdpState), Some(&36));
|
||||
assert_eq!(grouped.get(&CfGroup::LegacyCompatibility), Some(&29));
|
||||
assert_eq!(grouped.get(&CfGroup::CurrentRrdpState), Some(&19));
|
||||
assert_eq!(grouped.get(&CfGroup::LegacyCompatibility), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -201,6 +197,6 @@ mod tests {
|
||||
let text = usage();
|
||||
assert!(text.contains("--exact"), "{text}");
|
||||
assert!(text.contains("current_validation_state"), "{text}");
|
||||
assert!(text.contains("legacy_compatibility"), "{text}");
|
||||
assert!(text.contains("current_rrdp_state"), "{text}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,14 +2,12 @@ use std::path::PathBuf;
|
||||
|
||||
use rocksdb::{DB, IteratorMode, Options};
|
||||
use rpki::storage::{
|
||||
CF_RRDP_SOURCE, CF_RRDP_SOURCE_MEMBER, CF_RRDP_STATE, CF_RRDP_URI_OWNER,
|
||||
RrdpSourceMemberRecord, RrdpSourceRecord, RrdpUriOwnerRecord, column_family_descriptors,
|
||||
CF_RRDP_SOURCE, CF_RRDP_SOURCE_MEMBER, CF_RRDP_URI_OWNER, RrdpSourceMemberRecord,
|
||||
RrdpSourceRecord, RrdpUriOwnerRecord, column_family_descriptors,
|
||||
};
|
||||
use rpki::sync::rrdp::RrdpState;
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
enum DumpView {
|
||||
LegacyState,
|
||||
Source,
|
||||
Members,
|
||||
Owners,
|
||||
@@ -19,13 +17,12 @@ enum DumpView {
|
||||
impl DumpView {
|
||||
fn parse(value: &str) -> Result<Self, String> {
|
||||
match value {
|
||||
"legacy-state" => Ok(Self::LegacyState),
|
||||
"source" => Ok(Self::Source),
|
||||
"members" => Ok(Self::Members),
|
||||
"owners" => Ok(Self::Owners),
|
||||
"all" => Ok(Self::All),
|
||||
other => Err(format!(
|
||||
"invalid --view: {other} (expected one of: legacy-state, source, members, owners, all)"
|
||||
"invalid --view: {other} (expected one of: source, members, owners, all)"
|
||||
)),
|
||||
}
|
||||
}
|
||||
@@ -42,7 +39,7 @@ fn usage() -> String {
|
||||
format!(
|
||||
"\
|
||||
Usage:
|
||||
{bin} --db <path> [--view <legacy-state|source|members|owners|all>]
|
||||
{bin} --db <path> [--view <source|members|owners|all>]
|
||||
|
||||
Options:
|
||||
--db <path> RocksDB directory
|
||||
@@ -94,22 +91,6 @@ fn open_db(path: &std::path::Path) -> Result<DB, Box<dyn std::error::Error>> {
|
||||
)?)
|
||||
}
|
||||
|
||||
fn collect_legacy_state(db: &DB) -> Result<Vec<(String, RrdpState)>, Box<dyn std::error::Error>> {
|
||||
let cf = db
|
||||
.cf_handle(CF_RRDP_STATE)
|
||||
.ok_or("missing column family: rrdp_state")?;
|
||||
let mut out = Vec::new();
|
||||
for res in db.iterator_cf(cf, IteratorMode::Start) {
|
||||
let (k, v) = res?;
|
||||
let notify_uri = String::from_utf8_lossy(&k).to_string();
|
||||
let state = RrdpState::decode(&v)
|
||||
.map_err(|e| format!("decode rrdp_state failed for {notify_uri}: {e}"))?;
|
||||
out.push((notify_uri, state));
|
||||
}
|
||||
out.sort_by(|a, b| a.0.cmp(&b.0));
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
fn collect_source_records(db: &DB) -> Result<Vec<RrdpSourceRecord>, Box<dyn std::error::Error>> {
|
||||
let cf = db
|
||||
.cf_handle(CF_RRDP_SOURCE)
|
||||
@@ -163,14 +144,6 @@ fn collect_uri_owner_records(
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
fn print_legacy_state(entries: &[(String, RrdpState)]) {
|
||||
println!("[legacy-state]");
|
||||
println!("notify_uri\tserial\tsession_id");
|
||||
for (notify_uri, state) in entries {
|
||||
println!("{notify_uri}\t{}\t{}", state.serial, state.session_id);
|
||||
}
|
||||
}
|
||||
|
||||
fn print_source_records(entries: &[RrdpSourceRecord]) {
|
||||
println!("[source]");
|
||||
println!("notify_uri\tlast_serial\tlast_session_id\tsync_state\tlast_snapshot_uri\tlast_error");
|
||||
@@ -228,12 +201,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let db = open_db(&args.db_path)?;
|
||||
|
||||
match args.view {
|
||||
DumpView::LegacyState => print_legacy_state(&collect_legacy_state(&db)?),
|
||||
DumpView::Source => print_source_records(&collect_source_records(&db)?),
|
||||
DumpView::Members => print_source_member_records(&collect_source_member_records(&db)?),
|
||||
DumpView::Owners => print_uri_owner_records(&collect_uri_owner_records(&db)?),
|
||||
DumpView::All => {
|
||||
print_legacy_state(&collect_legacy_state(&db)?);
|
||||
print_source_records(&collect_source_records(&db)?);
|
||||
print_source_member_records(&collect_source_member_records(&db)?);
|
||||
print_uri_owner_records(&collect_uri_owner_records(&db)?);
|
||||
@@ -275,19 +246,9 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn collect_rrdp_views_reads_legacy_and_current_records() {
|
||||
fn collect_rrdp_views_reads_current_records() {
|
||||
let dir = tempfile::tempdir().expect("tempdir");
|
||||
let store = RocksStore::open(dir.path()).expect("open store");
|
||||
let legacy_state = RrdpState {
|
||||
session_id: "session-1".to_string(),
|
||||
serial: 42,
|
||||
};
|
||||
store
|
||||
.put_rrdp_state(
|
||||
"https://example.test/notify.xml",
|
||||
&legacy_state.encode().expect("encode legacy state"),
|
||||
)
|
||||
.expect("put legacy state");
|
||||
store
|
||||
.put_rrdp_source_record(&RrdpSourceRecord {
|
||||
notify_uri: "https://example.test/notify.xml".to_string(),
|
||||
@@ -328,14 +289,10 @@ mod tests {
|
||||
drop(store);
|
||||
|
||||
let db = open_db(dir.path()).expect("open db");
|
||||
let legacy = collect_legacy_state(&db).expect("legacy dump");
|
||||
let sources = collect_source_records(&db).expect("source dump");
|
||||
let members = collect_source_member_records(&db).expect("members dump");
|
||||
let owners = collect_uri_owner_records(&db).expect("owners dump");
|
||||
|
||||
assert_eq!(legacy.len(), 1);
|
||||
assert_eq!(legacy[0].0, "https://example.test/notify.xml");
|
||||
assert_eq!(legacy[0].1.serial, 42);
|
||||
assert_eq!(sources.len(), 1);
|
||||
assert_eq!(sources[0].sync_state, RrdpSourceSyncState::DeltaReady);
|
||||
assert_eq!(members.len(), 1);
|
||||
|
||||
Reference in New Issue
Block a user