private function sendPromoteToMasterMessage(AbstractServerEvent $event)
{
if ($event->DBServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) || $event->DBServer->GetFarmRoleObject()->GetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER)) {
//Checks if master already running: do not send promote_to_master
$msg = new Scalr_Messaging_Msg_DbMsr_PromoteToMaster();
$msg->tmpEventName = $event->GetName();
$msg->dbType = $event->DBServer->GetFarmRoleObject()->GetRoleObject()->getDbMsrBehavior();
$msg->cloudLocation = $event->DBServer->GetCloudLocation();
if (in_array($event->DBServer->platform, [SERVER_PLATFORMS::EC2, SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF])) {
try {
$volume = Scalr_Storage_Volume::init()->loadById($event->DBServer->GetFarmRoleObject()->GetSetting(Scalr_Db_Msr::VOLUME_ID));
$msg->volumeConfig = $volume->getConfig();
} catch (Exception $e) {
$this->Logger->error(new FarmLogMessage($event->DBServer, "Cannot create volumeConfig for PromoteToMaster message: {$e->getMessage()}"));
}
}
if ($event->DBServer->farmRoleId != 0) {
foreach (Scalr_Role_Behavior::getListForRole($event->DBServer->GetFarmRoleObject()->GetRoleObject()) as $behavior) {
$msg = $behavior->extendMessage($msg, $event->DBServer);
}
}
// Send Mysql_PromoteToMaster to the first server in the same avail zone as old master (if exists)
// Otherwise send to first in role
$platform = $event->DBServer->platform;
if ($platform == SERVER_PLATFORMS::EC2) {
$availZone = $event->DBServer->GetProperty(EC2_SERVER_PROPERTIES::AVAIL_ZONE);
}
$dbFarmRole = $event->DBServer->GetFarmRoleObject();
$servers = $dbFarmRole->GetServersByFilter(array('status' => array(SERVER_STATUS::RUNNING)));
$firstInRoleServer = false;
foreach ($servers as $DBServer) {
if ($DBServer->serverId == $event->DBServer->serverId) {
continue;
}
if (!$firstInRoleServer) {
$firstInRoleServer = $DBServer;
}
if ($platform == SERVER_PLATFORMS::EC2 && $DBServer->GetProperty(EC2_SERVER_PROPERTIES::AVAIL_ZONE) == $availZone || $platform != SERVER_PLATFORMS::EC2) {
$event->DBServer->SetProperty(Scalr_Db_Msr::REPLICATION_MASTER, 0);
$dbFarmRole->SetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER, 1);
$DBServer->SetProperty(Scalr_Db_Msr::REPLICATION_MASTER, 1);
$DBServer->SendMessage($msg, false, true);
return;
}
}
if ($firstInRoleServer) {
$dbFarmRole->SetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER, 1);
$firstInRoleServer->SetProperty(Scalr_Db_Msr::REPLICATION_MASTER, 1);
$firstInRoleServer->SendMessage($msg, false, true);
}
}
}