diff --git a/include/maxscale/monitor.h b/include/maxscale/monitor.h index f65f6d183..eece36a96 100644 --- a/include/maxscale/monitor.h +++ b/include/maxscale/monitor.h @@ -267,6 +267,7 @@ struct mxs_monitor uint32_t script_timeout; /**< Timeout in seconds for the monitor scripts */ uint8_t journal_hash[SHA_DIGEST_LENGTH]; /**< SHA1 hash of the latest written journal */ MxsDiskSpaceThreshold* disk_space_threshold; /**< Disk space thresholds */ + int64_t disk_space_check_interval; /**< How often should a disk space check be made at most. */ struct mxs_monitor *next; /**< Next monitor in the linked list */ }; @@ -307,14 +308,15 @@ static const char MXS_MONITOR_EVENT_DEFAULT_VALUE[] = "master_down,master_up,sla * Monitor configuration parameters names */ extern const char CN_BACKEND_CONNECT_ATTEMPTS[]; +extern const char CN_BACKEND_CONNECT_TIMEOUT[]; extern const char CN_BACKEND_READ_TIMEOUT[]; extern const char CN_BACKEND_WRITE_TIMEOUT[]; -extern const char CN_BACKEND_CONNECT_TIMEOUT[]; -extern const char CN_MONITOR_INTERVAL[]; -extern const char CN_JOURNAL_MAX_AGE[]; -extern const char CN_SCRIPT_TIMEOUT[]; -extern const char CN_SCRIPT[]; +extern const char CN_DISK_SPACE_CHECK_INTERVAL[]; extern const char CN_EVENTS[]; +extern const char CN_JOURNAL_MAX_AGE[]; +extern const char CN_MONITOR_INTERVAL[]; +extern const char CN_SCRIPT[]; +extern const char CN_SCRIPT_TIMEOUT[]; bool check_monitor_permissions(MXS_MONITOR* monitor, const char* query); diff --git a/server/core/config.cc b/server/core/config.cc index 453ed71de..6d9244e9a 100644 --- a/server/core/config.cc +++ b/server/core/config.cc @@ -285,6 +285,7 @@ const char *config_monitor_params[] = CN_BACKEND_WRITE_TIMEOUT, CN_BACKEND_CONNECT_ATTEMPTS, CN_DISK_SPACE_THRESHOLD, + CN_DISK_SPACE_CHECK_INTERVAL, NULL }; @@ -3373,8 +3374,8 @@ int create_new_server(CONFIG_CONTEXT *obj) } } - const char* disk_space_threshold = config_get_value_string(obj->parameters, CN_DISK_SPACE_THRESHOLD); - if (*disk_space_threshold) + const char* disk_space_threshold = config_get_value(obj->parameters, CN_DISK_SPACE_THRESHOLD); + if (disk_space_threshold) { if (!server_set_disk_space_threshold(server, disk_space_threshold)) { @@ -3665,8 +3666,8 @@ int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, HASHTABLE* } } - const char* disk_space_threshold = config_get_value_string(obj->parameters, CN_DISK_SPACE_THRESHOLD); - if (*disk_space_threshold) + const char* disk_space_threshold = config_get_value(obj->parameters, CN_DISK_SPACE_THRESHOLD); + if (disk_space_threshold) { if (!monitor_set_disk_space_threshold(monitor, disk_space_threshold)) { @@ -3676,6 +3677,24 @@ int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, HASHTABLE* } } + const char* disk_space_check_interval = + config_get_value(obj->parameters, CN_DISK_SPACE_CHECK_INTERVAL); + if (disk_space_check_interval) + { + char* endptr; + long int value = strtoll(disk_space_check_interval, &endptr, 0); + if (*endptr == 0 && value >= 0) + { + monitor->disk_space_check_interval = value; + } + else + { + MXS_ERROR("Invalid value for '%s': %s", + CN_DISK_SPACE_CHECK_INTERVAL, disk_space_check_interval); + ++error_count; + } + } + if (servers) { /* get the servers to monitor */ diff --git a/server/core/monitor.cc b/server/core/monitor.cc index 2216e4d95..c37d10611 100644 --- a/server/core/monitor.cc +++ b/server/core/monitor.cc @@ -65,15 +65,16 @@ enum stored_value_type using std::string; using std::set; -const char CN_BACKEND_CONNECT_ATTEMPTS[] = "backend_connect_attempts"; -const char CN_BACKEND_READ_TIMEOUT[] = "backend_read_timeout"; -const char CN_BACKEND_WRITE_TIMEOUT[] = "backend_write_timeout"; -const char CN_BACKEND_CONNECT_TIMEOUT[] = "backend_connect_timeout"; -const char CN_MONITOR_INTERVAL[] = "monitor_interval"; -const char CN_JOURNAL_MAX_AGE[] = "journal_max_age"; -const char CN_SCRIPT_TIMEOUT[] = "script_timeout"; -const char CN_SCRIPT[] = "script"; -const char CN_EVENTS[] = "events"; +const char CN_BACKEND_CONNECT_ATTEMPTS[] = "backend_connect_attempts"; +const char CN_BACKEND_CONNECT_TIMEOUT[] = "backend_connect_timeout"; +const char CN_BACKEND_READ_TIMEOUT[] = "backend_read_timeout"; +const char CN_BACKEND_WRITE_TIMEOUT[] = "backend_write_timeout"; +const char CN_DISK_SPACE_CHECK_INTERVAL[] = "disk_space_check_interval"; +const char CN_EVENTS[] = "events"; +const char CN_JOURNAL_MAX_AGE[] = "journal_max_age"; +const char CN_MONITOR_INTERVAL[] = "monitor_interval"; +const char CN_SCRIPT[] = "script"; +const char CN_SCRIPT_TIMEOUT[] = "script_timeout"; static MXS_MONITOR *allMonitors = NULL; static SPINLOCK monLock = SPINLOCK_INIT; @@ -138,6 +139,7 @@ MXS_MONITOR* monitor_create(const char *name, const char *module) mon->server_pending_changes = false; memset(mon->journal_hash, 0, sizeof(mon->journal_hash)); mon->disk_space_threshold = NULL; + mon->disk_space_check_interval = 0; spinlock_init(&mon->lock); if ((mon->instance = mon->api->createInstance(mon)) == NULL)