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>
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::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 @@
 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);
     }
 }