diff --git a/main.qml b/main.qml index 553c9521..8b7c079d 100644 --- a/main.qml +++ b/main.qml @@ -380,6 +380,9 @@ ApplicationWindow { } function startDaemon(flags){ + // Pause refresh while starting daemon + currentWallet.pauseRefresh(); + appWindow.showProcessingSplash(qsTr("Waiting for daemon to start...")) daemonManager.start(flags, persistentSettings.testnet); persistentSettings.daemonFlags = flags @@ -395,6 +398,8 @@ ApplicationWindow { daemonRunning = true; hideProcessingSplash(); currentWallet.connected(true); + // resume refresh + currentWallet.startRefresh(); } function onDaemonStopped(){ console.log("daemon stopped"); @@ -403,6 +408,19 @@ ApplicationWindow { currentWallet.connected(true); } + function onDaemonStartFailure(){ + console.log("daemon start failed"); + hideProcessingSplash(); + // resume refresh + currentWallet.startRefresh(); + daemonRunning = false; + informationPopup.title = qsTr("Daemon failed to start") + translationManager.emptyString; + informationPopup.text = qsTr("Please check your wallet and daemon log for errors. You can also try to start %1 manually.").arg((isWindows)? "monerod.exe" : "monerod") + informationPopup.icon = StandardIcon.Critical + informationPopup.onCloseCallback = null + informationPopup.open(); + } + function onWalletNewBlock(blockHeight, targetHeight) { // Update progress bar leftPanel.progressBar.updateProgress(blockHeight,targetHeight); @@ -760,6 +778,7 @@ ApplicationWindow { walletManager.walletClosed.connect(onWalletClosed); daemonManager.daemonStarted.connect(onDaemonStarted); + daemonManager.daemonStartFailure.connect(onDaemonStartFailure); daemonManager.daemonStopped.connect(onDaemonStopped); if(!walletsFound()) { diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 855058eb..47ad10cf 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -7,6 +7,11 @@ #include #include #include +#include + +namespace { + static const int DAEMON_START_TIMEOUT_SECONDS = 30; +} DaemonManager * DaemonManager::m_instance = nullptr; QStringList DaemonManager::m_clArgs; @@ -67,8 +72,11 @@ bool DaemonManager::start(const QString &flags, bool testnet) // add state changed listener connect(m_daemon,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(stateChanged(QProcess::ProcessState))); - if (!started) + if (!started) { qDebug() << "Daemon start error: " + m_daemon->errorString(); + emit daemonStartFailure(); + return false; + } // Start start watcher QFuture future = QtConcurrent::run(this, &DaemonManager::startWatcher, testnet); @@ -77,14 +85,15 @@ bool DaemonManager::start(const QString &flags, bool testnet) this, [this, watcher]() { QFuture future = watcher->future(); watcher->deleteLater(); - if(future.result()) { + if(future.result()) emit daemonStarted(); - } + else + emit daemonStartFailure(); }); watcher->setFuture(future); - return started; + return true; } bool DaemonManager::stop(bool testnet) @@ -112,12 +121,17 @@ bool DaemonManager::stop(bool testnet) bool DaemonManager::startWatcher(bool testnet) const { // Check if daemon is started every 2 seconds - while(true && !m_app_exit) { + QTime timer; + timer.restart(); + while(true && !m_app_exit && timer.elapsed() / 1000 < DAEMON_START_TIMEOUT_SECONDS ) { QThread::sleep(2); if(!running(testnet)) { qDebug() << "daemon not running. checking again in 2 seconds."; - } else + } else { + qDebug() << "daemon is started. Waiting 5 seconds to let daemon catch up"; + QThread::sleep(5); return true; + } } return false; } diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index b45b369f..428630e1 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -30,6 +30,7 @@ private: signals: void daemonStarted() const; void daemonStopped() const; + void daemonStartFailure() const; void daemonConsoleUpdated(QString message) const; public slots: