common_meta/heartbeat/handler/
invalidate_table_cache.rs1use async_trait::async_trait;
16use common_telemetry::debug;
17
18use crate::cache_invalidator::{CacheInvalidatorRef, Context};
19use crate::error::Result as MetaResult;
20use crate::heartbeat::handler::{
21 HandleControl, HeartbeatResponseHandler, HeartbeatResponseHandlerContext,
22};
23use crate::instruction::Instruction;
24
25#[derive(Clone)]
26pub struct InvalidateCacheHandler {
27 cache_invalidator: CacheInvalidatorRef,
28}
29
30#[async_trait]
31impl HeartbeatResponseHandler for InvalidateCacheHandler {
32 fn is_acceptable(&self, ctx: &HeartbeatResponseHandlerContext) -> bool {
33 matches!(
34 ctx.incoming_message.as_ref(),
35 Some((_, _, Instruction::InvalidateCaches(_)))
36 )
37 }
38
39 async fn handle(&self, ctx: &mut HeartbeatResponseHandlerContext) -> MetaResult<HandleControl> {
40 let Some((_, _, Instruction::InvalidateCaches(caches))) = ctx.incoming_message.take()
41 else {
42 unreachable!("InvalidateCacheHandler: should be guarded by 'is_acceptable'")
43 };
44
45 debug!("InvalidateCacheHandler: invalidating caches: {:?}", caches);
46
47 let _ = self
49 .cache_invalidator
50 .invalidate(&Context::default(), &caches)
51 .await?;
52
53 Ok(HandleControl::Done)
54 }
55}
56
57impl InvalidateCacheHandler {
58 pub fn new(cache_invalidator: CacheInvalidatorRef) -> Self {
59 Self { cache_invalidator }
60 }
61}