HubSub now remembers recent failures and counts them
This commit is contained in:
parent
661930cbe6
commit
9919ccb8b5
@ -57,6 +57,10 @@ class HubSub extends Managed_DataObject
|
|||||||
'secret' => array('type' => 'text', 'description' => 'HubSub stored secret'),
|
'secret' => array('type' => 'text', 'description' => 'HubSub stored secret'),
|
||||||
'sub_start' => array('type' => 'datetime', 'description' => 'subscription start'),
|
'sub_start' => array('type' => 'datetime', 'description' => 'subscription start'),
|
||||||
'sub_end' => array('type' => 'datetime', 'description' => 'subscription end'),
|
'sub_end' => array('type' => 'datetime', 'description' => 'subscription end'),
|
||||||
|
'errors' => array('type' => 'integer', 'not null' => true, 'default' => 0, 'description' => 'Queue handling error count, is reset on success.'),
|
||||||
|
'error_start' => array('type' => 'datetime', 'default' => null, 'description' => 'time of first error since latest success, should be null if no errors have been counted'),
|
||||||
|
'last_error' => array('type' => 'datetime', 'default' => null, 'description' => 'time of last failure, if ever'),
|
||||||
|
'last_error_msg' => array('type' => 'text', 'default' => null, 'description' => 'Last error _message_'),
|
||||||
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
|
'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
|
||||||
'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
|
'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
|
||||||
),
|
),
|
||||||
@ -68,6 +72,51 @@ class HubSub extends Managed_DataObject
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getErrors()
|
||||||
|
{
|
||||||
|
return intval($this->errors);
|
||||||
|
}
|
||||||
|
|
||||||
|
// $msg is only set if $error_count is 0
|
||||||
|
function setErrors($error_count, $msg=null)
|
||||||
|
{
|
||||||
|
assert(is_int($error_count));
|
||||||
|
if (!is_int($error_count) || $error_count < 0) {
|
||||||
|
common_log(LOG_ERR, 'HubSub->setErrors was given a bad value: '._ve($error_count));
|
||||||
|
throw new ServerException('HubSub error count must be an integer higher or equal to 0.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$orig = clone($this);
|
||||||
|
$now = common_sql_now();
|
||||||
|
|
||||||
|
if ($error_count === 1) {
|
||||||
|
// Record when the errors started
|
||||||
|
$this->error_start = $now;
|
||||||
|
}
|
||||||
|
if ($error_count > 0) {
|
||||||
|
// Record this error's occurrence in time
|
||||||
|
$this->last_error = $now;
|
||||||
|
$this->last_error_msg = $msg;
|
||||||
|
} else {
|
||||||
|
$this->error_start = null;
|
||||||
|
$this->last_error = null;
|
||||||
|
$this->last_error_msg = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->errors = $error_count;
|
||||||
|
$this->update($orig);
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetErrors()
|
||||||
|
{
|
||||||
|
return $this->setErrors(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function incrementErrors($msg=null)
|
||||||
|
{
|
||||||
|
return $this->setErrors($this->getErrors()+1, $msg);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates a requested lease length, sets length plus
|
* Validates a requested lease length, sets length plus
|
||||||
* subscription start & end dates.
|
* subscription start & end dates.
|
||||||
|
@ -17,9 +17,7 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
if (!defined('GNUSOCIAL')) { exit(1); }
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a raw WebSub push atom update from our internal hub.
|
* Send a raw WebSub push atom update from our internal hub.
|
||||||
@ -57,8 +55,19 @@ class HubOutQueueHandler extends QueueHandler
|
|||||||
assert($sub instanceof HubSub);
|
assert($sub instanceof HubSub);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$sub->push($atom);
|
$success = $sub->push($atom);
|
||||||
|
// The reason I split these up is because I want to see how the algorithm acts in practice.
|
||||||
|
if ($success) {
|
||||||
|
common_debug('HubSub push completed successfully!');
|
||||||
|
} else {
|
||||||
|
common_debug('HubSub push failed with an HTTP error.');
|
||||||
|
}
|
||||||
|
if ($sub->getErrors()>0) {
|
||||||
|
common_debug('Resetting HubSub push error count following successful reset.');
|
||||||
|
$sub->resetErrors();
|
||||||
|
}
|
||||||
} catch (AlreadyFulfilledException $e) {
|
} catch (AlreadyFulfilledException $e) {
|
||||||
|
// Probably doesn't happen anymore since commit 74a60ab963b5ce1ed95bd81f935a44c573cd0264
|
||||||
common_log(LOG_INFO, "Failed WebSub push to $sub->callback for $sub->topic (".get_class($e)."): " . $e->getMessage());
|
common_log(LOG_INFO, "Failed WebSub push to $sub->callback for $sub->topic (".get_class($e)."): " . $e->getMessage());
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$retries--;
|
$retries--;
|
||||||
@ -70,6 +79,7 @@ class HubOutQueueHandler extends QueueHandler
|
|||||||
// after a delay, use it.
|
// after a delay, use it.
|
||||||
$sub->distribute($atom, $retries);
|
$sub->distribute($atom, $retries);
|
||||||
} else {
|
} else {
|
||||||
|
$sub->incrementErrors($e->getMessage());
|
||||||
common_log(LOG_ERR, "$msg; discarding");
|
common_log(LOG_ERR, "$msg; discarding");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user