From 912d65c767cff33f3903068d57f7165a4d2ba6f0 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 16 Jan 2016 17:34:27 +0100 Subject: [PATCH 1/3] bulkDistribute won't add empty lists to database --- plugins/OStatus/classes/HubSub.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index c9d65c56a7..6388f8e873 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -228,6 +228,10 @@ class HubSub extends Managed_DataObject */ function bulkDistribute($atom, $pushCallbacks) { + if (empty($pushCallbacks)) { + common_log(LOG_ERR, 'Callback list empty for bulkDistribute.'); + return false; + } $data = array('atom' => $atom, 'topic' => $this->topic, 'pushCallbacks' => $pushCallbacks); @@ -235,6 +239,7 @@ class HubSub extends Managed_DataObject count($pushCallbacks) . " sites"); $qm = QueueManager::get(); $qm->enqueue($data, 'hubprep'); + return true; } /** From c393bc95635cc7b5584135bfd6f447dcc03c961b Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 16 Jan 2016 17:18:14 +0100 Subject: [PATCH 2/3] In very specific circumstances we can bulkDistribute 0 notices Seems to be what caused an infinite loop on quitter.es, or I guess so anyway. --- plugins/OStatus/classes/HubSub.php | 2 +- plugins/OStatus/lib/ostatusqueuehandler.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index 6388f8e873..7ffda88e74 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -226,7 +226,7 @@ class HubSub extends Managed_DataObject * @param string $atom well-formed Atom feed * @param array $pushCallbacks list of callback URLs */ - function bulkDistribute($atom, $pushCallbacks) + function bulkDistribute($atom, array $pushCallbacks) { if (empty($pushCallbacks)) { common_log(LOG_ERR, 'Callback list empty for bulkDistribute.'); diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php index 0376d13e52..fed93b6ea6 100644 --- a/plugins/OStatus/lib/ostatusqueuehandler.php +++ b/plugins/OStatus/lib/ostatusqueuehandler.php @@ -257,7 +257,7 @@ class OStatusQueueHandler extends QueueHandler } } } - if (count($batch) >= 0) { + if (count($batch) > 0) { $sub->bulkDistribute($atom, $batch); } } From 64e74d527fae667fa7cbea40fcee564a40aa6465 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Wed, 20 Jan 2016 14:55:41 +0100 Subject: [PATCH 3/3] Handle exceptions when salmon slapping Make it so notifyDeferred actually _always_ throws exceptions and handle them in the places it is called. --- plugins/OStatus/classes/Ostatus_profile.php | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index d36cbe21d6..a8269bdf07 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -376,14 +376,19 @@ class Ostatus_profile extends Managed_DataObject public function notifyDeferred($entry, $actor) { if ($this->salmonuri) { - common_debug("OSTATUS: user {$actor->getNickname()} ({$actor->getID()}) wants to ping {$this->localProfile()->getNickname()} on {$this->salmonuri}"); - $data = array('salmonuri' => $this->salmonuri, - 'entry' => $this->notifyPrepXml($entry), - 'actor' => $actor->getID(), - 'target' => $this->localProfile()->getID()); + try { + common_debug("OSTATUS: user {$actor->getNickname()} ({$actor->getID()}) wants to ping {$this->localProfile()->getNickname()} on {$this->salmonuri}"); + $data = array('salmonuri' => $this->salmonuri, + 'entry' => $this->notifyPrepXml($entry), + 'actor' => $actor->getID(), + 'target' => $this->localProfile()->getID()); - $qm = QueueManager::get(); - return $qm->enqueue($data, 'salmon'); + $qm = QueueManager::get(); + return $qm->enqueue($data, 'salmon'); + } catch (Exception $e) { + common_log(LOG_ERR, 'OSTATUS: Something went wrong when creating a Salmon slap: '._ve($e->getMessage())); + return false; + } } return false;