From d7185cdbcf899790c1dbc3a23922e737772ede1d Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 17 May 2017 10:10:58 +0200 Subject: [PATCH] [KOE-104] Added PeriodThrottle property to ZPush sync tasks, to throttle the number of requests to the server. Defaults to 15 minutes, meaning the server will not be contacted more than once every 15 minutes. --- .../AcaciaZPushPlugin/Constants.cs | 8 +++++ .../Features/DebugSupport/DebugInfo.cs | 10 ++++++ .../AcaciaZPushPlugin/GlobalOptions.cs | 8 +++++ .../AcaciaZPushPlugin/ZPush/ZPushSync.cs | 33 +++++++++++++++---- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs index b45f9ef..8e16718 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs @@ -102,8 +102,16 @@ namespace Acacia public const string DATE_ISO_8601 = "yyyyMMddTHHmmssZ"; + /// + /// Default period for synchronisation tasks + /// public static readonly TimeSpan ZPUSH_SYNC_DEFAULT_PERIOD = new TimeSpan(1, 0, 0); + /// + /// Default period during which synchronisation tasks will not be executed again. + /// + public static readonly TimeSpan ZPUSH_SYNC_DEFAULT_PERIOD_THROTTLE = new TimeSpan(0, 15, 0); + #region Registry public const string PLUGIN_REGISTRY_BASE = "Software\\" + PRODUCT_PREFIX + "\\" + PRODUCT_NAME; diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugInfo.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugInfo.cs index e6ddead..dc0244f 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugInfo.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugInfo.cs @@ -194,6 +194,16 @@ namespace Acacia.Features.DebugSupport { get { return ThisAddIn.Instance.Watcher.Sync.Period; } } + [DebugCategory(DebugCategory.Misc)] + public TimeSpan ZPushSyncPeriodThrottle + { + get { return ThisAddIn.Instance.Watcher.Sync.PeriodThrottle; } + } + [DebugCategory(DebugCategory.Misc)] + public DateTime ZPushSyncLast + { + get { return ThisAddIn.Instance.Watcher.Sync.LastSyncTime; } + } [DebugCategory(DebugCategory.Misc)] public string Build diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs index 72d9fc4..7d7e9d2 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs @@ -90,6 +90,14 @@ namespace Acacia } private static readonly TimeSpanOption ZPUSH_SYNC_PERIOD = new TimeSpanOption("ZPushSyncPeriod", Constants.ZPUSH_SYNC_DEFAULT_PERIOD); + [AcaciaOption("Sets the interval during which ZPush synchronization tasks will be not executed to prevent overloading the server.")] + public TimeSpan ZPushSync_PeriodThrottle + { + get { return GetOption(null, ZPUSH_SYNC_PERIOD_THROTTLE); } + set { SetOption(null, ZPUSH_SYNC_PERIOD_THROTTLE, value); } + } + private static readonly TimeSpanOption ZPUSH_SYNC_PERIOD_THROTTLE = new TimeSpanOption("ZPushSyncPeriodThrottle", Constants.ZPUSH_SYNC_DEFAULT_PERIOD_THROTTLE); + [AcaciaOption("Disables the release of COM objects. This generally leads to resource leaks and should " + "only be disabled for debug purposes.")] public bool COMRelease diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs index abed17b..179126c 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs @@ -1,4 +1,4 @@ -/// Copyright 2016 Kopano b.v. +/// Copyright 2017 Kopano b.v. /// /// This program is free software: you can redistribute it and/or modify /// it under the terms of the GNU Affero General Public License, version 3, @@ -28,7 +28,7 @@ using System.Windows.Forms; namespace Acacia.ZPush { /// - /// Helper for synchronising state with ZPush servers + /// Helper for periodically synchronising state with ZPush servers /// public class ZPushSync : DisposableWrapper { @@ -85,6 +85,8 @@ namespace Acacia.ZPush public readonly bool Enabled; public readonly TimeSpan Period; + public readonly TimeSpan PeriodThrottle; + public DateTime LastSyncTime; public ZPushSync(ZPushWatcher watcher, IAddIn addIn) { @@ -93,6 +95,9 @@ namespace Acacia.ZPush Period = GlobalOptions.INSTANCE.ZPushSync_Period; if (Period.Ticks == 0) Period = Constants.ZPUSH_SYNC_DEFAULT_PERIOD; + PeriodThrottle = GlobalOptions.INSTANCE.ZPushSync_PeriodThrottle; + if (PeriodThrottle.Ticks == 0) + PeriodThrottle = Constants.ZPUSH_SYNC_DEFAULT_PERIOD_THROTTLE; // Set up a timer and events if enabled if (Enabled) @@ -174,13 +179,24 @@ namespace Acacia.ZPush #region Task execution /// - /// Executes the tasks for all known ZPush accounts + /// Executes the tasks for all known ZPush accounts. Only executed if enough time has passed since the last check. /// - private void ExecuteTasks() + private void PossiblyExecuteTasks() { + // Don't contact the network if Outlook is offline if (ThisAddIn.Instance.IsOffline) return; + // Check for time + DateTime now = DateTime.Now; + if (LastSyncTime != null && now.Subtract(LastSyncTime) < PeriodThrottle) + { + // Back off + return; + } + LastSyncTime = now; + + // Execute tasks for all accounts foreach (ZPushAccount account in _watcher.Accounts.GetAccounts()) ExecuteTasks(account); } @@ -191,6 +207,11 @@ namespace Acacia.ZPush /// private void ExecuteTasks(ZPushAccount account) { + // Don't contact the network if Outlook is offline + if (ThisAddIn.Instance.IsOffline) + return; + + // Execute the tasks for the account foreach (SyncTask task in _tasks) { Tasks.Task(task.GetInstance(account)); @@ -202,7 +223,7 @@ namespace Acacia.ZPush /// private void _timer_Tick(object sender, EventArgs e) { - ExecuteTasks(); + PossiblyExecuteTasks(); } /// @@ -225,7 +246,7 @@ namespace Acacia.ZPush if (_started) { // Explicit sync, run tasks - ExecuteTasks(); + PossiblyExecuteTasks(); } }