upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2026-02-23 13:04:07 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2026-02-23 13:04:07 +0000
commitc368f9132a16d45a17ad55943e4b68ba85a6835b (patch)
treeb0816be9422a14c0cdd473234192239ab62d087c /src
parentc3dedb7a5b527c3a3deb1e781aba9d562c6eb294 (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')
-rw-r--r--src/purgatory/mod.rs65
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