public function OnBeforeHostTerminate(\BeforeHostTerminateEvent $event)
{
try {
$dbFarm = \DBFarm::LoadByID($this->FarmID);
} catch (\Exception $e) {
}
if ($dbFarm) {
$servers = $this->DB->Execute("SELECT * FROM servers WHERE farm_id = ? AND status IN (?,?,?,?)", array($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 tu eventServer.
if ($DBServer->status == \SERVER_STATUS::PENDING_TERMINATE) {
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) {
}
}
}