]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Don't retry unhandled transports in OpportunisticQM
authorMikael Nordfeldth <mmn@hethane.se>
Fri, 17 Jul 2015 23:09:50 +0000 (01:09 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Fri, 17 Jul 2015 23:09:50 +0000 (01:09 +0200)
It'd continue trying xmpp transports forever, for example...

classes/Queue_item.php
lib/dbqueuemanager.php
lib/queuemanager.php
plugins/OpportunisticQM/lib/opportunisticqueuemanager.php

index 3a7d05adef7249d203a7dee5c24f2c64f39392e2..d41c53e0e068dac5a264030d70eaacd5f388d747 100644 (file)
@@ -40,7 +40,7 @@ class Queue_item extends Managed_DataObject
      * @param mixed $transports name of a single queue or array of queues to pull from
      *                          If not specified, checks all queues in the system.
      */
-    static function top($transports=null) {
+    static function top($transports=null, array $ignored_transports=array()) {
 
         $qi = new Queue_item();
         if ($transports) {
@@ -52,6 +52,11 @@ class Queue_item extends Managed_DataObject
                 $qi->transport = $transports;
             }
         }
+        if (!empty($ignored_transports)) {
+            // @fixme use safer escaping
+            $list = implode("','", array_map(array($qi, 'escape'), $ignored_transports));
+            $qi->whereAdd("transport NOT IN ('$list')");
+        }
         $qi->orderBy('created');
         $qi->whereAdd('claimed is null');
 
index 45c4b694d2e4848237bcae4563461fbb79ab55be..9fb77eed9645c380beb0901042e21a7854048321 100644 (file)
@@ -72,7 +72,7 @@ class DBQueueManager extends QueueManager
     public function poll()
     {
         //$this->_log(LOG_DEBUG, 'Checking for notices...');
-        $qi = Queue_item::top($this->activeQueues());
+        $qi = Queue_item::top($this->activeQueues(), $this->getIgnoredTransports());
         if (!$qi instanceof Queue_item) {
             //$this->_log(LOG_DEBUG, 'No notices waiting; idling.');
             return false;
index 45fe1e4ab43040343989833046206622bfc2f72b..487104099a9e0c5d716be87e786907b9ae0980a2 100644 (file)
@@ -43,6 +43,7 @@ abstract class QueueManager extends IoManager
     protected $handlers = array();
     protected $groups = array();
     protected $activeGroups = array();
+    protected $ignoredTransports = array();
 
     /**
      * Factory function to pull the appropriate QueueManager object
@@ -255,6 +256,17 @@ abstract class QueueManager extends IoManager
         return array_keys($queues);
     }
 
+    function getIgnoredTransports()
+    {
+        return array_keys($this->ignoredTransports);
+    }
+
+    function ignoreTransport($transport)
+    {
+        // key is used for uniqueness, value doesn't mean anything
+        $this->ignoredTransports[$transport] = true;
+    }
+
     /**
      * Initialize the list of queue handlers for the current site.
      *
index 4b2b679b580217846dab25d20b03e3b144c5fb08..b2dc61e15fe8bf66ecf1741c00825bf7a50efe25 100644 (file)
@@ -83,10 +83,17 @@ class OpportunisticQueueManager extends DBQueueManager
     // OpportunisticQM shouldn't discard items it can't handle, we're
     // only here to take care of what we _can_ handle!
     protected function noHandlerFound(Queue_item $qi, $rep=null) {
-        $this->_log(LOG_WARNING, "[{$qi->transport}:item {$qi->id}] Releasing claim for queue item without a handler");
+        $this->_log(LOG_WARNING, "[{$qi->transport}:item {$qi->id}] Releasing claim for queue item without a handler");              
         $this->_fail($qi, true);    // true here means "releaseOnly", so no error statistics since it's not an _error_
     }
 
+    protected function _fail(Queue_item $qi, $releaseOnly=false)
+    {
+        parent::_fail($qi, $releaseOnly);
+        $this->_log(LOG_DEBUG, "[{$qi->transport}:item {$qi->id}] Ignoring this transport for the rest of this execution");
+        $this->ignoreTransport($qi->transport);
+    }
+
     /**
      * Takes care of running through the queue items, returning when
      * the limits setup in __construct are met.