1use common_meta::key::flow::flow_state::FlowStat;
16use datatypes::value::Value;
17use tokio::sync::{mpsc, oneshot};
18
19use crate::error::InternalSnafu;
20
21pub fn get_value_heap_size(value: &Value) -> usize {
22 match value {
23 Value::Binary(v) => v.len(),
24 Value::String(v) => v.len(),
25 Value::List(v) => v.items().iter().map(get_value_heap_size).sum(),
26 _ => 0,
27 }
28}
29
30#[derive(Clone)]
31pub struct SizeReportSender {
32 inner: mpsc::Sender<oneshot::Sender<FlowStat>>,
33}
34impl SizeReportSender {
35 pub fn new() -> (Self, StateReportHandler) {
36 let (tx, rx) = mpsc::channel(1);
37 (Self { inner: tx }, rx)
38 }
39 pub async fn query(&self, timeout: std::time::Duration) -> crate::Result<FlowStat> {
40 let (tx, rx) = oneshot::channel();
41 self.inner.send(tx).await.map_err(|_| {
42 InternalSnafu {
43 reason: "failed to send size report request",
44 }
45 .build()
46 })?;
47 tokio::time::timeout(timeout, rx)
48 .await
49 .map_err(|_| {
50 InternalSnafu {
51 reason: "failed to receive size report after timeout",
52 }
53 .build()
54 })?
55 .map_err(|_| {
56 InternalSnafu {
57 reason: "size report sender dropped",
58 }
59 .build()
60 })
61 }
62}
63pub type StateReportHandler = mpsc::Receiver<oneshot::Sender<FlowStat>>;