+ return $added;
+ }
+
+ /**
+ * Returns the next retrial level for worker jobs.
+ * This function will skip levels when jobs are older.
+ *
+ * @param array $queue Worker queue entry
+ * @param integer $max_level maximum retrial level
+ * @return integer the next retrial level value
+ */
+ private static function getNextRetrial($queue, $max_level)
+ {
+ $created = strtotime($queue['created']);
+ $retrial_time = time() - $created;
+
+ $new_retrial = $queue['retrial'] + 1;
+ $total = 0;
+ for ($retrial = 0; $retrial <= $max_level + 1; ++$retrial) {
+ $delay = (($retrial + 3) ** 4) + (rand(1, 30) * ($retrial + 1));
+ $total += $delay;
+ if (($total < $retrial_time) && ($retrial > $queue['retrial'])) {
+ $new_retrial = $retrial;
+ }
+ }
+ Logger::info('New retrial for task', ['id' => $queue['id'], 'created' => $queue['created'], 'old' => $queue['retrial'], 'new' => $new_retrial]);
+ return $new_retrial;