'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'),
),
);
}
+ 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.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-if (!defined('STATUSNET')) {
- exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Send a raw WebSub push atom update from our internal hub.
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--;
// after a delay, use it.
$sub->distribute($atom, $retries);
} else {
+ $sub->incrementErrors($e->getMessage());
common_log(LOG_ERR, "$msg; discarding");
}
}