|
17 | 17 | */ |
18 | 18 |
|
19 | 19 | use super::{ |
20 | | - file_link::CacheState, LogStream, MoveDataError, ObjectStorageError, ObjectStoreFormat, |
21 | | - Permisssion, StorageDir, StorageMetadata, CACHED_FILES, |
| 20 | + file_link::CacheState, retention::Retention, LogStream, MoveDataError, ObjectStorageError, |
| 21 | + ObjectStoreFormat, Permisssion, StorageDir, StorageMetadata, CACHED_FILES, |
22 | 22 | }; |
23 | 23 | use crate::{ |
24 | 24 | alerts::Alerts, |
@@ -77,9 +77,11 @@ pub trait ObjectStorage: Sync + 'static { |
77 | 77 | path: &RelativePath, |
78 | 78 | resource: Bytes, |
79 | 79 | ) -> Result<(), ObjectStorageError>; |
| 80 | + async fn delete_prefix(&self, path: &RelativePath) -> Result<(), ObjectStorageError>; |
80 | 81 | async fn check(&self) -> Result<(), ObjectStorageError>; |
81 | 82 | async fn delete_stream(&self, stream_name: &str) -> Result<(), ObjectStorageError>; |
82 | 83 | async fn list_streams(&self) -> Result<Vec<LogStream>, ObjectStorageError>; |
| 84 | + async fn list_dates(&self, stream_name: &str) -> Result<Vec<String>, ObjectStorageError>; |
83 | 85 | async fn upload_file(&self, key: &str, path: &Path) -> Result<(), ObjectStorageError>; |
84 | 86 | fn query_table( |
85 | 87 | &self, |
@@ -142,6 +144,23 @@ pub trait ObjectStorage: Sync + 'static { |
142 | 144 | self.put_object(&path, to_bytes(&stream_metadata)).await |
143 | 145 | } |
144 | 146 |
|
| 147 | + async fn put_retention( |
| 148 | + &self, |
| 149 | + stream_name: &str, |
| 150 | + retention: &Retention, |
| 151 | + ) -> Result<(), ObjectStorageError> { |
| 152 | + let path = stream_json_path(stream_name); |
| 153 | + let stream_metadata = self.get_object(&path).await?; |
| 154 | + let stats = |
| 155 | + serde_json::to_value(retention).expect("rentention tasks are perfectly serializable"); |
| 156 | + let mut stream_metadata: serde_json::Value = |
| 157 | + serde_json::from_slice(&stream_metadata).expect("parseable config is valid json"); |
| 158 | + |
| 159 | + stream_metadata["retention"] = stats; |
| 160 | + |
| 161 | + self.put_object(&path, to_bytes(&stream_metadata)).await |
| 162 | + } |
| 163 | + |
145 | 164 | async fn put_metadata( |
146 | 165 | &self, |
147 | 166 | parseable_metadata: &StorageMetadata, |
@@ -216,6 +235,24 @@ pub trait ObjectStorage: Sync + 'static { |
216 | 235 | Ok(stats) |
217 | 236 | } |
218 | 237 |
|
| 238 | + async fn get_retention(&self, stream_name: &str) -> Result<Retention, ObjectStorageError> { |
| 239 | + let stream_metadata = self.get_object(&stream_json_path(stream_name)).await?; |
| 240 | + let stream_metadata: Value = |
| 241 | + serde_json::from_slice(&stream_metadata).expect("parseable config is valid json"); |
| 242 | + |
| 243 | + let retention = stream_metadata |
| 244 | + .as_object() |
| 245 | + .expect("is object") |
| 246 | + .get("retention") |
| 247 | + .cloned(); |
| 248 | + |
| 249 | + if let Some(retention) = retention { |
| 250 | + Ok(serde_json::from_value(retention).unwrap()) |
| 251 | + } else { |
| 252 | + Ok(Retention::default()) |
| 253 | + } |
| 254 | + } |
| 255 | + |
219 | 256 | async fn get_metadata(&self) -> Result<Option<StorageMetadata>, ObjectStorageError> { |
220 | 257 | let parseable_metadata: Option<StorageMetadata> = |
221 | 258 | match self.get_object(&parseable_json_path()).await { |
|
0 commit comments