Detect not accessible cron daemon [MAILPOET-801]

This adds a function to a CronHelper which detect accessibility problem based on timestamps
which are stored during cron execution. The main idea is that the cron daemon should update run_started_at
within the REQUEST_TIMEOUT after it was accessed (run_accessed_at).
This commit is contained in:
Rostislav Wolny
2018-07-10 18:10:18 +02:00
parent 083372a391
commit 3c7cd193b6
2 changed files with 91 additions and 0 deletions

View File

@@ -84,6 +84,26 @@ class CronHelper {
return WPFunctions::wpRemoteRetrieveBody($result); return WPFunctions::wpRemoteRetrieveBody($result);
} }
/**
* @return boolean|null
*/
static function isDaemonAccessible() {
$daemon = self::getDaemon();
if(!$daemon || $daemon['run_accessed_at'] === null) {
return null;
}
if($daemon['run_accessed_at'] <= (int)$daemon['run_started_at']) {
return true;
}
if(
$daemon['run_accessed_at'] + self::DAEMON_REQUEST_TIMEOUT < time() &&
$daemon['run_accessed_at'] > (int)$daemon['run_started_at']
) {
return false;
}
return null;
}
static function queryCronUrl($url) { static function queryCronUrl($url) {
$args = WPHooks::applyFilters( $args = WPHooks::applyFilters(
'mailpoet_cron_request_args', 'mailpoet_cron_request_args',

View File

@@ -125,6 +125,77 @@ class CronHelperTest extends \MailPoetTest {
} }
} }
function testItDetectsNotAccessibleDaemon() {
$time = time();
$run_start_values = [null, $time - 20];
foreach($run_start_values as $run_start) {
$daemon = [
'token' => 'some_token',
'updated_at' => 12345678,
'run_accessed_at' => $time - 10,
'run_started_at' => $run_start,
'run_completed_at' => null,
'last_error' => null,
];
Setting::setValue(
CronHelper::DAEMON_SETTING,
$daemon
);
expect(CronHelper::isDaemonAccessible())->false();
}
}
function testItDetectsAccessibleDaemon() {
$time = time();
$daemon = [
'token' => 'some_token',
'updated_at' => 12345678,
'run_accessed_at' => $time - 5,
'run_started_at' => $time - 4,
'run_completed_at' => null,
'last_error' => null,
];
Setting::setValue(
CronHelper::DAEMON_SETTING,
$daemon
);
expect(CronHelper::isDaemonAccessible())->true();
}
function testItDetectsUnknownStateOfTheDaemon() {
$time = time();
$test_inputs = [
[
'run_access' => null,
'run_start' => null,
],
[
'run_access' => $time - 4,
'run_start' => null,
],
[
'run_access' => $time - 4,
'run_start' => $time - 10,
],
null,
];
foreach($test_inputs as $test_input) {
$daemon = [
'token' => 'some_token',
'updated_at' => 12345678,
'run_accessed_at' => $test_input['run_access'],
'run_started_at' => $test_input['run_start'],
'run_completed_at' => null,
'last_error' => null,
];
Setting::setValue(
CronHelper::DAEMON_SETTING,
$daemon
);
expect(CronHelper::isDaemonAccessible())->null();
}
}
function testItCreatesRandomToken() { function testItCreatesRandomToken() {
// random token is a string of 5 characters // random token is a string of 5 characters
$token1 = CronHelper::createToken(); $token1 = CronHelper::createToken();