From edb27d7e15161e3b12af0fa5b2c3bde8295bb5d7 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Tue, 30 Jun 2026 17:42:21 -0400 Subject: fix(calendar-sync): skip overlapping syncs for the same calendar A timer tick that fired while a calendar's previous fetch was still running launched a second concurrent sync for that calendar, wasting work and racing to write the same org file. The dispatcher now skips a calendar whose status is already syncing and logs the skipped tick. The sentinel resets the status on process exit, so the skip clears on its own. load-state also clears a stale syncing status left by a crash, so a calendar can't be skipped forever. --- modules/calendar-sync.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'modules/calendar-sync.el') diff --git a/modules/calendar-sync.el b/modules/calendar-sync.el index 297d1fe61..804d71faf 100644 --- a/modules/calendar-sync.el +++ b/modules/calendar-sync.el @@ -211,10 +211,20 @@ fetcher) or :account + :calendar-id (the \\='api fetcher). Dispatches on the :fetcher key, defaulting to the .ics path. Updates calendar state and saves to disk on completion. The fetch and conversion run in external processes so parsing and writing large -calendar files do not block the interactive Emacs thread." - (if (eq (plist-get calendar :fetcher) 'api) - (calendar-sync--sync-calendar-api calendar) - (calendar-sync--sync-calendar-ics calendar))) +calendar files do not block the interactive Emacs thread. + +Skips a calendar whose previous sync is still in flight, so a timer tick that +fires before a slow fetch finishes does not launch a second overlapping sync for +the same calendar." + (let ((name (plist-get calendar :name))) + (cond + ((calendar-sync--syncing-p name) + (calendar-sync--log-silently + "calendar-sync: [%s] sync already in flight; skipping overlapping tick" name)) + ((eq (plist-get calendar :fetcher) 'api) + (calendar-sync--sync-calendar-api calendar)) + (t + (calendar-sync--sync-calendar-ics calendar))))) (defun calendar-sync--require-calendars () "Return non-nil if calendars are configured, else warn and return nil." -- cgit v1.2.3