diff --git a/copyparty/__main__.py b/copyparty/__main__.py index a3f26af4..8e8cb6c5 100755 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -808,6 +808,8 @@ def add_upload(ap): ap2.add_argument("--no-dedup", action="store_true", help="disable symlink/hardlink creation; copy file contents instead (volflag=copydupes)") ap2.add_argument("--no-dupe", action="store_true", help="reject duplicate files during upload; only matches within the same volume (volflag=nodupe)") ap2.add_argument("--no-snap", action="store_true", help="disable snapshots -- forget unfinished uploads on shutdown; don't create .hist/up2k.snap files -- abandoned/interrupted uploads must be cleaned up manually") + ap2.add_argument("--snap-wri", metavar="SEC", type=int, default=300, help="write upload state to ./hist/up2k.snap every SEC seconds; allows resuming incomplete uploads after a server crash") + ap2.add_argument("--snap-drop", metavar="MIN", type=float, default=1440, help="forget unfinished uploads after MIN minutes; impossible to resume them after that (360=6h, 1440=24h)") ap2.add_argument("--u2ts", metavar="TXT", type=u, default="c", help="how to timestamp uploaded files; [\033[32mc\033[0m]=client-last-modified, [\033[32mu\033[0m]=upload-time, [\033[32mfc\033[0m]=force-c, [\033[32mfu\033[0m]=force-u (volflag=u2ts)") ap2.add_argument("--rand", action="store_true", help="force randomized filenames, --nrand chars long (volflag=rand)") ap2.add_argument("--nrand", metavar="NUM", type=int, default=9, help="randomized filenames length (volflag=nrand)") diff --git a/copyparty/up2k.py b/copyparty/up2k.py index 7f255783..b600c2fa 100644 --- a/copyparty/up2k.py +++ b/copyparty/up2k.py @@ -134,8 +134,6 @@ class Up2k(object): self.vol_act: dict[str, float] = {} self.busy_aps: set[str] = set() self.dupesched: dict[str, list[tuple[str, str, float]]] = {} - self.snap_persist_interval = 300 # persist unfinished index every 5 min - self.snap_discard_interval = 21600 # drop unfinished after 6 hours inactivity self.snap_prev: dict[str, Optional[tuple[int, float]]] = {} self.mtag: Optional[MTag] = None @@ -3745,13 +3743,16 @@ class Up2k(object): self._finish_upload(job["ptop"], job["wark"]) def _snapshot(self) -> None: - slp = self.snap_persist_interval + slp = self.args.snap_wri + if not slp or self.args.no_snap: + return + while True: time.sleep(slp) if self.pp: slp = 5 else: - slp = self.snap_persist_interval + slp = self.args.snap_wri self.do_snapshot() def do_snapshot(self) -> None: @@ -3765,11 +3766,8 @@ class Up2k(object): if not histpath: return - rm = [ - x - for x in reg.values() - if x["need"] and now - x["poke"] > self.snap_discard_interval - ] + idrop = self.args.snap_drop * 60 + rm = [x for x in reg.values() if x["need"] and now - x["poke"] >= idrop] if self.args.nw: lost = []