From e16284935dc097747bf6e74dff5b22219f8c2abb Mon Sep 17 00:00:00 2001 From: "William A. Kennington III" Date: Fri, 11 May 2018 16:17:28 -0700 Subject: watchdog: Retry dbus requests if the service was cached Right now if the phosphor-watchdog gets restarted, the first ipmi request querying it will fail and return all the way back up to the ipmi client. In this case, it would be nicer for the client if we retried the request once before reporting a failure. Resolves openbmc/phosphor-host-ipmid#111 Change-Id: I73fce5431911279f9c2e4389d32b671ed60c2305 Signed-off-by: William A. Kennington III --- app/watchdog_service.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'app') diff --git a/app/watchdog_service.cpp b/app/watchdog_service.cpp index d3fa3ad..cf386b8 100644 --- a/app/watchdog_service.cpp +++ b/app/watchdog_service.cpp @@ -25,12 +25,18 @@ WatchdogService::WatchdogService() WatchdogService::Properties WatchdogService::getProperties() { + bool wasValid = wd_service.isValid(bus); auto request = wd_service.newMethodCall(bus, prop_intf, "GetAll"); request.append(wd_intf); auto response = bus.call(request); if (response.is_method_error()) { wd_service.invalidate(); + if (wasValid) + { + // Retry the request once in case the cached service was stale + return getProperties(); + } throw std::runtime_error("Failed to get watchdog properties"); } @@ -49,12 +55,18 @@ WatchdogService::Properties WatchdogService::getProperties() template void WatchdogService::setProperty(const std::string& key, const T& val) { + bool wasValid = wd_service.isValid(bus); auto request = wd_service.newMethodCall(bus, prop_intf, "Set"); request.append(wd_intf, key, variant(val)); auto response = bus.call(request); if (response.is_method_error()) { wd_service.invalidate(); + if (wasValid) + { + // Retry the request once in case the cached service was stale + return setProperty(key, val); + } throw std::runtime_error(std::string("Failed to set property: ") + key); } } -- cgit v1.2.1