diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-23 13:04:07 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-23 13:04:07 +0000 |
| commit | c368f9132a16d45a17ad55943e4b68ba85a6835b (patch) | |
| tree | b0816be9422a14c0cdd473234192239ab62d087c /src/purgatory/mod.rs | |
| parent | c3dedb7a5b527c3a3deb1e781aba9d562c6eb294 (diff) | |
fix: only soft-expire announcement when bare repo deletion succeeds
If remove_dir_all fails, leave the entry untouched so the next cleanup
cycle retries the deletion automatically. Previously a failed deletion
would still set soft_expired=true and extend the expiry, meaning the
bare repo would never be retried.
Diffstat (limited to 'src/purgatory/mod.rs')
| -rw-r--r-- | src/purgatory/mod.rs | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/src/purgatory/mod.rs b/src/purgatory/mod.rs index 3c6bc1b..f5f8b31 100644 --- a/src/purgatory/mod.rs +++ b/src/purgatory/mod.rs | |||
| @@ -898,33 +898,48 @@ impl Purgatory { | |||
| 898 | "Announcement fully expired from purgatory (soft expiry period elapsed)" | 898 | "Announcement fully expired from purgatory (soft expiry period elapsed)" |
| 899 | ); | 899 | ); |
| 900 | } else { | 900 | } else { |
| 901 | // Phase 1: soft expiry — delete bare repo, retain event | 901 | // Phase 1: soft expiry — delete bare repo, retain event. |
| 902 | if repo_path.exists() { | 902 | // |
| 903 | if let Err(e) = std::fs::remove_dir_all(&repo_path) { | 903 | // Only transition to soft_expired if the directory is gone (or never |
| 904 | tracing::warn!( | 904 | // existed). If removal fails we leave the entry untouched so the next |
| 905 | path = %repo_path.display(), | 905 | // cleanup cycle retries the deletion automatically. |
| 906 | error = %e, | 906 | let repo_gone = if repo_path.exists() { |
| 907 | "Failed to delete bare repository during soft expiry" | 907 | match std::fs::remove_dir_all(&repo_path) { |
| 908 | ); | 908 | Ok(()) => { |
| 909 | } else { | 909 | tracing::info!( |
| 910 | tracing::info!( | 910 | path = %repo_path.display(), |
| 911 | path = %repo_path.display(), | 911 | owner = %owner, |
| 912 | owner = %owner, | 912 | identifier = %identifier, |
| 913 | identifier = %identifier, | 913 | "Deleted bare repository during soft expiry (event retained for revival)" |
| 914 | "Deleted bare repository during soft expiry (event retained for revival)" | 914 | ); |
| 915 | ); | 915 | true |
| 916 | } | ||
| 917 | Err(e) => { | ||
| 918 | tracing::warn!( | ||
| 919 | path = %repo_path.display(), | ||
| 920 | error = %e, | ||
| 921 | "Failed to delete bare repository during soft expiry; will retry next cleanup cycle" | ||
| 922 | ); | ||
| 923 | false | ||
| 924 | } | ||
| 916 | } | 925 | } |
| 926 | } else { | ||
| 927 | // Already gone (e.g. deleted externally) | ||
| 928 | true | ||
| 929 | }; | ||
| 930 | |||
| 931 | if repo_gone { | ||
| 932 | // Mark soft_expired and extend expiry | ||
| 933 | if let Some(mut entry) = self.announcement_purgatory.get_mut(&(owner.clone(), identifier.clone())) { | ||
| 934 | entry.soft_expired = true; | ||
| 935 | entry.expires_at = now + SOFT_EXPIRY_EXTENDED; | ||
| 936 | } | ||
| 937 | tracing::debug!( | ||
| 938 | owner = %owner, | ||
| 939 | identifier = %identifier, | ||
| 940 | "Announcement soft-expired: bare repo deleted, event retained for 24h" | ||
| 941 | ); | ||
| 917 | } | 942 | } |
| 918 | // Mark soft_expired and extend expiry | ||
| 919 | if let Some(mut entry) = self.announcement_purgatory.get_mut(&(owner.clone(), identifier.clone())) { | ||
| 920 | entry.soft_expired = true; | ||
| 921 | entry.expires_at = now + SOFT_EXPIRY_EXTENDED; | ||
| 922 | } | ||
| 923 | tracing::debug!( | ||
| 924 | owner = %owner, | ||
| 925 | identifier = %identifier, | ||
| 926 | "Announcement soft-expired: bare repo deleted, event retained for 24h" | ||
| 927 | ); | ||
| 928 | } | 943 | } |
| 929 | } | 944 | } |
| 930 | 945 | ||