use std::sync::Arc;
use std::sync::Mutex;
use registry_io::SyncRegistry;
#[derive(Debug, Clone)]
struct TransactionEvent {
txid: u64,
transition: Transition,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(dead_code)] enum Transition {
Begun,
Prepared,
Committed,
Aborted,
RecoveredFromCrash,
}
fn main() {
let bus: SyncRegistry<TransactionEvent> = SyncRegistry::new();
let order: Arc<Mutex<Vec<(u64, &'static str)>>> = Arc::new(Mutex::new(Vec::new()));
{
let order = Arc::clone(&order);
let _ = bus.register_with_priority(1000, move |evt: &TransactionEvent| {
if matches!(evt.transition, Transition::Committed) {
order.lock().unwrap().push((evt.txid, "wal:flush"));
}
});
}
{
let order = Arc::clone(&order);
let _ =
bus.register_with_priority(500, move |evt: &TransactionEvent| match evt.transition {
Transition::Committed | Transition::Aborted => {
order.lock().unwrap().push((evt.txid, "cache:invalidate"));
}
_ => {}
});
}
{
let order = Arc::clone(&order);
let _ = bus.register(move |evt: &TransactionEvent| {
if matches!(evt.transition, Transition::Committed) {
order.lock().unwrap().push((evt.txid, "replication:send"));
}
});
}
{
let order = Arc::clone(&order);
let _ = bus.register_with_priority(-100, move |evt: &TransactionEvent| {
let tag = match evt.transition {
Transition::Begun => "metrics:tx_begun",
Transition::Prepared => "metrics:tx_prepared",
Transition::Committed => "metrics:tx_committed",
Transition::Aborted => "metrics:tx_aborted",
Transition::RecoveredFromCrash => "metrics:tx_recovered",
};
order.lock().unwrap().push((evt.txid, tag));
});
}
let transitions = [
Transition::Begun,
Transition::Prepared,
Transition::Committed,
];
for transition in transitions {
bus.notify(&TransactionEvent {
txid: 42,
transition,
});
}
bus.notify(&TransactionEvent {
txid: 43,
transition: Transition::Begun,
});
bus.notify(&TransactionEvent {
txid: 43,
transition: Transition::Aborted,
});
let log = order.lock().unwrap();
println!("hook execution order (priority desc, then registration order):");
for (txid, tag) in log.iter() {
println!(" txid={txid:>3} hook={tag}");
}
}