]> granicus.if.org Git - icinga2/commitdiff
cluster: Periodically clean up old log files.
authorGunnar Beutner <gunnar.beutner@netways.de>
Tue, 3 Sep 2013 13:23:47 +0000 (15:23 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Tue, 3 Sep 2013 13:23:47 +0000 (15:23 +0200)
components/cluster/clustercomponent.cpp
lib/icinga/notification.cpp

index 0cc8e87d10372bbb596d03da5cc20eadb694aad8..84b3bac5cfee73b42ffe6305871466d08ec21236 100644 (file)
@@ -29,6 +29,7 @@
 #include "base/convert.h"
 #include <boost/smart_ptr/make_shared.hpp>
 #include <fstream>
+#include <boost/exception/diagnostic_information.hpp>
 
 using namespace icinga;
 
@@ -312,9 +313,7 @@ void ClusterComponent::ReplayLog(const Endpoint::Ptr& endpoint, const Stream::Pt
        std::sort(files.begin(), files.end());
 
        BOOST_FOREACH(int ts, files) {
-               std::ostringstream msgbuf;
-               msgbuf << GetClusterDir() << ts;
-               String path = msgbuf.str();
+               String path = GetClusterDir() + Convert::ToString(ts);
 
                if (ts < endpoint->GetLocalLogPosition())
                        continue;
@@ -424,8 +423,38 @@ void ClusterComponent::ClusterTimerHandler(void)
                        continue;
                }
 
-               Log(LogInformation, "cluster", "Attempting to reconnect to cluster endpoint '" + endpoint->GetName() + "' via '" + host + ":" + port + "'.");
-               AddConnection(host, port);
+               try {
+                       Log(LogInformation, "cluster", "Attempting to reconnect to cluster endpoint '" + endpoint->GetName() + "' via '" + host + ":" + port + "'.");
+                       AddConnection(host, port);
+               } catch (std::exception& ex) {
+                       std::ostringstream msgbuf;
+                       msgbuf << "Exception occured while reconnecting to endpoint '"
+                              << endpoint->GetName() << "': " << boost::diagnostic_information(ex);
+                       Log(LogWarning, "cluster", msgbuf.str());
+               }
+       }
+
+       std::vector<int> files;
+       Utility::Glob(GetClusterDir() + "*", boost::bind(&ClusterComponent::LogGlobHandler, boost::ref(files), _1));
+       std::sort(files.begin(), files.end());
+
+       BOOST_FOREACH(int ts, files) {
+               bool need = false;
+
+               BOOST_FOREACH(const Endpoint::Ptr& endpoint, DynamicType::GetObjects<Endpoint>()) {
+                       double position = endpoint->GetLocalLogPosition();
+
+                       if (position != 0 && ts > position) {
+                               need = true;
+                               break;
+                       }
+               }
+
+               if (!need) {
+                       String path = GetClusterDir() + Convert::ToString(ts);
+                       Log(LogInformation, "cluster", "Removing old log file: " + path);
+                       (void) unlink(path.CStr());
+               }
        }
 }
 
index 5077f6031aa003ce501fa97456032b60c6864f94..0f68171e96e69e9cbc95d6174526a59a640b251c 100644 (file)
@@ -348,9 +348,7 @@ void Notification::ExecuteNotificationHelper(NotificationType type, const User::
                std::ostringstream msgbuf;
                msgbuf << "Exception occured during notification for service '"
                       << GetService()->GetName() << "': " << boost::diagnostic_information(ex);
-               String message = msgbuf.str();
-
-               Log(LogWarning, "icinga", message);
+               Log(LogWarning, "icinga", msgbuf.str());
        }
 }