[pkg-nagios-changes] [Git][nagios-team/pkg-icinga2][upstream] New upstream version 2.11.2

Bas Couwenberg gitlab at salsa.debian.org
Sat Oct 26 16:14:59 BST 2019



Bas Couwenberg pushed to branch upstream at Debian Nagios Maintainer Group / pkg-icinga2


Commits:
1aeba939 by Bas Couwenberg at 2019-10-26T14:51:46Z
New upstream version 2.11.2
- - - - -


6 changed files:

- AUTHORS
- CHANGELOG.md
- VERSION
- doc/06-distributed-monitoring.md
- doc/16-upgrading-icinga-2.md
- lib/remote/apilistener-filesync.cpp


Changes:

=====================================
AUTHORS
=====================================
@@ -229,6 +229,7 @@ Yohan Jarosz <yohanjarosz at yahoo.fr>
 Zachary McGibbon <zachary.mcgibbon at gmail.com>
 Zoltan Nagy <abesto at abesto.net>
 akrus <akrus at flygroup.st>
+azthec <azthec at users.noreply.github.com>
 bascarsija <bascarsija.dev at gmail.com>
 chrostek <sebastian at chrostek.net>
 cstegm <cstegm at users.noreply.github.com>


=====================================
CHANGELOG.md
=====================================
@@ -7,6 +7,17 @@ documentation before upgrading to a new release.
 
 Released closed milestones can be found on [GitHub](https://github.com/Icinga/icinga2/milestones?state=closed).
 
+## 2.11.2 (2019-10-24)
+
+2.11.2 fixes a problem where the newly introduced config sync "check-change-then-reload" functionality
+could cause endless reload loops with agents. The most visible parts are failing command endpoint checks
+with "not connected" UNKNOWN state. **Only applies to HA enabled zones with 2 masters and/or 2 satellites.**
+
+### Bugfixes
+
+* Cluster Config Sync
+  * Config sync checksum change detection may not work within high load HA clusters #7565
+
 ## 2.11.1 (2019-10-17)
 
 This release fixes a hidden long lasting bug unveiled with 2.11 and distributed setups.


=====================================
VERSION
=====================================
@@ -1,2 +1,2 @@
-Version: 2.11.1
+Version: 2.11.2
 Revision: 1


=====================================
doc/06-distributed-monitoring.md
=====================================
@@ -2450,7 +2450,7 @@ object Zone "global-commands" {
 
 The default global zones generated by the setup wizards are called `global-templates` and `director-global`.
 
-While you can should `global-templates` for your global configuration, `director-global` is reserved for use
+While you can and should use `global-templates` for your global configuration, `director-global` is reserved for use
 by [Icinga Director](https://icinga.com/docs/director/latest/). Please don't
 place any configuration in it manually.
 


=====================================
doc/16-upgrading-icinga-2.md
=====================================
@@ -10,6 +10,29 @@ follow the instructions for v2.7 too.
 
 ## Upgrading to v2.11 <a id="upgrading-to-2-11"></a>
 
+### Bugfixes for 2.11 <a id="upgrading-to-2-11-bugfixes"></a>
+
+2.11.1 on agents/satellites fixes a problem where 2.10.x as config master would send out an unwanted config marker file,
+thus rendering the agent to think it is autoritative for the config, and never accepting any new
+config files for the zone(s). **If your config master is 2.11.x already, you are not affected by this problem.**
+
+In order to fix this, upgrade to at least 2.11.1, and purge away the local config sync storage once, then restart.
+
+```
+yum install icinga2
+
+rm -rf /var/lib/icinga2/api/zones/*
+rm -rf /var/lib/icinga2/api/zones-stage/*
+
+systemctl restart icinga2
+```
+
+2.11.2 fixes a problem where the newly introduced config sync "check-change-then-reload" functionality
+could cause endless reload loops with agents. The most visible parts are failing command endpoint checks
+with "not connected" UNKNOWN state. **Only applies to HA enabled zones with 2 masters and/or 2 satellites.**
+
+In order to fix this, upgrade all agents/satellites to at least 2.11.2 and restart them.
+
 ### Packages <a id="upgrading-to-2-11-packages"></a>
 
 EOL distributions where no packages are available with this release:


=====================================
lib/remote/apilistener-filesync.cpp
=====================================
@@ -229,6 +229,56 @@ void ApiListener::SendConfigUpdate(const JsonRpcConnection::Ptr& aclient)
 	aclient->SendMessage(message);
 }
 
+static bool CompareTimestampsConfigChange(const Dictionary::Ptr& productionConfig, const Dictionary::Ptr& receivedConfig,
+	const String& stageConfigZoneDir)
+{
+	double productionTimestamp;
+	double receivedTimestamp;
+
+	// Missing production timestamp means that something really broke. Always trigger a config change then.
+	if (!productionConfig->Contains("/.timestamp"))
+		productionTimestamp = 0;
+	else
+		productionTimestamp = productionConfig->Get("/.timestamp");
+
+	// Missing received config timestamp means that something really broke. Always trigger a config change then.
+	if (!receivedConfig->Contains("/.timestamp"))
+		receivedTimestamp = Utility::GetTime() + 10;
+	else
+		receivedTimestamp = receivedConfig->Get("/.timestamp");
+
+	bool configChange;
+
+	// Skip update if our configuration files are more recent.
+	if (productionTimestamp >= receivedTimestamp) {
+
+		Log(LogInformation, "ApiListener")
+			<< "Our production configuration is more recent than the received configuration update."
+			<< " Ignoring configuration file update for path '" << stageConfigZoneDir << "'. Current timestamp '"
+			<< Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", productionTimestamp) << "' ("
+			<< std::fixed << std::setprecision(6) << productionTimestamp
+			<< ") >= received timestamp '"
+			<< Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", receivedTimestamp) << "' ("
+			<< receivedTimestamp << ").";
+
+		configChange = false;
+
+	} else {
+		configChange = true;
+	}
+
+	// Update the .timestamp file inside the staging directory.
+	String tsPath = stageConfigZoneDir + "/.timestamp";
+
+	if (!Utility::PathExists(tsPath)) {
+		std::ofstream fp(tsPath.CStr(), std::ofstream::out | std::ostream::trunc);
+		fp << std::fixed << receivedTimestamp;
+		fp.close();
+	}
+
+	return configChange;
+}
+
 /**
  * Registered handler when a new config::Update message is received.
  *
@@ -360,11 +410,13 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
 		if (checksums) {
 			Log(LogInformation, "ApiListener")
 				<< "Received configuration for zone '" << zoneName << "' from endpoint '"
-				<< fromEndpointName << "'. Comparing the checksums.";
+				<< fromEndpointName << "'. Comparing the timestamp and checksums.";
 
-			// TODO: Do this earlier in hello-handshakes?
-			if (CheckConfigChange(productionConfigInfo, newConfigInfo))
-				configChange = true;
+			if (CompareTimestampsConfigChange(productionConfig, newConfig, stageConfigZoneDir)) {
+
+				if (CheckConfigChange(productionConfigInfo, newConfigInfo))
+					configChange = true;
+			}
 
 		} else {
 			/* Fallback to timestamp handling when the parent endpoint didn't send checks.
@@ -377,33 +429,7 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
 				<< "Received configuration update without checksums from parent endpoint "
 				<< fromEndpointName << ". This behaviour is deprecated. Please upgrade the parent endpoint to 2.11+";
 
-			double productionTimestamp;
-
-			if (!productionConfig->Contains("/.timestamp"))
-				productionTimestamp = 0;
-			else
-				productionTimestamp = productionConfig->Get("/.timestamp");
-
-			double newTimestamp;
-
-			if (!newConfig->Contains("/.timestamp"))
-				newTimestamp = Utility::GetTime();
-			else
-				newTimestamp = newConfig->Get("/.timestamp");
-
-			// Skip update if our configuration files are more recent.
-			if (productionTimestamp >= newTimestamp) {
-
-				Log(LogInformation, "ApiListener")
-					<< "Our configuration is more recent than the received configuration update."
-					<< " Ignoring configuration file update for path '" << stageConfigZoneDir << "'. Current timestamp '"
-					<< Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", productionTimestamp) << "' ("
-					<< std::fixed << std::setprecision(6) << productionTimestamp
-					<< ") >= received timestamp '"
-					<< Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", newTimestamp) << "' ("
-					<< newTimestamp << ").";
-
-			} else {
+			if (CompareTimestampsConfigChange(productionConfig, newConfig, stageConfigZoneDir)) {
 				configChange = true;
 			}
 
@@ -420,14 +446,6 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
 					}
 				}
 			}
-
-			// Update the .timestamp file.
-			String tsPath = stageConfigZoneDir + "/.timestamp";
-			if (!Utility::PathExists(tsPath)) {
-				std::ofstream fp(tsPath.CStr(), std::ofstream::out | std::ostream::trunc);
-				fp << std::fixed << newTimestamp;
-				fp.close();
-			}
 		}
 
 		// Dump the received configuration for this zone into the stage directory.
@@ -507,7 +525,7 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
 	} else {
 		Log(LogInformation, "ApiListener")
 			<< "Received configuration updates (" << count << ") from endpoint '" << fromEndpointName
-			<< "' are equal to production, not triggering reload.";
+			<< "' do not qualify for production, not triggering reload.";
 	}
 
 	return Empty;



View it on GitLab: https://salsa.debian.org/nagios-team/pkg-icinga2/commit/1aeba939aba83fc8f96279d3a976801a6ab39f00

-- 
View it on GitLab: https://salsa.debian.org/nagios-team/pkg-icinga2/commit/1aeba939aba83fc8f96279d3a976801a6ab39f00
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-nagios-changes/attachments/20191026/6c46d9ab/attachment-0001.html>


More information about the pkg-nagios-changes mailing list