]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
HubSub now remembers recent failures and counts them
authorMikael Nordfeldth <mmn@hethane.se>
Mon, 10 Jul 2017 18:28:45 +0000 (20:28 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Mon, 10 Jul 2017 18:28:45 +0000 (20:28 +0200)
plugins/OStatus/classes/HubSub.php
plugins/OStatus/lib/huboutqueuehandler.php

index 6239ff30709f3c6fdaf75032fa00ce6fe90fb8f7..28ea1fd9d69135d09aa2a62d3aa53d20b8631d13 100644 (file)
@@ -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.
index bf96070b4d9d92486acadb160d0ee54f9fdeec6e..26990ff6000b9efe61bcf0f9106f80642a5db2f4 100644 (file)
@@ -17,9 +17,7 @@
  * 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.
@@ -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");
             }
         }