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:23 -0500
commitb8ed337ad57a278bc099bc9d5e3c819ffdeab5c1 (patch)
tree4493eb54905dd11fd58cb2ebeacfe982289f26a9
parent91875f7749c21f336fc02c957609cb8a24e940b6 (diff)
downloadphosphor-host-ipmid-b8ed337ad57a278bc099bc9d5e3c819ffdeab5c1.tar.gz
phosphor-host-ipmid-b8ed337ad57a278bc099bc9d5e3c819ffdeab5c1.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