Compat IDO: serialize dumps (refs #3257)

- dump config once, protect it from status dumps
- send process start to ido2db to allow deletion of inactive objects
This commit is contained in:
Michael Friedrich 2012-10-07 23:45:55 +02:00
parent 19faa2a755
commit 208cceaf27
2 changed files with 78 additions and 16 deletions

View File

@ -80,6 +80,24 @@ int CompatIdoComponent::GetReconnectInterval(void) const
return interval; return interval;
} }
/**
* Sets config dump in progress state
*/
void CompatIdoComponent::SetConfigDumpInProgress(bool state)
{
m_ConfigDumpInProgress = state;
}
/**
* Get state of config in progress
*
* @returns state bis config dump in progress.
*/
bool CompatIdoComponent::GetConfigDumpInProgress(void)
{
return m_ConfigDumpInProgress;
}
/** /**
* Starts the component. * Starts the component.
*/ */
@ -100,12 +118,20 @@ void CompatIdoComponent::Start(void)
*/ */
OpenIdoSocket(); OpenIdoSocket();
/* /*
* full config dump at startup, wait for it * tell ido2db that we just started
*/ */
Logger::Write(LogInformation, "compatido", "Writing compat ido config information"); SendStartProcess();
/*
* ddump the config later (can't do that within start of the component)
*/
m_ConfigTimer = boost::make_shared<Timer>();
m_ConfigTimer->SetInterval(ConfigTimerInterval);
m_ConfigTimer->OnTimerExpired.connect(boost::bind(&CompatIdoComponent::ConfigTimerHandler, this));
m_ConfigTimer->Start();
m_ConfigTimer->Reschedule(0);
DumpConfigObjects();
/* /*
* initialize timers * initialize timers
@ -114,18 +140,6 @@ void CompatIdoComponent::Start(void)
m_StatusTimer->SetInterval(StatusTimerInterval); m_StatusTimer->SetInterval(StatusTimerInterval);
m_StatusTimer->OnTimerExpired.connect(boost::bind(&CompatIdoComponent::StatusTimerHandler, this)); m_StatusTimer->OnTimerExpired.connect(boost::bind(&CompatIdoComponent::StatusTimerHandler, this));
m_StatusTimer->Start(); m_StatusTimer->Start();
m_StatusTimer->Reschedule(0);
/*
* do not dump configs in intervals, only on startup
* TODO trigger dynaamic config updates later
*/
/*
m_ConfigTimer = boost::make_shared<Timer>();
m_ConfigTimer->SetInterval(ConfigTimerInterval);
m_ConfigTimer->OnTimerExpired.connect(boost::bind(&CompatIdoComponent::ConfigTimerHandler, this));
m_ConfigTimer->Start();
*/
/* /*
* do not dummp that asynchronous * do not dummp that asynchronous
@ -211,7 +225,10 @@ void CompatIdoComponent::ConfigTimerHandler(void)
{ {
Logger::Write(LogInformation, "compatido", "Writing compat ido config information"); Logger::Write(LogInformation, "compatido", "Writing compat ido config information");
/* protect the dump of status update messages */
SetConfigDumpInProgress(true);
DumpConfigObjects(); DumpConfigObjects();
SetConfigDumpInProgress(false);
} }
/** /**
@ -219,6 +236,10 @@ void CompatIdoComponent::ConfigTimerHandler(void)
*/ */
void CompatIdoComponent::ProgramStatusTimerHandler(void) void CompatIdoComponent::ProgramStatusTimerHandler(void)
{ {
/* do not dump any data if config dump is still in progress */
if(GetConfigDumpInProgress())
return;
Logger::Write(LogInformation, "compatido", "Writing compat ido program status information"); Logger::Write(LogInformation, "compatido", "Writing compat ido program status information");
DumpProgramStatusData(); DumpProgramStatusData();
@ -309,6 +330,31 @@ void CompatIdoComponent::CloseSink(void)
m_IdoSocket->Close(); m_IdoSocket->Close();
} }
/**
* tell ido2db that we are starting up (must be called before config dump)
*/
void CompatIdoComponent::SendStartProcess(void)
{
/* TODO */
#define PROGRAM_MODIFICATION_DATE "10-17-2012"
stringstream message;
message << "\n"
<< 200 << "\n" /* processdata */
<< 1 << "=" << 104 << "\n" /* type = pprocess prelaunch */
<< 2 << "=" << "" << "\n" /* flags */
<< 3 << "=" << "" << "\n" /* attributes */
<< 4 << "=" << std::setprecision(17) << Utility::GetTime() << "\n" /* timestamp */
<< 105 << "=" << "Icinga2" << "\n" /* progranname */
<< 107 << "=" << VERSION << "\n" /* programversion */
<< 104 << "=" << PROGRAM_MODIFICATION_DATE << "\n" /* programdata */
<< 102 << "=" << Utility::GetPid() << "\n" /* process id */
<< 999 << "\n\n"; /* enddata */
m_IdoSocket->SendMessage(message.str());
}
/** /**
* sends config dump start signal to ido * sends config dump start signal to ido
*/ */
@ -413,6 +459,11 @@ void CompatIdoComponent::DisableServiceObject(const Service::Ptr& service)
*/ */
void CompatIdoComponent::DumpHostObject(const Host::Ptr& host) void CompatIdoComponent::DumpHostObject(const Host::Ptr& host)
{ {
//FIXME DEBUG only
stringstream log;
log << "Dumping Host Config: " << host->GetName();
Logger::Write(LogInformation, "compatido", log.str());
stringstream message; stringstream message;
message << "\n" message << "\n"
<< 400 << ":" << "\n" /* hostdefinition */ << 400 << ":" << "\n" /* hostdefinition */
@ -565,6 +616,11 @@ void CompatIdoComponent::DumpHostStatus(const Host::Ptr& host)
*/ */
void CompatIdoComponent::DumpServiceObject(const Service::Ptr& service) void CompatIdoComponent::DumpServiceObject(const Service::Ptr& service)
{ {
//FIXME DEBUG only
stringstream log;
log << "Dumping Service Config: " << service->GetHost()->GetName() << "->" << service->GetAlias();
Logger::Write(LogInformation, "compatido", log.str());
stringstream message; stringstream message;
message << "\n" message << "\n"
<< 402 << ":" << "\n" /* servicedefinition */ << 402 << ":" << "\n" /* servicedefinition */

View File

@ -40,11 +40,16 @@ private:
IdoSocket::Ptr m_IdoSocket; IdoSocket::Ptr m_IdoSocket;
bool m_ConfigDumpInProgress;
String GetSocketAddress(void) const; String GetSocketAddress(void) const;
String GetSocketPort(void) const; String GetSocketPort(void) const;
String GetInstanceName(void) const; String GetInstanceName(void) const;
int GetReconnectInterval(void) const; int GetReconnectInterval(void) const;
void SetConfigDumpInProgress(bool state);
bool GetConfigDumpInProgress(void);
void ConfigTimerHandler(void); void ConfigTimerHandler(void);
void StatusTimerHandler(void); void StatusTimerHandler(void);
void ProgramStatusTimerHandler(void); void ProgramStatusTimerHandler(void);
@ -57,6 +62,7 @@ private:
void SendHello(String instancename); void SendHello(String instancename);
void GoodByeSink(void); void GoodByeSink(void);
void CloseSink(void); void CloseSink(void);
void SendStartProcess(void);
void StartConfigDump(void); void StartConfigDump(void);
void EndConfigDump(void); void EndConfigDump(void);