summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam A. Kennington III <wak@google.com>2018-05-11 16:17:28 -0700
committerRaptor Engineering Development Team <support@raptorengineering.com>2018-05-12 21:20:42 -0500
commit8018f3b9ee6ba2b7b29a6137751e435d41bc571f (patch)
tree642ac991bd1ca1c583fd3176f5c02adb4799b274
parent54fa13068e049ac8fe866ad2d96f89f1623c6645 (diff)
downloadphosphor-host-ipmid-8018f3b9ee6ba2b7b29a6137751e435d41bc571f.tar.gz
phosphor-host-ipmid-8018f3b9ee6ba2b7b29a6137751e435d41bc571f.zip
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 <wak@google.com>
-rw-r--r--app/watchdog_service.cpp12
1 files changed, 12 insertions, 0 deletions
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 <typename T>
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<T>(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);
}
}
OpenPOWER on IntegriCloud