summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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