Scalr\Observer\MessagingEventObserver::sendPromoteToMasterMessage PHP Метод

sendPromoteToMasterMessage() приватный Метод

private sendPromoteToMasterMessage ( AbstractServerEvent $event )
$event AbstractServerEvent
    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);
            }
        }
    }