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();
}
}