Added placeholders for event persistance handling.

This commit is contained in:
Gunnar Beutner 2012-04-19 12:16:52 +02:00
parent 2cd43ed8c6
commit c11231f4e7
6 changed files with 45 additions and 11 deletions

View File

@ -9,7 +9,7 @@ int delegate_fwd(int (TObject::*function)(TArgs), weak_ptr<TObject> wref, const
{
shared_ptr<TObject> ref = wref.lock();
if (ref.get() == NULL)
if (!ref)
return -1;
return (ref.get()->*function)(args);

View File

@ -201,7 +201,7 @@ int ConfigRpcComponent::RemoteObjectRemovedHandler(const NewRequestEventArgs& ea
ConfigHive::Ptr configHive = GetIcingaApplication()->GetConfigHive();
ConfigObject::Ptr object = configHive->GetObject(type, name);
if (object.get() == NULL)
if (!object)
return 0;
configHive->RemoveObject(object);

View File

@ -4,10 +4,10 @@ using namespace icinga;
EndpointManager::Ptr Endpoint::GetEndpointManager(void) const
{
return m_EndpointManager;
return m_EndpointManager.lock();
}
void Endpoint::SetEndpointManager(EndpointManager::Ptr manager)
void Endpoint::SetEndpointManager(EndpointManager::WeakPtr manager)
{
m_EndpointManager = manager;
}
@ -61,3 +61,23 @@ void Endpoint::ForeachMethodSource(function<int (const NewMethodEventArgs&)> cal
callback(nmea);
}
}
void Endpoint::ClearMethodSinks(void)
{
m_MethodSinks.clear();
}
void Endpoint::ClearMethodSources(void)
{
m_MethodSources.clear();
}
int Endpoint::CountMethodSinks(void) const
{
return m_MethodSinks.size();
}
int Endpoint::CountMethodSources(void) const
{
return m_MethodSources.size();
}

View File

@ -17,14 +17,14 @@ private:
set<string> m_MethodSinks;
set<string> m_MethodSources;
shared_ptr<EndpointManager> m_EndpointManager;
weak_ptr<EndpointManager> m_EndpointManager;
public:
typedef shared_ptr<Endpoint> Ptr;
typedef weak_ptr<Endpoint> WeakPtr;
shared_ptr<EndpointManager> GetEndpointManager(void) const;
void SetEndpointManager(shared_ptr<EndpointManager> manager);
void SetEndpointManager(weak_ptr<EndpointManager> manager);
void RegisterMethodSink(string method);
void UnregisterMethodSink(string method);
@ -44,6 +44,12 @@ public:
void ForeachMethodSink(function<int (const NewMethodEventArgs&)> callback);
void ForeachMethodSource(function<int (const NewMethodEventArgs&)> callback);
void ClearMethodSinks(void);
void ClearMethodSources(void);
int CountMethodSinks(void) const;
int CountMethodSources(void) const;
};
}

View File

@ -32,7 +32,7 @@ bool JsonRpcEndpoint::IsLocal(void) const
bool JsonRpcEndpoint::IsConnected(void) const
{
return (m_Client.get() != NULL);
return m_Client;
}
void JsonRpcEndpoint::ProcessRequest(Endpoint::Ptr sender, const JsonRpcRequest& message)
@ -44,6 +44,8 @@ void JsonRpcEndpoint::ProcessRequest(Endpoint::Ptr sender, const JsonRpcRequest&
m_PendingCalls[id] = sender;
m_Client->SendMessage(message);
} else {
// TODO: persist the event
}
}
@ -94,8 +96,6 @@ int JsonRpcEndpoint::ClientClosedHandler(const EventArgs& ea)
{
m_PendingCalls.clear();
// TODO: clear method sources/sinks
if (m_Client->GetPeerHost() != string()) {
Timer::Ptr timer = make_shared<Timer>();
timer->SetInterval(30);
@ -105,6 +105,14 @@ int JsonRpcEndpoint::ClientClosedHandler(const EventArgs& ea)
m_ReconnectTimer = timer;
}
// TODO: _only_ clear non-persistent method sources/sinks
// unregister ourselves if no persistent sources/sinks are left (use a timer for that, once we have a TTL property for the methods)
ClearMethodSinks();
ClearMethodSources();
if (CountMethodSinks() == 0)
GetEndpointManager()->UnregisterEndpoint(static_pointer_cast<Endpoint>(shared_from_this()));
m_Client.reset();
// TODO: persist events, etc., for now we just disable the endpoint
@ -124,7 +132,7 @@ int JsonRpcEndpoint::ClientReconnectHandler(const TimerEventArgs& ea)
JsonRpcClient::Ptr client = static_pointer_cast<JsonRpcClient>(ea.UserArgs.Source);
Timer::Ptr timer = static_pointer_cast<Timer>(ea.Source);
m_Client = client;
GetEndpointManager()->AddConnection(client->GetPeerHost(), client->GetPeerPort());
timer->Stop();
m_ReconnectTimer.reset();

View File

@ -47,7 +47,7 @@ json_t *Netstring::GetJsonFromDictionary(const Dictionary::Ptr& dictionary)
case VariantObject:
valueDictionary = dynamic_pointer_cast<Dictionary>(i->second.GetObject());
if (valueDictionary.get() != NULL)
if (valueDictionary)
cJSON_AddItemToObject(json, i->first.c_str(), GetJsonFromDictionary(valueDictionary));
default:
break;