]> granicus.if.org Git - icinga2/commitdiff
Parallellize restoring objects from the state file.
authorGunnar Beutner <gunnar@beutner.name>
Sun, 18 May 2014 07:15:27 +0000 (09:15 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Sun, 18 May 2014 07:20:23 +0000 (09:20 +0200)
Fixes #6226

lib/base/dynamicobject.cpp
lib/base/dynamicobject.h

index deec32b383efc5f509a6edba53c0a40774f21859..fa262e3276dda94050dfba572a58df877921c1a4 100644 (file)
@@ -29,6 +29,7 @@
 #include "base/scriptfunction.h"
 #include "base/initialize.h"
 #include "base/scriptvariable.h"
+#include "base/workqueue.h"
 #include <fstream>
 #include <boost/foreach.hpp>
 #include <boost/exception/errinfo_api_function.hpp>
@@ -277,6 +278,33 @@ void DynamicObject::DumpObjects(const String& filename, int attributeTypes)
        }
 }
 
+void DynamicObject::RestoreObject(const String& message, int attributeTypes)
+{
+       Dictionary::Ptr persistentObject = JsonDeserialize(message);
+
+       String type = persistentObject->Get("type");
+
+       DynamicType::Ptr dt = DynamicType::GetByName(type);
+
+       if (!dt)
+               return;
+
+       String name = persistentObject->Get("name");
+
+       DynamicObject::Ptr object = dt->GetObject(name);
+
+       if (!object)
+               return;
+
+       ASSERT(!object->IsActive());
+#ifdef _DEBUG
+       Log(LogDebug, "base", "Restoring object '" + name + "' of type '" + type + "'.");
+#endif /* _DEBUG */
+       Dictionary::Ptr update = persistentObject->Get("update");
+       Deserialize(object, update, false, attributeTypes);
+       object->OnStateLoaded();
+}
+
 void DynamicObject::RestoreObjects(const String& filename, int attributeTypes)
 {
        Log(LogInformation, "base", "Restoring program state from file '" + filename + "'");
@@ -288,35 +316,18 @@ void DynamicObject::RestoreObjects(const String& filename, int attributeTypes)
 
        unsigned long restored = 0;
 
+       ParallelWorkQueue upq;
+
        String message;
        while (NetString::ReadStringFromStream(sfp, &message)) {
-               Dictionary::Ptr persistentObject = JsonDeserialize(message);
-
-               String type = persistentObject->Get("type");
-               String name = persistentObject->Get("name");
-               Dictionary::Ptr update = persistentObject->Get("update");
-
-               DynamicType::Ptr dt = DynamicType::GetByName(type);
-
-               if (!dt)
-                       continue;
-
-               DynamicObject::Ptr object = dt->GetObject(name);
-
-               if (object) {
-                       ASSERT(!object->IsActive());
-#ifdef _DEBUG
-                       Log(LogDebug, "base", "Restoring object '" + name + "' of type '" + type + "'.");
-#endif /* _DEBUG */
-                       Deserialize(object, update, false, attributeTypes);
-                       object->OnStateLoaded();
-               }
-
+               upq.Enqueue(boost::bind(&DynamicObject::RestoreObject, message, attributeTypes));
                restored++;
        }
 
        sfp->Close();
 
+       upq.Join();
+
        std::ostringstream msgbuf;
        msgbuf << "Restored " << restored << " objects";
        Log(LogInformation, "base", msgbuf.str());
index 5b47a8dfbf37a4f0616680a341a18091106dcd24..f59a989af7a3c8d2a744aa723cffae8c465d498d 100644 (file)
@@ -125,6 +125,7 @@ private:
        std::map<String, int> m_Privileges;
 
        static DynamicObject::Ptr GetObject(const String& type, const String& name);
+       static void RestoreObject(const String& message, int attributeTypes);
 };
 
 #define DECLARE_TYPENAME(klass)                                                \