public function performDbMsrAction($action, DBFarmRole $dbFarmRole, $tz)
{
$timeouted = false;
if ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_ENABLED")) && $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")) != 0) {
if ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING")) == 1) {
// Wait for timeout time * 2 (Example: NIVs problem with big mysql snapshots)
// We must wait for running bundle process.
$timeout = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY")) * (3600 * 2);
$lastTs = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_RUNNING_TS"));
if ($lastTs + $timeout < time()) {
$timeouted = true;
}
if ($timeouted) {
$dbFarmRole->SetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_IS_RUNNING"), 0, Entity\FarmRoleSetting::TYPE_LCL);
}
} else {
//Check bundle window
$period = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_EVERY"));
$timeout = $period * 3600;
$lastActionTime = $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_LAST_TS"));
$performAction = false;
if ($period % 24 == 0) {
if ($lastActionTime) {
$days = $period / 24;
$dateTime = new DateTime(null, new DateTimeZone($tz));
$currentDate = (int) $dateTime->format("Ymd");
$dateTime->setTimestamp(strtotime("+{$days} day", $lastActionTime));
$nextDate = (int) $dateTime->format("Ymd");
if ($nextDate > $currentDate) {
return;
}
}
$pbwFrom = (int) ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_START_HH")) . $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_START_MM")));
$pbwTo = (int) ($dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_END_HH")) . $dbFarmRole->GetSetting(Scalr_Db_Msr::getConstant("DATA_{$action}_TIMEFRAME_END_MM")));
if ($pbwFrom && $pbwTo) {
$dateTime = new DateTime(null, new DateTimeZone($tz));
$currentTime = (int) $dateTime->format("Hi");
if ($pbwFrom <= $currentTime && $pbwTo >= $currentTime) {
$performAction = true;
}
} else {
$performAction = true;
}
} else {
//Check timeout
if ($lastActionTime + $timeout < time()) {
$performAction = true;
}
}
try {
if ($performAction) {
$behavior = Scalr_Role_Behavior::loadByName($dbFarmRole->GetRoleObject()->getDbMsrBehavior());
if ($action == 'BUNDLE') {
$behavior->createDataBundle($dbFarmRole, array('compressor' => $dbFarmRole->GetSetting(Scalr_Role_DbMsrBehavior::ROLE_DATA_BUNDLE_COMPRESSION), 'useSlave' => $dbFarmRole->GetSetting(Scalr_Role_DbMsrBehavior::ROLE_DATA_BUNDLE_USE_SLAVE)));
}
if ($action == 'BACKUP') {
$behavior->createBackup($dbFarmRole);
}
}
} catch (NotApplicableException $e) {
//No suitable server
}
}
}
}