Fix low disk space maintenance
The setting didn't work because the code updated a status flag which would be overwritten before being read. Also, promotion code now checks that the server is not in maintenance.
This commit is contained in:
@ -875,3 +875,18 @@ void MariaDBMonitor::update_topology()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MariaDBMonitor::set_low_disk_slaves_maintenance()
|
||||||
|
{
|
||||||
|
// Only set pure slave and standalone servers to maintenance.
|
||||||
|
for (MariaDBServer* server : m_servers)
|
||||||
|
{
|
||||||
|
if (server->is_low_on_disk_space() && server->is_usable()
|
||||||
|
&& !server->is_master() && !server->is_relay_master())
|
||||||
|
{
|
||||||
|
// TODO: Handle relays somehow, e.g. switch with a slave
|
||||||
|
MXS_WARNING("Setting %s to maintenance because it is low on disk space.", server->name());
|
||||||
|
server->set_status(SERVER_MAINT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1676,20 +1676,6 @@ void MariaDBMonitor::enforce_read_only_on_slaves()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MariaDBMonitor::set_low_disk_slaves_maintenance()
|
|
||||||
{
|
|
||||||
// Only set pure slave and standalone servers to maintenance.
|
|
||||||
for (MariaDBServer* server : m_servers)
|
|
||||||
{
|
|
||||||
if (server->has_status(SERVER_DISK_SPACE_EXHAUSTED) && server->is_usable()
|
|
||||||
&& !server->is_master() && !server->is_relay_master())
|
|
||||||
{
|
|
||||||
server->set_status(SERVER_MAINT);
|
|
||||||
m_cluster_modified = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MariaDBMonitor::handle_low_disk_space_master()
|
void MariaDBMonitor::handle_low_disk_space_master()
|
||||||
{
|
{
|
||||||
if (m_master && m_master->is_master() && m_master->is_low_on_disk_space())
|
if (m_master && m_master->is_master() && m_master->is_low_on_disk_space())
|
||||||
|
@ -460,6 +460,13 @@ void MariaDBMonitor::tick()
|
|||||||
update_external_master();
|
update_external_master();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set low disk space slaves to maintenance. This needs to happen after roles have been assigned.
|
||||||
|
* Is not a real cluster operation, since nothing on the actual backends is changed. */
|
||||||
|
if (m_maintenance_on_low_disk_space)
|
||||||
|
{
|
||||||
|
set_low_disk_slaves_maintenance();
|
||||||
|
}
|
||||||
|
|
||||||
// Sanity check. Master may not be both slave and master.
|
// Sanity check. Master may not be both slave and master.
|
||||||
mxb_assert(m_master == NULL || !m_master->has_status(SERVER_SLAVE | SERVER_MASTER));
|
mxb_assert(m_master == NULL || !m_master->has_status(SERVER_SLAVE | SERVER_MASTER));
|
||||||
|
|
||||||
@ -532,13 +539,6 @@ void MariaDBMonitor::process_state_changes()
|
|||||||
enforce_read_only_on_slaves();
|
enforce_read_only_on_slaves();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set low disk space slaves to maintenance.
|
|
||||||
*/
|
|
||||||
if (m_maintenance_on_low_disk_space && !m_cluster_modified)
|
|
||||||
{
|
|
||||||
set_low_disk_slaves_maintenance();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if the master server is on low disk space and act on it. */
|
/* Check if the master server is on low disk space and act on it. */
|
||||||
if (m_switchover_on_low_disk_space && !m_cluster_modified)
|
if (m_switchover_on_low_disk_space && !m_cluster_modified)
|
||||||
{
|
{
|
||||||
|
@ -1121,9 +1121,8 @@ bool MariaDBServer::can_be_demoted_failover(string* reason_out)
|
|||||||
return demotable;
|
return demotable;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MariaDBServer::can_be_promoted(OperationType op,
|
bool MariaDBServer::can_be_promoted(OperationType op, const MariaDBServer* demotion_target,
|
||||||
const MariaDBServer* demotion_target,
|
string* reason_out)
|
||||||
std::string* reason_out)
|
|
||||||
{
|
{
|
||||||
bool promotable = false;
|
bool promotable = false;
|
||||||
string reason;
|
string reason;
|
||||||
@ -1134,6 +1133,10 @@ bool MariaDBServer::can_be_promoted(OperationType op,
|
|||||||
{
|
{
|
||||||
reason = "it is already the master.";
|
reason = "it is already the master.";
|
||||||
}
|
}
|
||||||
|
else if (!is_usable())
|
||||||
|
{
|
||||||
|
reason = "it is down or in maintenance.";
|
||||||
|
}
|
||||||
else if (sstatus == NULL)
|
else if (sstatus == NULL)
|
||||||
{
|
{
|
||||||
reason = string_printf("it is not replicating from '%s'.", demotion_target->name());
|
reason = string_printf("it is not replicating from '%s'.", demotion_target->name());
|
||||||
|
Reference in New Issue
Block a user