Merge #1196: Don't run the expiry sweep from offline CLI commands (@Silvertree2010)

This commit is contained in:
bflatastic
2026-10-24 09:18:03 +07:00
2 changed files with 21 additions and 3 deletions
+16
View File
@@ -196,6 +196,22 @@ fn idle_files_published_without_the_key_expire() {
assert!(store.listing(&|_| None).iter().all(|r| r.info.id != fresh.id));
}
#[test]
fn offline_commands_do_not_sweep_idle_files() {
let dir = TempDir::new("offline-sweep");
let mut c = open(dir.path());
c.idle_days = 30.0;
let mut store = Store::open(dir.path(), c.store()).unwrap();
let (public, ..) = store.publish_open(ip("203.0.113.9"), "Public", &snapshot("Public")).unwrap();
store.age(&public.id, 31 * 86_400);
drop(store);
let store = Store::try_open(dir.path(), c.store()).unwrap().unwrap();
drop(store);
assert!(dir.path().join("files").join(&public.id).exists(), "a command deleted an idle file");
let _serving = Store::open(dir.path(), c.store()).unwrap();
assert!(!dir.path().join("files").join(&public.id).exists());
}
#[test]
fn rate_limits_and_blocks_refuse_with_a_reason() {
let dir = TempDir::new("limits");
+5 -3
View File
@@ -338,10 +338,13 @@ impl Store {
/// Use the data directory `root` (made if missing). Fails when another server or command holds
/// it. Files that can't be read are skipped and listed in [`problems`](Self::problems).
pub fn open(root: &Path, cfg: StoreConfig) -> Result<Store, String> {
Self::try_open(root, cfg)?.ok_or_else(|| format!("another figcraft-server (or a command) is using {}", root.display()))
let mut store = Self::try_open(root, cfg)?.ok_or_else(|| format!("another figcraft-server (or a command) is using {}", root.display()))?;
store.sweep();
Ok(store)
}
/// [`open`](Self::open), or `None` when someone else holds the directory.
/// [`open`](Self::open) without the expiry sweep (for commands that only look or edit), or
/// `None` when someone else holds the directory.
pub fn try_open(root: &Path, cfg: StoreConfig) -> Result<Option<Store>, String> {
let Some(lock) = lock(root)? else { return Ok(None) };
let key = load_key(root)?;
@@ -374,7 +377,6 @@ impl Store {
store.scan(&dir);
store.blocked = store.read_list::<String>(BLOCKED).iter().filter_map(|s| s.parse().ok()).map(ip_key).collect();
store.reports = store.read_list(REPORTS);
store.sweep();
Ok(Some(store))
}