]> granicus.if.org Git - icinga2/commitdiff
Refactor scheduling stuff from *CheckTask into the checker component
authorGunnar Beutner <gunnar@beutner.name>
Tue, 22 Jan 2013 08:33:57 +0000 (09:33 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Tue, 22 Jan 2013 08:40:37 +0000 (09:40 +0100)
Fixes #3067

components/checker/checkercomponent.cpp
components/checker/checkercomponent.h
lib/icinga/nullchecktask.cpp
lib/icinga/pluginchecktask.cpp
lib/icinga/pluginchecktask.h

index 744349b94ddfda43af01238be6a72e3d982337ff..8160ab600b513947fd729bad1cbe069c982a49b2 100644 (file)
@@ -64,7 +64,9 @@ void CheckerComponent::CheckTimerHandler(void)
                CheckTimeView::iterator it = idx.begin();
                Service::Ptr service = *it;
 
-               if (service->GetNextCheck() > now)
+               double next_check = service->GetNextCheck();
+
+               if (next_check > now)
                        break;
 
                idx.erase(it);
@@ -85,10 +87,15 @@ void CheckerComponent::CheckTimerHandler(void)
 
                m_PendingServices.insert(service);
 
+               /* keep track of scheduling info in case the check type doesn't provide its own information */
+               Dictionary::Ptr scheduleInfo = boost::make_shared<Dictionary>();
+               scheduleInfo->Set("schedule_start", next_check);
+               scheduleInfo->Set("execution_start", Utility::GetTime());
+
                vector<Value> arguments;
                arguments.push_back(service);
                ScriptTask::Ptr task;
-               task = service->InvokeMethod("check", arguments, boost::bind(&CheckerComponent::CheckCompletedHandler, this, service, _1));
+               task = service->InvokeMethod("check", arguments, boost::bind(&CheckerComponent::CheckCompletedHandler, this, service, scheduleInfo, _1));
                assert(task); /* TODO: gracefully handle missing methods */
 
                service->Set("current_task", task);
@@ -111,16 +118,31 @@ void CheckerComponent::CheckTimerHandler(void)
        }
 }
 
-void CheckerComponent::CheckCompletedHandler(const Service::Ptr& service, const ScriptTask::Ptr& task)
+void CheckerComponent::CheckCompletedHandler(const Service::Ptr& service, const Dictionary::Ptr& scheduleInfo, const ScriptTask::Ptr& task)
 {
        service->Set("current_task", Empty);
 
+       scheduleInfo->Set("execution_end", Utility::GetTime());
+       scheduleInfo->Set("schedule_end", Utility::GetTime());
+
        try {
                Value vresult = task->GetResult();
 
                if (vresult.IsObjectType<Dictionary>()) {
                        Dictionary::Ptr result = vresult;
 
+                       if (!result->Contains("schedule_start"))
+                               result->Set("schedule_start", scheduleInfo->Get("schedule_start"));
+
+                       if (!result->Contains("schedule_end"))
+                               result->Set("schedule_end", scheduleInfo->Get("schedule_end"));
+
+                       if (!result->Contains("execution_start"))
+                               result->Set("execution_start", scheduleInfo->Get("execution_start"));
+
+                       if (!result->Contains("execution_end"))
+                               result->Set("execution_end", scheduleInfo->Get("execution_end"));
+
                        service->ApplyCheckResult(result);
 
                        RequestMessage rm;
index 98a4ea92b16b820e423c3fe3096593fe8ce116f1..2d12b31da12077d5eb6522bdff7f49c928370b56 100644 (file)
@@ -69,7 +69,7 @@ private:
        void CheckTimerHandler(void);
        void ResultTimerHandler(void);
 
-       void CheckCompletedHandler(const Service::Ptr& service, const ScriptTask::Ptr& task);
+       void CheckCompletedHandler(const Service::Ptr& service, const Dictionary::Ptr& scheduleInfo, const ScriptTask::Ptr& task);
 
        void AdjustCheckTimer(void);
 
index 9d6e92c2ab36dbabf25e472445f45bb4a344b4ef..5481baa94a198e76c48e160d1f119ab4719eb11c 100644 (file)
@@ -31,10 +31,6 @@ void NullCheckTask::ScriptFunc(const ScriptTask::Ptr& task, const vector<Value>&
        double now = Utility::GetTime();
 
        Dictionary::Ptr cr = boost::make_shared<Dictionary>();
-       cr->Set("schedule_start", now);
-       cr->Set("schedule_end", now);
-       cr->Set("execution_start", now);
-       cr->Set("execution_end", now);
        cr->Set("state", StateUnknown);
 
        task->FinishResult(cr);
index e2ca0d1bb92d5e2c5401a6cc4ddd203cfb227291..c00650cf79d77e2a51ade1e92cb26c594c5dc7e9 100644 (file)
@@ -50,9 +50,6 @@ void PluginCheckTask::ScriptFunc(const ScriptTask::Ptr& task, const vector<Value
 
        PluginCheckTask ct(task, process);
 
-       ct.m_Result = boost::make_shared<Dictionary>();
-       ct.m_Result->Set("schedule_start", Utility::GetTime());
-
        process->Start(boost::bind(&PluginCheckTask::ProcessFinishedHandler, ct));
 }
 
@@ -67,12 +64,13 @@ void PluginCheckTask::ProcessFinishedHandler(PluginCheckTask ct)
                return;
        }
 
-       ct.m_Result->Set("execution_start", pr.ExecutionStart);
-       ct.m_Result->Set("execution_end", pr.ExecutionEnd);
+       Dictionary::Ptr result = boost::make_shared<Dictionary>();
+       result->Set("execution_start", pr.ExecutionStart);
+       result->Set("execution_end", pr.ExecutionEnd);
 
        String output = pr.Output;
        output.Trim();
-       ProcessCheckOutput(ct.m_Result, output);
+       ProcessCheckOutput(result, output);
 
        ServiceState state;
 
@@ -91,11 +89,9 @@ void PluginCheckTask::ProcessFinishedHandler(PluginCheckTask ct)
                        break;
        }
 
-       ct.m_Result->Set("state", state);
-
-       ct.m_Result->Set("schedule_end", Utility::GetTime());
+       result->Set("state", state);
 
-       ct.m_Task->FinishResult(ct.m_Result);
+       ct.m_Task->FinishResult(result);
 }
 
 void PluginCheckTask::ProcessCheckOutput(const Dictionary::Ptr& result, String& output)
index b5b46e028e151acfbd27980bbf24f94d21287c4e..a8bc2846d4907f274ebefacdbead216543051673 100644 (file)
@@ -42,7 +42,6 @@ private:
 
        ScriptTask::Ptr m_Task;
        Process::Ptr m_Process;
-       Dictionary::Ptr m_Result;
 };
 
 }