Line data Source code
1 : use std::{num::NonZeroUsize, sync::Arc};
2 :
3 : use crate::tenant::ephemeral_file;
4 :
5 0 : #[derive(Default, Debug, PartialEq, Eq, Clone, serde::Deserialize)]
6 : #[serde(tag = "mode", rename_all = "kebab-case", deny_unknown_fields)]
7 : pub enum L0FlushConfig {
8 : #[default]
9 : PageCached,
10 : #[serde(rename_all = "snake_case")]
11 : Direct { max_concurrency: NonZeroUsize },
12 : }
13 :
14 : #[derive(Clone)]
15 : pub struct L0FlushGlobalState(Arc<Inner>);
16 :
17 : pub(crate) enum Inner {
18 : PageCached,
19 : Direct { semaphore: tokio::sync::Semaphore },
20 : }
21 :
22 : impl L0FlushGlobalState {
23 162 : pub fn new(config: L0FlushConfig) -> Self {
24 162 : match config {
25 162 : L0FlushConfig::PageCached => Self(Arc::new(Inner::PageCached)),
26 0 : L0FlushConfig::Direct { max_concurrency } => {
27 0 : let semaphore = tokio::sync::Semaphore::new(max_concurrency.get());
28 0 : Self(Arc::new(Inner::Direct { semaphore }))
29 : }
30 : }
31 162 : }
32 :
33 1114 : pub(crate) fn inner(&self) -> &Arc<Inner> {
34 1114 : &self.0
35 1114 : }
36 : }
37 :
38 : impl L0FlushConfig {
39 1246 : pub(crate) fn prewarm_on_write(&self) -> ephemeral_file::PrewarmPageCacheOnWrite {
40 1246 : use L0FlushConfig::*;
41 1246 : match self {
42 1246 : PageCached => ephemeral_file::PrewarmPageCacheOnWrite::Yes,
43 0 : Direct { .. } => ephemeral_file::PrewarmPageCacheOnWrite::No,
44 : }
45 1246 : }
46 : }
|