From: Gunnar Beutner Date: Sun, 18 May 2014 07:15:27 +0000 (+0200) Subject: Parallellize restoring objects from the state file. X-Git-Tag: v2.0.0-beta1~95 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7310a254e8f11cdb13cffc7d284c570e68e068eb;p=icinga2 Parallellize restoring objects from the state file. Fixes #6226 --- diff --git a/lib/base/dynamicobject.cpp b/lib/base/dynamicobject.cpp index deec32b38..fa262e327 100644 --- a/lib/base/dynamicobject.cpp +++ b/lib/base/dynamicobject.cpp @@ -29,6 +29,7 @@ #include "base/scriptfunction.h" #include "base/initialize.h" #include "base/scriptvariable.h" +#include "base/workqueue.h" #include #include #include @@ -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()); diff --git a/lib/base/dynamicobject.h b/lib/base/dynamicobject.h index 5b47a8dfb..f59a989af 100644 --- a/lib/base/dynamicobject.h +++ b/lib/base/dynamicobject.h @@ -125,6 +125,7 @@ private: std::map m_Privileges; static DynamicObject::Ptr GetObject(const String& type, const String& name); + static void RestoreObject(const String& message, int attributeTypes); }; #define DECLARE_TYPENAME(klass) \