From cfb493377837eb9e3a958abef7fefeea206ba5d5 Mon Sep 17 00:00:00 2001 From: abraunegg Date: Sun, 19 Mar 2023 09:54:58 +1100 Subject: [PATCH] Fix that a HTTP 504 - Gateway Timeout causes local files to be deleted when using --download-only & --cleanup-local-files mode (#2342) * Fix that a HTTP 504 - Gateway Timeout causes local files to be deleted when using --download-only & --cleanup-local-files mode --- src/sync.d | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/sync.d b/src/sync.d index cf357307..8677b135 100644 --- a/src/sync.d +++ b/src/sync.d @@ -1798,20 +1798,49 @@ final class SyncEngine log.vdebug("Retrying Query: changesAvailable = onedrive.viewChangesByItemId(driveId, idToQuery, deltaLinkAvailable)"); changesAvailable = onedrive.viewChangesByItemId(driveId, idToQuery, deltaLinkAvailable); log.vdebug("Query 'changesAvailable = onedrive.viewChangesByItemId(driveId, idToQuery, deltaLinkAvailable)' performed successfully on re-try"); + if (changesAvailable.type() == JSONType.object) { + // are there any delta changes? + if (("value" in changesAvailable) != null) { + deltaChanges = count(changesAvailable["value"].array); + log.log("changesAvailable query reports that there are " , deltaChanges , " changes that need processing on OneDrive"); + } + } } catch (OneDriveException e) { // display what the error is log.vdebug("Query Error: changesAvailable = onedrive.viewChangesByItemId(driveId, idToQuery, deltaLinkAvailable) on re-try after delay"); if (e.httpStatusCode == 504) { log.log("OneDrive returned a 'HTTP 504 - Gateway Timeout' when attempting to query for changes - retrying applicable request"); log.vdebug("changesAvailable = onedrive.viewChangesByItemId(driveId, idToQuery, deltaLinkAvailable) previously threw an error - retrying with empty deltaLinkAvailable"); + // Increase delay and wait again before retry + log.vdebug("Thread sleeping for 90 seconds as the server did not receive a timely response from the upstream server it needed to access in attempting to complete the request"); + Thread.sleep(dur!"seconds"(90)); + log.vdebug("Retrying Query - using a null deltaLinkAvailable after delay"); try { // try query with empty deltaLinkAvailable value deltaLinkAvailable = null; changesAvailable = onedrive.viewChangesByItemId(driveId, idToQuery, deltaLinkAvailable); log.vdebug("Query 'changesAvailable = onedrive.viewChangesByItemId(driveId, idToQuery, deltaLinkAvailable)' performed successfully on re-try"); + if (changesAvailable.type() == JSONType.object) { + // are there any delta changes? + if (("value" in changesAvailable) != null) { + deltaChanges = count(changesAvailable["value"].array); + log.vdebug("changesAvailable query reports that there are " , deltaChanges , " changes that need processing on OneDrive when using a null deltaLink value"); + } + } } catch (OneDriveException e) { // Tried 3 times, give up displayOneDriveErrorMessage(e.msg, getFunctionName!({})); + + // OK .. if this was a 504, and running with --download-only & --cleanup-local-files + // need to exit to preserve local data, otherwise potential files will be deleted that should not be deleted + // leading to undesirable potential data loss scenarios + if ((e.httpStatusCode == 504) && (cleanupLocalFiles)) { + // log why we are exiting + log.log("Exiting application due to OneDrive API Gateway Timeout & --download-only & --cleanup-local-files configured to preserve local data"); + // Must exit here + onedrive.shutdown(); + exit(-1); + } return; } } else {