]> granicus.if.org Git - icinga2/commitdiff
Re-delegate services after config changes.
authorGunnar Beutner <gunnar@beutner.name>
Wed, 27 Jun 2012 08:59:08 +0000 (10:59 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 27 Jun 2012 08:59:08 +0000 (10:59 +0200)
base/socket.cpp
base/socket.h
components/delegation/delegationcomponent.cpp
components/delegation/delegationcomponent.h

index 756255d63ef783b3ab2d89b6dc7f54f53525285d..97b46c049195dac740f29fbf33a97bfcf4bfff74 100644 (file)
@@ -317,6 +317,9 @@ void Socket::ReadThreadProc(void)
 
                lock.lock();
 
+               if (GetFD() == INVALID_SOCKET)
+                       return;
+
                if (rc < 0) {
                        HandleSocketError(SocketException("select() failed", GetError()));
                        return;
@@ -362,6 +365,9 @@ void Socket::WriteThreadProc(void)
 
                lock.lock();
 
+               if (GetFD() == INVALID_SOCKET)
+                       return;
+
                if (rc < 0) {
                        HandleSocketError(SocketException("select() failed", GetError()));
                        return;
index c499e5c4a5e4e070e5dbf8084e9f78067813e204..7878a8ddb61c16acac65e16d63d9ed55cce1664d 100644 (file)
@@ -33,21 +33,12 @@ public:
        typedef shared_ptr<Socket> Ptr;
        typedef weak_ptr<Socket> WeakPtr;
 
-       //typedef list<Socket::WeakPtr> CollectionType;
-
-       //static Socket::CollectionType Sockets;
-
        ~Socket(void);
 
-       //boost::signal<void (const Socket::Ptr&)> OnReadable;
-       //boost::signal<void (const Socket::Ptr&)> OnWritable;
-       //boost::signal<void (const Socket::Ptr&)> OnException;
-
        boost::signal<void (const Socket::Ptr&, const std::exception&)> OnError;
        boost::signal<void (const Socket::Ptr&)> OnClosed;
 
        virtual void Start(void);
-       //virtual void Stop(void);
 
        void Close(void);
 
index 6e763419d051c337146a0648dd9fe3130858359f..95dad7f9f2f21a3807b8bebb6a0199e627cda71d 100644 (file)
@@ -30,6 +30,7 @@ string DelegationComponent::GetName(void) const
 void DelegationComponent::Start(void)
 {
        m_AllServices = boost::make_shared<ConfigObject::Set>(ConfigObject::GetAllObjects(), ConfigObject::MakeTypePredicate("service"));
+       m_AllServices->OnObjectCommitted.connect(boost::bind(&DelegationComponent::ObjectCommittedHandler, this, _2));
        m_AllServices->Start();
 
        m_DelegationTimer = boost::make_shared<Timer>();
@@ -55,6 +56,14 @@ void DelegationComponent::Stop(void)
                mgr->UnregisterEndpoint(m_DelegationEndpoint);
 }
 
+void DelegationComponent::ObjectCommittedHandler(const ConfigObject::Ptr& object)
+{
+       Service service(object);
+
+       /* object was updated, clear its checker to make sure it's re-delegated by the delegation timer */
+       service.SetChecker("");
+}
+
 void DelegationComponent::AssignService(const Endpoint::Ptr& checker, const Service& service)
 {
        RequestMessage request;
index dea7ce26c814bc8f95da28b742787c87ec383564..65e573e4402df9467e28029ed848223bbb550875 100644 (file)
@@ -41,6 +41,7 @@ private:
        void NewEndpointHandler(const Endpoint::Ptr& endpoint);
        void SessionEstablishedHandler(const Endpoint::Ptr& endpoint);
 
+       void ObjectCommittedHandler(const ConfigObject::Ptr& object);
        void DelegationTimerHandler(void);
 
        vector<Endpoint::Ptr> GetCheckerCandidates(const Service& service) const;