mountpoint_s3_fs/fs/
config.rs1use std::time::Duration;
2
3use nix::unistd::{getgid, getuid};
4
5use crate::mem_limiter::MINIMUM_MEM_LIMIT;
6use crate::metablock::WriteMode;
7use crate::prefetch::PrefetcherConfig;
8use crate::s3::S3Personality;
9
10use super::{ServerSideEncryption, TimeToLive};
11
12#[derive(Debug)]
13pub struct S3FilesystemConfig {
14 pub cache_config: CacheConfig,
16 pub readdir_size: usize,
18 pub uid: u32,
20 pub gid: u32,
22 pub dir_mode: u16,
24 pub file_mode: u16,
26 pub allow_delete: bool,
28 pub allow_overwrite: bool,
30 pub allow_rename: bool,
32 pub incremental_upload: bool,
34 pub storage_class: Option<String>,
36 pub s3_personality: S3Personality,
38 pub server_side_encryption: ServerSideEncryption,
40 pub use_upload_checksums: bool,
42 pub mem_limit: u64,
44 pub prefetcher_config: PrefetcherConfig,
46 pub max_background_fuse_requests: Option<u16>,
50}
51
52impl Default for S3FilesystemConfig {
53 fn default() -> Self {
54 let uid = getuid().into();
55 let gid = getgid().into();
56
57 Self {
58 cache_config: Default::default(),
59 readdir_size: 100,
60 uid,
61 gid,
62 dir_mode: 0o755,
63 file_mode: 0o644,
64 allow_delete: false,
65 allow_overwrite: false,
66 incremental_upload: false,
67 allow_rename: true,
68 storage_class: None,
69 s3_personality: S3Personality::default(),
70 server_side_encryption: Default::default(),
71 use_upload_checksums: true,
72 mem_limit: MINIMUM_MEM_LIMIT,
73 prefetcher_config: Default::default(),
74 max_background_fuse_requests: None,
75 }
76 }
77}
78
79impl S3FilesystemConfig {
80 pub fn write_mode(&self) -> WriteMode {
81 WriteMode {
82 allow_overwrite: self.allow_overwrite,
83 incremental_upload: self.incremental_upload,
84 }
85 }
86
87 pub fn max_background_fuse_requests(&self) -> Option<u16> {
88 const ENV_VAR_KEY_MAX_BACKGROUND: &str = "UNSTABLE_MOUNTPOINT_MAX_BACKGROUND";
90 if self.max_background_fuse_requests.is_some() {
91 self.max_background_fuse_requests
92 } else if let Some(user_max_background) = std::env::var_os(ENV_VAR_KEY_MAX_BACKGROUND) {
93 let max_background = Self::parse_env_var_to_u16(ENV_VAR_KEY_MAX_BACKGROUND, user_max_background);
94 Some(max_background)
95 } else {
96 None
97 }
98 }
99
100 pub fn fuse_congestion_threshold(&self) -> Option<u16> {
101 const ENV_VAR_KEY_CONGESTION_THRESHOLD: &str = "UNSTABLE_MOUNTPOINT_CONGESTION_THRESHOLD";
103 std::env::var_os(ENV_VAR_KEY_CONGESTION_THRESHOLD).map(|user_congestion_threshold| {
104 Self::parse_env_var_to_u16(ENV_VAR_KEY_CONGESTION_THRESHOLD, user_congestion_threshold)
105 })
106 }
107
108 fn parse_env_var_to_u16(var_name: &str, var_value: std::ffi::OsString) -> u16 {
110 var_value
111 .to_string_lossy()
112 .parse::<u16>()
113 .unwrap_or_else(|_| panic!("Invalid value for environment variable {var_name}. Must be positive integer."))
114 }
115}
116
117#[derive(Debug, Clone)]
118pub struct CacheConfig {
119 pub serve_lookup_from_cache: bool,
127 pub file_ttl: Duration,
129 pub dir_ttl: Duration,
131 pub use_negative_cache: bool,
133 pub negative_cache_ttl: Duration,
135 pub negative_cache_size: usize,
137}
138
139impl Default for CacheConfig {
140 fn default() -> Self {
141 let file_ttl = Duration::from_millis(100);
151 let dir_ttl = Duration::from_millis(1000);
152
153 let negative_cache_size = 100_000;
159
160 Self {
161 serve_lookup_from_cache: false,
162 file_ttl,
163 dir_ttl,
164 use_negative_cache: false,
165 negative_cache_ttl: file_ttl,
166 negative_cache_size,
167 }
168 }
169}
170
171impl CacheConfig {
172 pub fn new(metadata_ttl: TimeToLive) -> Self {
174 match metadata_ttl {
175 TimeToLive::Minimal => Default::default(),
176 TimeToLive::Indefinite => Self {
177 serve_lookup_from_cache: true,
178 file_ttl: TimeToLive::INDEFINITE_DURATION,
179 dir_ttl: TimeToLive::INDEFINITE_DURATION,
180 use_negative_cache: true,
181 negative_cache_ttl: TimeToLive::INDEFINITE_DURATION,
182 ..Default::default()
183 },
184 TimeToLive::Duration(ttl) => Self {
185 serve_lookup_from_cache: true,
186 file_ttl: ttl,
187 dir_ttl: ttl,
188 use_negative_cache: true,
189 negative_cache_ttl: ttl,
190 ..Default::default()
191 },
192 }
193 }
194
195 pub fn with_negative_metadata_ttl(self, negative_metadata_ttl: TimeToLive) -> Self {
196 match negative_metadata_ttl {
197 TimeToLive::Minimal => Self {
198 use_negative_cache: false,
199 negative_cache_ttl: Self::default().negative_cache_ttl,
200 ..self
201 },
202 TimeToLive::Indefinite => Self {
203 use_negative_cache: true,
204 negative_cache_ttl: TimeToLive::INDEFINITE_DURATION,
205 ..self
206 },
207 TimeToLive::Duration(ttl) => Self {
208 use_negative_cache: true,
209 negative_cache_ttl: ttl,
210 ..self
211 },
212 }
213 }
214}