#include "configfile.h"
#include <QSettings>
+#include <QTimer>
#include <qfontmetrics.h>
namespace OCC {
, _state(AccountState::Disconnected)
, _connectionStatus(ConnectionValidator::Undefined)
, _waitingForNewCredentials(false)
+ , _maintenanceToConnectedDelay(60000 + (qrand() % (4 * 60000))) // 1-5min delay
{
qRegisterMetaType<AccountState *>("AccountState*");
return;
}
+ // Come online gradually from 503 or maintenance mode
+ if (status == ConnectionValidator::Connected
+ && (_connectionStatus == ConnectionValidator::ServiceUnavailable
+ || _connectionStatus == ConnectionValidator::MaintenanceMode)) {
+ if (!_timeSinceMaintenanceOver.isValid()) {
+ qCInfo(lcAccountState) << "AccountState reconnection: delaying for"
+ << _maintenanceToConnectedDelay << "ms";
+ _timeSinceMaintenanceOver.start();
+ QTimer::singleShot(_maintenanceToConnectedDelay + 100, this, SLOT(checkConnectivity()));
+ return;
+ } else if (_timeSinceMaintenanceOver.elapsed() < _maintenanceToConnectedDelay) {
+ qCInfo(lcAccountState) << "AccountState reconnection: only"
+ << _timeSinceMaintenanceOver.elapsed() << "ms have passed";
+ return;
+ }
+ }
+
if (_connectionStatus != status) {
qCInfo(lcAccountState) << "AccountState connection status change: "
<< connectionStatusString(_connectionStatus) << "->"
setState(SignedOut);
break;
case ConnectionValidator::ServiceUnavailable:
+ _timeSinceMaintenanceOver.invalidate();
setState(ServiceUnavailable);
break;
case ConnectionValidator::MaintenanceMode:
+ _timeSinceMaintenanceOver.invalidate();
setState(MaintenanceMode);
break;
case ConnectionValidator::Timeout:
bool isConnected() const;
- /// Triggers a ping to the server to update state and
- /// connection status and errors.
- void checkConnectivity();
-
/** Returns a new settings object for this account, already in the right groups. */
std::unique_ptr<QSettings> settings();
*/
void tagLastSuccessfullETagRequest();
+public slots:
+ /// Triggers a ping to the server to update state and
+ /// connection status and errors.
+ void checkConnectivity();
+
private:
void setState(State state);
bool _waitingForNewCredentials;
QElapsedTimer _timeSinceLastETagCheck;
QPointer<ConnectionValidator> _connectionValidator;
+
+ /**
+ * Starts counting when the server starts being back up after 503 or
+ * maintenance mode. The account will only become connected once this
+ * timer exceeds the _maintenanceToConnectedDelay value.
+ */
+ QElapsedTimer _timeSinceMaintenanceOver;
+
+ /**
+ * Milliseconds for which to delay reconnection after 503/maintenance.
+ */
+ int _maintenanceToConnectedDelay;
};
}