From 996cd8e8119ac1a6045086d006c365a94b464203 Mon Sep 17 00:00:00 2001 From: xiphon Date: Mon, 2 Sep 2019 21:34:01 +0000 Subject: [PATCH] SimpleMode: automatic public nodes discovering and switching --- js/Utils.js | 4 --- main.qml | 51 ++++++++++++++++++++++++++++-------- src/daemon/DaemonManager.cpp | 19 +++++++++++--- src/daemon/DaemonManager.h | 4 ++- 4 files changed, 58 insertions(+), 20 deletions(-) diff --git a/js/Utils.js b/js/Utils.js index 6ed5b3eb99..96786650ee 100644 --- a/js/Utils.js +++ b/js/Utils.js @@ -94,10 +94,6 @@ function netTypeToString(){ return nettype == 1 ? qsTr("Testnet") : nettype == 2 ? qsTr("Stagenet") : qsTr("Mainnet"); } -function randomChoice(arr){ - return arr[Math.floor(Math.random() * arr.length)]; -} - function epoch(){ return Math.floor((new Date).getTime()/1000); } diff --git a/main.qml b/main.qml index 34e73d1e36..b9a1c4fb06 100644 --- a/main.qml +++ b/main.qml @@ -692,7 +692,8 @@ ApplicationWindow { simpleModeConnectionTimer.stop(); appWindow.showProcessingSplash(qsTr("Waiting for daemon to start...")) - daemonManager.start(flags, persistentSettings.nettype, persistentSettings.blockchainDataDir, persistentSettings.bootstrapNodeAddress); + const noSync = appWindow.walletMode === 0; + daemonManager.start(flags, persistentSettings.nettype, persistentSettings.blockchainDataDir, persistentSettings.bootstrapNodeAddress, noSync); persistentSettings.daemonFlags = flags } @@ -2008,21 +2009,39 @@ ApplicationWindow { onTriggered: appWindow.themeTransition = true; } + function haveToChangeDaemonNoSyncFlag() { + if (!appWindow.daemonRunning) { + return false; + } + if (appWindow.walletMode == 0 && !daemonManager.noSync()) { + return true; + } + if (appWindow.walletMode == 1 && daemonManager.noSync()) { + return true; + } + return false; + } + function checkSimpleModeConnection(){ // auto-connection mechanism for simple mode - if(persistentSettings.nettype != NetworkType.MAINNET) return; if(appWindow.walletMode >= 2) return; var disconnected = leftPanel.networkStatus.connected === Wallet.ConnectionStatus_Disconnected; var disconnectedEpoch = appWindow.disconnectedEpoch; + + const disconnectedTimeoutSec = 30; + const firstCheckDelaySec = 2; if(disconnectedEpoch === 0){ - appWindow.disconnectedEpoch = Utils.epoch(); + appWindow.disconnectedEpoch = Utils.epoch() + firstCheckDelaySec - disconnectedTimeoutSec; } - // disconnected longer than 5 seconds? - if(disconnected && disconnectedEpoch > 0 && (Utils.epoch() - disconnectedEpoch) >= 5){ - // for bootstrap mode, first wait until daemon is killed - if(appWindow.walletMode === 1 && appWindow.daemonRunning) { + if (haveToChangeDaemonNoSyncFlag()) { + appWindow.stopDaemon(); + } + + // disconnected longer than N seconds? + if(disconnected && disconnectedEpoch > 0 && (Utils.epoch() - disconnectedEpoch) >= disconnectedTimeoutSec){ + if(appWindow.daemonRunning) { appWindow.stopDaemon(); return; } @@ -2110,7 +2129,12 @@ ApplicationWindow { closeAccepted(); }; - confirmationDialog.open() + if (appWindow.walletMode == 0) { + stopDaemon(); + closeAccepted(); + } else { + confirmationDialog.open(); + } } else { closeAccepted(); @@ -2222,11 +2246,16 @@ ApplicationWindow { } function changeWalletMode(mode){ + appWindow.disconnectedEpoch = 0; appWindow.walletMode = mode; persistentSettings.walletMode = mode; - persistentSettings.useRemoteNode = mode === 0 ? true : false; - if (mode < 2 && (middlePanel.settingsView.settingsStateViewState === "Node" || middlePanel.settingsView.settingsStateViewState === "Log")) { - middlePanel.settingsView.settingsStateViewState = "Wallet" + if (mode < 2) { + persistentSettings.useRemoteNode = false; + persistentSettings.bootstrapNodeAddress = "auto"; + + if (middlePanel.settingsView.settingsStateViewState === "Node" || middlePanel.settingsView.settingsStateViewState === "Log") { + middlePanel.settingsView.settingsStateViewState = "Wallet" + } } console.log("walletMode changed: " + (mode === 0 ? "simple": mode === 1 ? "simple (bootstrap)" : "Advanced")); } diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 4277e0bb7a..29a7086d69 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -61,7 +61,7 @@ DaemonManager *DaemonManager::instance(const QStringList *args) return m_instance; } -bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const QString &dataDir, const QString &bootstrapNodeAddress) +bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const QString &dataDir, const QString &bootstrapNodeAddress, bool noSync /* = false*/) { // prepare command line arguments and pass to monerod QStringList arguments; @@ -99,6 +99,10 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const arguments << "--bootstrap-daemon-address" << bootstrapNodeAddress; } + if (noSync) { + arguments << "--no-sync"; + } + arguments << "--check-updates" << "disabled"; // --max-concurrency based on threads available. max: 6 @@ -131,11 +135,13 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const } // Start start watcher - m_scheduler.run([this, nettype] { - if (startWatcher(nettype)) + m_scheduler.run([this, nettype, noSync] { + if (startWatcher(nettype)) { emit daemonStarted(); - else + m_noSync = noSync; + } else { emit daemonStartFailure(); + } }); return true; @@ -244,6 +250,11 @@ bool DaemonManager::running(NetworkType::Type nettype) const return false; } +bool DaemonManager::noSync() const noexcept +{ + return m_noSync; +} + void DaemonManager::runningAsync(NetworkType::Type nettype, const QJSValue& callback) const { m_scheduler.run([this, nettype] { diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 5a29ea64c5..0df97c6320 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -44,9 +44,10 @@ class DaemonManager : public QObject static DaemonManager * instance(const QStringList *args); - Q_INVOKABLE bool start(const QString &flags, NetworkType::Type nettype, const QString &dataDir = "", const QString &bootstrapNodeAddress = ""); + Q_INVOKABLE bool start(const QString &flags, NetworkType::Type nettype, const QString &dataDir = "", const QString &bootstrapNodeAddress = "", bool noSync = false); Q_INVOKABLE bool stop(NetworkType::Type nettype); + Q_INVOKABLE bool noSync() const noexcept; // return true if daemon process is started Q_INVOKABLE void runningAsync(NetworkType::Type nettype, const QJSValue& callback) const; // Send daemon command from qml and prints output in console window. @@ -82,6 +83,7 @@ public slots: QString m_monerod; bool m_has_daemon = true; bool m_app_exit = false; + bool m_noSync = false; mutable FutureScheduler m_scheduler; };