Bugfixes for the timeperiod feature.

This commit is contained in:
Gunnar Beutner 2013-04-16 10:12:53 +02:00
parent 9fa628af82
commit 836c26da66
5 changed files with 41 additions and 16 deletions

View File

@ -539,7 +539,7 @@ String Host::StateToString(HostState state)
}
}
bool Host::ResolveMacro(const String& macro, const Dictionary::Ptr& cr, String *result) const
bool Host::ResolveMacro(const String& macro, const Dictionary::Ptr&, String *result) const
{
if (macro == "HOSTNAME" || macro == "HOSTALIAS") {
*result = GetName();

View File

@ -21,6 +21,7 @@
#include "base/scriptfunction.h"
#include "base/convert.h"
#include "base/exception.h"
#include "base/objectlock.h"
#include "base/logger_fwd.h"
#include <boost/smart_ptr/make_shared.hpp>
#include <boost/algorithm/string/split.hpp>
@ -140,6 +141,7 @@ Array::Ptr LegacyTimePeriod::ScriptFunc(const TimePeriod::Ptr& tp, double begin,
if (ranges) {
for (int i = 0; i <= (end - begin) / (24 * 60 * 60); i++) {
ObjectLock olock(ranges);
String key;
Value value;
BOOST_FOREACH(boost::tie(key, value), ranges) {
@ -149,7 +151,7 @@ Array::Ptr LegacyTimePeriod::ScriptFunc(const TimePeriod::Ptr& tp, double begin,
ProcessTimeRanges(value, &reference, segments);
}
reference.tm_wday++;
reference.tm_mday++;
}
}

View File

@ -280,7 +280,7 @@ void Notification::OnAttributeChanged(const String& name)
Service::InvalidateNotificationsCache();
}
bool Notification::ResolveMacro(const String& macro, const Dictionary::Ptr& cr, String *result) const
bool Notification::ResolveMacro(const String& macro, const Dictionary::Ptr&, String *result) const
{
Dictionary::Ptr macros = GetMacros();

View File

@ -55,7 +55,8 @@ void TimePeriod::Start(void)
{
/* Pre-fill the time period for the next 24 hours. */
double now = Utility::GetTime();
UpdateRegion(now, now + 24 * 3600);
UpdateRegion(now, now + 24 * 3600, true);
Dump();
}
TimePeriod::Ptr TimePeriod::GetByName(const String& name)
@ -196,13 +197,15 @@ void TimePeriod::PurgeSegments(double end)
Touch("segments");
}
void TimePeriod::UpdateRegion(double begin, double end)
void TimePeriod::UpdateRegion(double begin, double end, bool clearExisting)
{
if (begin < m_ValidEnd)
begin = m_ValidEnd;
if (!clearExisting) {
if (begin < m_ValidEnd)
begin = m_ValidEnd;
if (end < m_ValidEnd)
return;
if (end < m_ValidEnd)
return;
}
TimePeriod::Ptr self = GetSelf();
@ -288,18 +291,18 @@ void TimePeriod::UpdateTimerHandler(void)
valid_end = tp->m_ValidEnd;
}
if (valid_end < now + 3 * 3600)
tp->UpdateRegion(valid_end, now + 24 * 3600);
tp->UpdateRegion(valid_end, now + 24 * 3600, false);
tp->Dump();
}
}
Array::Ptr TimePeriod::EmptyTimePeriodUpdate(const TimePeriod::Ptr tp, double begin, double end)
Array::Ptr TimePeriod::EmptyTimePeriodUpdate(const TimePeriod::Ptr&, double, double)
{
Array::Ptr segments = boost::make_shared<Array>();
return segments;
}
Array::Ptr TimePeriod::EvenMinutesTimePeriodUpdate(const TimePeriod::Ptr tp, double begin, double end)
Array::Ptr TimePeriod::EvenMinutesTimePeriodUpdate(const TimePeriod::Ptr&, double begin, double end)
{
Array::Ptr segments = boost::make_shared<Array>();
@ -315,3 +318,21 @@ Array::Ptr TimePeriod::EvenMinutesTimePeriodUpdate(const TimePeriod::Ptr tp, dou
return segments;
}
void TimePeriod::Dump(void)
{
Array::Ptr segments = m_Segments;
Log(LogDebug, "icinga", "Dumping TimePeriod '" + GetName() + "'");
if (segments) {
ObjectLock dlock(segments);
BOOST_FOREACH(const Dictionary::Ptr& segment, segments) {
Log(LogDebug, "icinga", "Segment: " +
Utility::FormatDateTime("%c", segment->Get("begin")) + " <-> " +
Utility::FormatDateTime("%c", segment->Get("end")));
}
}
Log(LogDebug, "icinga", "---");
}

View File

@ -44,13 +44,13 @@ public:
virtual void Start(void);
void UpdateRegion(double begin, double end);
void UpdateRegion(double begin, double end, bool clearExisting);
bool IsInside(double ts) const;
double FindNextTransition(double begin);
static Array::Ptr EmptyTimePeriodUpdate(const TimePeriod::Ptr tp, double begin, double end);
static Array::Ptr EvenMinutesTimePeriodUpdate(const TimePeriod::Ptr tp, double begin, double end);
static Array::Ptr EmptyTimePeriodUpdate(const TimePeriod::Ptr& tp, double begin, double end);
static Array::Ptr EvenMinutesTimePeriodUpdate(const TimePeriod::Ptr& tp, double begin, double end);
private:
Attribute<double> m_ValidBegin;
@ -62,6 +62,8 @@ private:
void RemoveSegment(double begin, double end);
void PurgeSegments(double end);
void Dump(void);
static void UpdateTimerHandler(void);
};