diff --git a/libs/linglong/src/linglong/cli/cli.cpp b/libs/linglong/src/linglong/cli/cli.cpp index 5b791c436..b75db9cdc 100644 --- a/libs/linglong/src/linglong/cli/cli.cpp +++ b/libs/linglong/src/linglong/cli/cli.cpp @@ -127,14 +127,29 @@ Result waitForDBusPeerReady(const QString &service, { LINGLONG_TRACE("wait for dbus peer ready"); - auto peer = linglong::api::dbus::v1::DBusPeer(service, path, connection); - auto reply = peer.Ping(); - reply.waitForFinished(); - if (!reply.isValid()) { - return LINGLONG_ERR(reply.error().message().toStdString()); - } + using namespace std::chrono_literals; - return LINGLONG_OK; + constexpr auto perCallTimeout = 5s; + constexpr auto retryInterval = 1s; + constexpr auto totalDeadline = 90s; + + const auto startedAt = std::chrono::steady_clock::now(); + while (true) { + auto peer = linglong::api::dbus::v1::DBusPeer(service, path, connection); + peer.setTimeout(static_cast(std::chrono::milliseconds(perCallTimeout).count())); + + auto reply = peer.Ping(); + reply.waitForFinished(); + if (reply.isValid()) { + return LINGLONG_OK; + } + + if (std::chrono::steady_clock::now() - startedAt >= totalDeadline) { + return LINGLONG_ERR(reply.error().message().toStdString()); + } + + std::this_thread::sleep_for(retryInterval); + } } std::vector getAutoModuleList() noexcept @@ -967,7 +982,10 @@ Cli::initializeDBusPackageManager() "/org/deepin/linglong/PackageManager1", pkgManConn); if (!peerReady) { - return LINGLONG_ERR("Failed to activate org.deepin.linglong.PackageManager1", peerReady); + return LINGLONG_ERR("Failed to activate org.deepin.linglong.PackageManager1; check the " + "daemon with 'systemctl status org.deepin.linglong.PackageManager' and " + "'journalctl -u org.deepin.linglong.PackageManager -e'", + peerReady); } return std::make_unique("org.deepin.linglong.PackageManager1",