public function OnBeforeHostTerminate(\BeforeHostTerminateEvent $event)
{
try {
$dbFarm = DBFarm::LoadByID($this->FarmID);
} catch (Exception $e) {
}
if ($dbFarm) {
$servers = $this->DB->Execute("\n SELECT * FROM servers\n WHERE farm_id = ?\n AND status IN (?, ?, ?, ?)\n AND is_scalarized = '1'\n ", [$dbFarm->ID, SERVER_STATUS::INIT, SERVER_STATUS::RUNNING, SERVER_STATUS::PENDING_TERMINATE, SERVER_STATUS::PENDING_SUSPEND]);
$event->messageLongestInsert = 0;
while ($server = $servers->FetchRow()) {
$DBServer = DBServer::load($server);
// We don't need to send beforeHostTerminate event to all "Pending terminate" servers,
// only to eventServer.
// Same for terminated farms
if ($DBServer->status == SERVER_STATUS::PENDING_TERMINATE || $dbFarm->Status == FARM_STATUS::TERMINATED) {
if ($DBServer->serverId != $event->DBServer->serverId) {
continue;
}
}
$msg = new Scalr_Messaging_Msg_BeforeHostTerminate();
$msg->setServerMetaData($event->DBServer);
$msg->suspend = $event->suspend;
$msg = Scalr_Scripting_Manager::extendMessage($msg, $event, $event->DBServer, $DBServer);
if ($event->DBServer->farmRoleId != 0) {
foreach (Scalr_Role_Behavior::getListForFarmRole($event->DBServer->GetFarmRoleObject()) as $behavior) {
$msg = $behavior->extendMessage($msg, $event->DBServer);
}
}
$mt = microtime(true);
$DBServer->SendMessage($msg, false, true);
$mtResult = microtime(true) - $mt;
if ($event->messageLongestInsert < $mtResult) {
$event->messageLongestInsert = $mtResult;
}
}
try {
if ($event->DBServer->GetFarmRoleObject()->GetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER) != 1) {
if ($event->DBServer->GetFarmRoleObject()->GetRoleObject()->getDbMsrBehavior()) {
$this->sendPromoteToMasterMessage($event);
}
}
} catch (Exception $e) {
}
}
}