From 9919ccb8b5a33ceb712d0a107af8753dfcea3bee Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Mon, 10 Jul 2017 20:28:45 +0200 Subject: [PATCH] HubSub now remembers recent failures and counts them --- plugins/OStatus/classes/HubSub.php | 49 ++++++++++++++++++++++ plugins/OStatus/lib/huboutqueuehandler.php | 18 ++++++-- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index 6239ff3070..28ea1fd9d6 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -57,6 +57,10 @@ class HubSub extends Managed_DataObject 'secret' => array('type' => 'text', 'description' => 'HubSub stored secret'), 'sub_start' => array('type' => 'datetime', 'description' => 'subscription start'), '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'), '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 * subscription start & end dates. diff --git a/plugins/OStatus/lib/huboutqueuehandler.php b/plugins/OStatus/lib/huboutqueuehandler.php index bf96070b4d..26990ff600 100644 --- a/plugins/OStatus/lib/huboutqueuehandler.php +++ b/plugins/OStatus/lib/huboutqueuehandler.php @@ -17,9 +17,7 @@ * along with this program. If not, see . */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Send a raw WebSub push atom update from our internal hub. @@ -57,8 +55,19 @@ class HubOutQueueHandler extends QueueHandler assert($sub instanceof HubSub); 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) { + // 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()); } catch (Exception $e) { $retries--; @@ -70,6 +79,7 @@ class HubOutQueueHandler extends QueueHandler // after a delay, use it. $sub->distribute($atom, $retries); } else { + $sub->incrementErrors($e->getMessage()); common_log(LOG_ERR, "$msg; discarding"); } }