common_meta/heartbeat/handler/
invalidate_table_cache.rsuse async_trait::async_trait;
use common_telemetry::debug;
use crate::cache_invalidator::{CacheInvalidatorRef, Context};
use crate::error::Result as MetaResult;
use crate::heartbeat::handler::{
HandleControl, HeartbeatResponseHandler, HeartbeatResponseHandlerContext,
};
use crate::instruction::Instruction;
#[derive(Clone)]
pub struct InvalidateCacheHandler {
cache_invalidator: CacheInvalidatorRef,
}
#[async_trait]
impl HeartbeatResponseHandler for InvalidateCacheHandler {
fn is_acceptable(&self, ctx: &HeartbeatResponseHandlerContext) -> bool {
matches!(
ctx.incoming_message.as_ref(),
Some((_, Instruction::InvalidateCaches(_)))
)
}
async fn handle(&self, ctx: &mut HeartbeatResponseHandlerContext) -> MetaResult<HandleControl> {
let Some((_, Instruction::InvalidateCaches(caches))) = ctx.incoming_message.take() else {
unreachable!("InvalidateCacheHandler: should be guarded by 'is_acceptable'")
};
debug!("InvalidateCacheHandler: invalidating caches: {:?}", caches);
let _ = self
.cache_invalidator
.invalidate(&Context::default(), &caches)
.await?;
Ok(HandleControl::Done)
}
}
impl InvalidateCacheHandler {
pub fn new(cache_invalidator: CacheInvalidatorRef) -> Self {
Self { cache_invalidator }
}
}