control - Correct and optimize further timer group preloading

Fix handling where the service name is empty for group members that do
not exist on dbus. In addition, further optimize processing thru group
members that are on the same service as other members and do not call
`getManagedObjects` for services that all the object paths were
retrieved.

Change-Id: I5f0b0028e7233dd7e444c66d47b6ad5ce6ae7cac
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index afeff2f..e525d10 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -623,54 +623,61 @@
 
 void Manager::addGroup(const Group& group)
 {
-    std::string service = "";
+    std::string lastServ;
+    std::vector<std::string> objMgrPaths;
     std::set<std::string> grpServices;
     for (const auto& member : group.getMembers())
     {
         try
         {
-            service = group.getService();
+            auto service = group.getService();
             if (service.empty())
             {
                 service = getService(member, group.getInterface());
             }
 
-            auto objMgrPaths =
-                getPaths(service, "org.freedesktop.DBus.ObjectManager");
-
-            // Look for the ObjectManager as an ancestor from the member.
-            auto hasObjMgr =
-                std::any_of(objMgrPaths.begin(), objMgrPaths.end(),
-                            [&member](const auto& path) {
-                                return member.find(path) != std::string::npos;
-                            });
-
-            if (!hasObjMgr)
+            if (!service.empty())
             {
-                // No object manager interface provided for group member
-                // Attempt to retrieve group member property directly
-                auto value =
-                    util::SDBusPlus::getPropertyVariant<PropertyVariantType>(
-                        _bus, service, member, group.getInterface(),
-                        group.getProperty());
-
-                setProperty(member, group.getInterface(), group.getProperty(),
-                            value);
-                continue;
-            }
-
-            if (grpServices.find(service) == grpServices.end())
-            {
-                grpServices.insert(service);
-                for (const auto& objMgrPath : objMgrPaths)
+                if (lastServ != service)
                 {
-                    // Get all managed objects from the service
-                    auto objects =
-                        util::SDBusPlus::getManagedObjects<PropertyVariantType>(
-                            _bus, service, objMgrPath);
+                    objMgrPaths =
+                        getPaths(service, "org.freedesktop.DBus.ObjectManager");
+                    lastServ = service;
+                }
 
-                    // Insert objects into cache
-                    insertFilteredObjects(objects);
+                // Look for the ObjectManager as an ancestor from the member.
+                auto hasObjMgr = std::any_of(
+                    objMgrPaths.begin(), objMgrPaths.end(),
+                    [&member](const auto& path) {
+                        return member.find(path) != std::string::npos;
+                    });
+
+                if (!hasObjMgr)
+                {
+                    // No object manager interface provided for group member
+                    // Attempt to retrieve group member property directly
+                    auto value = util::SDBusPlus::getPropertyVariant<
+                        PropertyVariantType>(_bus, service, member,
+                                             group.getInterface(),
+                                             group.getProperty());
+
+                    setProperty(member, group.getInterface(),
+                                group.getProperty(), value);
+                    continue;
+                }
+
+                if (grpServices.find(service) == grpServices.end())
+                {
+                    grpServices.insert(service);
+                    for (const auto& objMgrPath : objMgrPaths)
+                    {
+                        // Get all managed objects from the service
+                        auto objects = util::SDBusPlus::getManagedObjects<
+                            PropertyVariantType>(_bus, service, objMgrPath);
+
+                        // Insert objects into cache
+                        insertFilteredObjects(objects);
+                    }
                 }
             }
         }