use crate::query::plan_cache;
use crate::storage::shmem_cache;
use pgrx::prelude::*;
use serde_json::json;
#[pg_extern]
fn stats() -> pgrx::JsonB {
let s = shmem_cache::snapshot();
let p = plan_cache::snapshot();
pgrx::JsonB(json!({
"shmem_ready": s.ready,
"shmem_slots": s.slots,
"shmem_hits": s.hits,
"shmem_misses": s.misses,
"shmem_inserts": s.inserts,
"shmem_evictions": s.evictions,
"plan_cache_hits": p.hits,
"plan_cache_misses": p.misses,
"plan_cache_inserts": p.inserts,
"plan_cache_local_size": p.local_size,
}))
}
#[pg_extern]
fn shmem_reset() {
shmem_cache::reset();
}
#[cfg(any(test, feature = "pg_test"))]
#[pg_schema]
mod tests {
use pgrx::prelude::*;
#[pg_test]
fn stats_returns_object() {
let j: pgrx::JsonB = Spi::get_one("SELECT pgrdf.stats()").unwrap().unwrap();
let v = &j.0;
assert!(v.is_object(), "stats() must return a JSON object");
assert!(v.get("shmem_ready").is_some());
assert!(v.get("shmem_slots").is_some());
assert!(v.get("shmem_hits").is_some());
}
#[pg_test]
fn shmem_reset_invalidates_slots() {
use crate::storage::dict::term_type;
use crate::storage::shmem_cache::{insert_committed, lookup};
let key = "http://example.com/reset-victim";
insert_committed(term_type::URI, key, None, None, 12345);
assert_eq!(lookup(term_type::URI, key, None, None), Some(12345));
Spi::run("SELECT pgrdf.shmem_reset()").unwrap();
assert_eq!(
lookup(term_type::URI, key, None, None),
None,
"reset must drop pre-reset entries"
);
}
}