diff options
author | Alex Auvolat <alex@adnab.me> | 2023-08-30 20:02:07 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2023-08-30 20:02:07 +0200 |
commit | 75ccc5a95c76f31235fcaab8a2c1795693733a4b (patch) | |
tree | 2309b19d04875d991bffdad93cdb050c7477123e /src/model | |
parent | 7200954318a1b248b4194ee9273bcd2502b50d58 (diff) | |
download | garage-75ccc5a95c76f31235fcaab8a2c1795693733a4b.tar.gz garage-75ccc5a95c76f31235fcaab8a2c1795693733a4b.zip |
lifecycle config: store date as given, try to debug
Diffstat (limited to 'src/model')
-rw-r--r-- | src/model/bucket_table.rs | 16 | ||||
-rw-r--r-- | src/model/s3/lifecycle_worker.rs | 9 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/model/bucket_table.rs b/src/model/bucket_table.rs index e9d574c5..df2e9b4a 100644 --- a/src/model/bucket_table.rs +++ b/src/model/bucket_table.rs @@ -105,7 +105,7 @@ mod v08 { /// Objects expire x days after they were created AfterDays(usize), /// Objects expire at date x (must be in yyyy-mm-dd format) - AtDate(chrono::naive::NaiveDate), + AtDate(String), } #[derive(Default, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)] @@ -155,6 +155,20 @@ impl Crdt for BucketParams { } } +pub fn parse_lifecycle_date(date: &str) -> Result<chrono::NaiveDate, &'static str> { + use chrono::prelude::*; + + if let Ok(datetime) = NaiveDateTime::parse_from_str(date, "%Y-%m-%dT%H:%M:%SZ") { + if datetime.time() == NaiveTime::MIN { + Ok(datetime.date()) + } else { + Err("date must be at midnight") + } + } else { + NaiveDate::parse_from_str(date, "%Y-%m-%d").map_err(|_| "date has invalid format") + } +} + impl Default for Bucket { fn default() -> Self { Self::new() diff --git a/src/model/s3/lifecycle_worker.rs b/src/model/s3/lifecycle_worker.rs index 02e296e7..5641b093 100644 --- a/src/model/s3/lifecycle_worker.rs +++ b/src/model/s3/lifecycle_worker.rs @@ -268,7 +268,14 @@ async fn process_object( LifecycleExpiration::AfterDays(n_days) => { (now_date - version_date) >= chrono::Duration::days(*n_days as i64) } - LifecycleExpiration::AtDate(exp_date) => now_date >= *exp_date, + LifecycleExpiration::AtDate(exp_date) => { + if let Ok(exp_date) = parse_lifecycle_date(&exp_date) { + now_date >= exp_date + } else { + warn!("Invalid expiraiton date stored in bucket {:?} lifecycle config: {}", bucket.id, exp_date); + false + } + } }; if size_match && date_match { |