+
+ // Quit the poller once every hour
+ if (time() > ($starttime + 3600))
+ return;
+ }
+
+}
+
+/**
+ * @brief Checks if the number of database connections has reached a critical limit.
+ *
+ * @return bool Are more than 3/4 of the maximum connections used?
+ */
+function poller_max_connections_reached() {
+
+ // Fetch the max value from the config. This is needed when the system cannot detect the correct value by itself.
+ $max = get_config("system", "max_connections");
+
+ if ($max == 0) {
+ // the maximum number of possible user connections can be a system variable
+ $r = q("SHOW VARIABLES WHERE `variable_name` = 'max_user_connections'");
+ if ($r)
+ $max = $r[0]["Value"];
+
+ // Or it can be granted. This overrides the system variable
+ $r = q("SHOW GRANTS");
+ if ($r)
+ foreach ($r AS $grants) {
+ $grant = array_pop($grants);
+ if (stristr($grant, "GRANT USAGE ON"))
+ if (preg_match("/WITH MAX_USER_CONNECTIONS (\d*)/", $grant, $match))
+ $max = $match[1];
+ }
+ }
+
+ // If $max is set we will use the processlist to determine the current number of connections
+ // The processlist only shows entries of the current user
+ if ($max != 0) {
+ $r = q("SHOW PROCESSLIST");
+ if (!$r)
+ return false;
+
+ $used = count($r);
+
+ logger("Connection usage (user values): ".$used."/".$max, LOGGER_DEBUG);
+
+ $level = $used / $max;
+
+ if ($level >= (3/4)) {
+ logger("Maximum level (3/4) of user connections reached: ".$used."/".$max);
+ return true;
+ }