Move server disk space threshold setting to private Server-class

The setting can be read and written simultaneously and is protected with
a mutex.

The public SERVER-class is now abstract.
This commit is contained in:
Esa Korhonen
2018-12-10 16:51:35 +02:00
parent 7cf73e0f13
commit 2b0eac2cd0
6 changed files with 77 additions and 43 deletions

View File

@ -103,8 +103,9 @@ static uint64_t server_encode_version(const SERVER_VERSION* server_version)
* the name of a protocol module that is loaded to implement the protocol
* between the gateway and the server.
*/
struct SERVER
class SERVER
{
public:
// Base settings
char* name; /**< Server config name */
char address[MAX_SERVER_ADDRESS_LEN]; /**< Server hostname/IP-address */
@ -151,7 +152,31 @@ struct SERVER
* used
* by rwsplit. TODO: Move to rwsplit */
bool warn_ssl_not_enabled;/**< SSL not used for an SSL enabled server */
MxsDiskSpaceThreshold* disk_space_threshold;/**< Disk space thresholds */
virtual ~SERVER()
{
}
/**
* Check if server has disk space threshold settings.
*
* @return True if limits exist
*/
virtual bool have_disk_space_limits() const = 0;
/**
* Get a copy of disk space limit settings.
*
* @return A copy of settings
*/
virtual MxsDiskSpaceThreshold get_disk_space_limits() const = 0;
/**
* Set new disk space limits for the server.
*
* @param new_limits New limits
*/
virtual void set_disk_space_limits(const MxsDiskSpaceThreshold& new_limits) = 0;
};
/**

View File

@ -36,6 +36,10 @@ public:
{
}
~Server() override
{
}
int response_time_num_samples() const
{
return m_response_time.num_samples();
@ -51,10 +55,35 @@ public:
static void dprintServer(DCB*, const Server*);
static void dprintPersistentDCBs(DCB*, const Server*);
bool have_disk_space_limits() const override
{
std::lock_guard<std::mutex> guard(m_settings.lock);
return !m_settings.disk_space_limits.empty();
}
MxsDiskSpaceThreshold get_disk_space_limits() const override
{
std::lock_guard<std::mutex> guard(m_settings.lock);
return m_settings.disk_space_limits;
}
void set_disk_space_limits(const MxsDiskSpaceThreshold& new_limits) override
{
std::lock_guard<std::mutex> guard(m_settings.lock);
m_settings.disk_space_limits = new_limits;
}
mutable std::mutex m_lock;
private:
maxbase::EMAverage m_response_time;
struct Settings
{
mutable std::mutex lock; /**< Protects array-like settings from concurrent access */
MxsDiskSpaceThreshold disk_space_limits; /**< Disk space thresholds */
};
maxbase::EMAverage m_response_time; /**< Response time calculations for this server */
Settings m_settings; /**< Server settings */
};
void server_free(Server* server);

View File

@ -2623,12 +2623,11 @@ bool MonitorInstance::should_update_disk_space_status(const MXS_MONITORED_SERVER
{
bool should_check = false;
if (m_monitor->disk_space_check_interval
&& (m_monitor->disk_space_threshold || pMs->server->disk_space_threshold)
&& (pMs->disk_space_checked != -1)) // -1 means disabled
if ((m_monitor->disk_space_check_interval > 0)
&& (pMs->disk_space_checked != -1) // -1 means disabled
&& (m_monitor->disk_space_threshold || pMs->server->have_disk_space_limits()))
{
int64_t now = get_time_ms();
if (now - pMs->disk_space_checked > m_monitor->disk_space_check_interval)
{
should_check = true;
@ -2674,21 +2673,21 @@ void MonitorInstance::update_disk_space_status(MXS_MONITORED_SERVER* pMs)
if (rv == 0)
{
// Server-specific setting takes precedence.
MxsDiskSpaceThreshold dst = pMs->server->get_disk_space_limits();
if (dst.empty())
{
dst = *m_monitor->disk_space_threshold;
}
bool disk_space_exhausted = false;
MxsDiskSpaceThreshold* pDst =
pMs->server->disk_space_threshold ?
pMs->server->disk_space_threshold : m_monitor->disk_space_threshold;
mxb_assert(pDst);
int32_t star_max_percentage = -1;
std::set<std::string> checked_paths;
for (auto i = pDst->begin(); i != pDst->end(); ++i)
for (const auto& dst_item : dst)
{
string path = i->first;
int32_t max_percentage = i->second;
string path = dst_item.first;
int32_t max_percentage = dst_item.second;
if (path == "*")
{

View File

@ -182,7 +182,6 @@ SERVER* server_alloc(const char* name, MXS_CONFIG_PARAMETER* params)
server->master_id = -1;
server->master_err_is_logged = false;
server->warn_ssl_not_enabled = true;
server->disk_space_threshold = NULL;
if (*monuser && *monpw)
{
@ -236,7 +235,6 @@ void server_free(Server* server)
MXS_FREE(server->persistent);
}
delete server->disk_space_threshold;
delete server;
}
@ -1513,29 +1511,12 @@ json_t* server_list_to_json(const char* host)
bool server_set_disk_space_threshold(SERVER* server, const char* disk_space_threshold)
{
bool rv = false;
MxsDiskSpaceThreshold dst;
rv = config_parse_disk_space_threshold(&dst, disk_space_threshold);
bool rv = config_parse_disk_space_threshold(&dst, disk_space_threshold);
if (rv)
{
if (!server->disk_space_threshold)
{
server->disk_space_threshold = new(std::nothrow) MxsDiskSpaceThreshold;
}
if (server->disk_space_threshold)
{
server->disk_space_threshold->swap(dst);
}
else
{
rv = false;
}
server->set_disk_space_limits(dst);
}
return rv;
}

View File

@ -16,6 +16,7 @@
#include <iostream>
#include <maxscale/config.hh>
#include <maxscale/mysql_utils.hh>
#include "../internal/server.hh"
using namespace std;
@ -78,9 +79,7 @@ int test(bool success, const char* zHost, const char* zUser, const char* zPasswo
MXS_CONFIG* config = config_get_global_options();
config->local_address = const_cast<char*>(zAddress);
SERVER server;
memset(&server, 0, sizeof(server));
Server server;
strcpy(server.address, zHost);
server.port = 3306;

View File

@ -15,12 +15,13 @@
#include <algorithm>
#include <iostream>
#include <numeric>
#include <set>
#include <string>
#include <vector>
#include <maxbase/log.hh>
#include <maxbase/maxbase.hh>
#include <maxscale/alloc.h>
#include <set>
#include "../../../../core/internal/server.hh"
using std::string;
using std::cout;
@ -155,7 +156,7 @@ void MariaDBMonitor::Test::init_servers(int count)
for (int i = 1; i < count + 1; i++)
{
SERVER* base_server = new SERVER; // Contents mostly undefined
auto base_server = new Server; // Contents mostly undefined
string server_name = create_servername(i);
base_server->name = MXS_STRDUP(server_name.c_str());