From a5b3f4b2ba6873d7c87e41ec4e7341e188f2fd89 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 15 Jan 2018 19:28:39 -0500 Subject: [PATCH 1/4] Create Queue class Create queue class and functions from queue_fn.php --- src/Model/Queue.php | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/Model/Queue.php diff --git a/src/Model/Queue.php b/src/Model/Queue.php new file mode 100644 index 0000000000..a551bee017 --- /dev/null +++ b/src/Model/Queue.php @@ -0,0 +1,87 @@ + datetime_convert()], ['id' => $id]); + } + + function remove_queue_item($id) + { + logger('queue: remove queue item ' . $id); + dba::delete('queue', ['id' => $id]); + } + + /** + * @brief Checks if the communication with a given contact had problems recently + * + * @param int $cid Contact id + * + * @return bool The communication with this contact has currently problems + */ + function was_recently_delayed($cid) + { + // Are there queue entries that were recently added? + $r = q("SELECT `id` FROM `queue` WHERE `cid` = %d + AND `last` > UTC_TIMESTAMP() - INTERVAL 15 MINUTE LIMIT 1", + intval($cid) + ); + + $was_delayed = DBM::is_result($r); + + // We set "term-date" to a current date if the communication has problems. + // If the communication works again we reset this value. + if ($was_delayed) { + $r = q("SELECT `term-date` FROM `contact` WHERE `id` = %d AND `term-date` <= '1000-01-01' LIMIT 1", + intval($cid) + ); + $was_delayed = !DBM::is_result($r); + } + + return $was_delayed; + } + + + function add_to_queue($cid, $network, $msg, $batch = false) + { + + $max_queue = Config::get('system', 'max_contact_queue'); + if ($max_queue < 1) { + $max_queue = 500; + } + + $batch_queue = Config::get('system', 'max_batch_queue'); + if ($batch_queue < 1) { + $batch_queue = 1000; + } + + $r = q("SELECT COUNT(*) AS `total` FROM `queue` INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id` + WHERE `queue`.`cid` = %d AND `contact`.`self` = 0 ", + intval($cid) + ); + if (DBM::is_result($r)) { + if ($batch && ($r[0]['total'] > $batch_queue)) { + logger('add_to_queue: too many queued items for batch server ' . $cid . ' - discarding message'); + return; + } elseif ((! $batch) && ($r[0]['total'] > $max_queue)) { + logger('add_to_queue: too many queued items for contact ' . $cid . ' - discarding message'); + return; + } + } + + dba::insert('queue', ['cid' => $cid, 'network' => $network, 'created' => datetime_convert(), 'last' => datetime_convert(), 'content' => $msg, 'batch' =>($batch) ? 1 : 0]); + } +} From 33ac7a529fbfd6d389bd836d18550235ebc3b50d Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 15 Jan 2018 20:12:07 -0500 Subject: [PATCH 2/4] Update functions and calls update function names and calls --- src/Model/Queue.php | 22 +++++++++++++++++----- src/Protocol/Diaspora.php | 8 ++++---- src/Worker/Delivery.php | 9 ++++----- src/Worker/Queue.php | 26 +++++++++++++------------- 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/Model/Queue.php b/src/Model/Queue.php index a551bee017..3c262ddb08 100644 --- a/src/Model/Queue.php +++ b/src/Model/Queue.php @@ -13,13 +13,19 @@ require_once 'include/datetime.php'; class Queue { - function update_queue_time($id) + /** + * @param string $id id + */ + public static function updateTime($id) { logger('queue: requeue item ' . $id); dba::update('queue', ['last' => datetime_convert()], ['id' => $id]); } - function remove_queue_item($id) + /** + * @param string $id id + */ + public static function removeItem($id) { logger('queue: remove queue item ' . $id); dba::delete('queue', ['id' => $id]); @@ -32,7 +38,7 @@ class Queue * * @return bool The communication with this contact has currently problems */ - function was_recently_delayed($cid) + public static function wasDelayed($cid) { // Are there queue entries that were recently added? $r = q("SELECT `id` FROM `queue` WHERE `cid` = %d @@ -54,8 +60,13 @@ class Queue return $was_delayed; } - - function add_to_queue($cid, $network, $msg, $batch = false) + /** + * @param string $cid cid + * @param string $network network + * @param string $msg message + * @param boolean $batch batch, default false + */ + public static function add($cid, $network, $msg, $batch = false) { $max_queue = Config::get('system', 'max_contact_queue'); @@ -72,6 +83,7 @@ class Queue WHERE `queue`.`cid` = %d AND `contact`.`self` = 0 ", intval($cid) ); + if (DBM::is_result($r)) { if ($batch && ($r[0]['total'] > $batch_queue)) { logger('add_to_queue: too many queued items for batch server ' . $cid . ' - discarding message'); diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index f8e4f35c18..350fd4eb5b 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -20,6 +20,7 @@ use Friendica\Model\Contact; use Friendica\Model\GContact; use Friendica\Model\Group; use Friendica\Model\Profile; +use Friendica\Model\Queue; use Friendica\Model\User; use Friendica\Network\Probe; use Friendica\Util\Crypto; @@ -32,7 +33,6 @@ require_once 'include/dba.php'; require_once 'include/items.php'; require_once 'include/bb2diaspora.php'; require_once 'include/datetime.php'; -require_once 'include/queue_fn.php'; /** * @brief This class contain functions to create and send Diaspora XML files @@ -3224,7 +3224,7 @@ class Diaspora logger("transmit: ".$logid."-".$guid." ".$dest_url); - if (!$queue_run && was_recently_delayed($contact["id"])) { + if (!$queue_run && Queue::wasDelayed($contact["id"])) { $return_code = 0; } else { if (!intval(Config::get("system", "diaspora_test"))) { @@ -3254,7 +3254,7 @@ class Diaspora logger("add_to_queue ignored - identical item already in queue"); } else { // queue message for redelivery - add_to_queue($contact["id"], NETWORK_DIASPORA, $envelope, $public_batch); + Queue::add($contact["id"], NETWORK_DIASPORA, $envelope, $public_batch); // The message could not be delivered. We mark the contact as "dead" Contact::markForArchival($contact); @@ -3311,7 +3311,7 @@ class Diaspora $envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch); if ($spool) { - add_to_queue($contact['id'], NETWORK_DIASPORA, $envelope, $public_batch); + Queue::add($contact['id'], NETWORK_DIASPORA, $envelope, $public_batch); return true; } else { $return_code = self::transmit($owner, $contact, $envelope, $public_batch, false, $guid); diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index eafd0242ba..324ca921fb 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -2,7 +2,6 @@ /** * @file src/Worker/Delivery.php */ - namespace Friendica\Worker; use Friendica\App; @@ -10,13 +9,13 @@ use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Database\DBM; use Friendica\Model\Contact; +use Friendica\Model\Queue; use Friendica\Model\User; use Friendica\Protocol\Diaspora; use Friendica\Protocol\DFRN; use Friendica\Protocol\Email; use dba; -require_once 'include/queue_fn.php'; require_once 'include/html2plain.php'; require_once 'include/datetime.php'; require_once 'include/items.php'; @@ -335,8 +334,8 @@ class Delivery { } } - if (!was_recently_delayed($contact['id'])) { - $deliver_status = DFRN::deliver($owner,$contact,$atom); + if (!Queue::wasDelayed($contact['id'])) { + $deliver_status = DFRN::deliver($owner, $contact, $atom); } else { $deliver_status = (-1); } @@ -345,7 +344,7 @@ class Delivery { if ($deliver_status < 0) { logger('notifier: delivery failed: queuing message'); - add_to_queue($contact['id'],NETWORK_DFRN,$atom); + Queue::add($contact['id'], NETWORK_DFRN, $atom); // The message could not be delivered. We mark the contact as "dead" Contact::markForArchival($contact); diff --git a/src/Worker/Queue.php b/src/Worker/Queue.php index 1c83e77d77..6ff886b5a6 100644 --- a/src/Worker/Queue.php +++ b/src/Worker/Queue.php @@ -8,6 +8,7 @@ use Friendica\Core\Cache; use Friendica\Core\Config; use Friendica\Core\Worker; use Friendica\Database\DBM; +use Friendica\Model\Queue; use Friendica\Protocol\Diaspora; use Friendica\Protocol\DFRN; use Friendica\Protocol\PortableContact; @@ -15,7 +16,6 @@ use Friendica\Protocol\Salmon; use dba; require_once 'include/dba.php'; -require_once 'include/queue_fn.php'; require_once 'include/datetime.php'; require_once 'include/items.php'; require_once 'include/bbcode.php'; @@ -75,7 +75,7 @@ class Queue $contact = dba::selectFirst('contact', [], ['id' => $q_item['cid']]); if (!DBM::is_result($contact)) { - remove_queue_item($q_item['id']); + Queue::removeItem($q_item['id']); return; } @@ -83,7 +83,7 @@ class Queue if (!is_null($dead) && $dead) { logger('queue: skipping known dead url: ' . $contact['notify']); - update_queue_time($q_item['id']); + Queue::updateTime($q_item['id']); return; } @@ -101,14 +101,14 @@ class Queue if (!is_null($vital) && !$vital) { logger('queue: skipping dead server: ' . $server); - update_queue_time($q_item['id']); + Queue::updateTime($q_item['id']); return; } } $user = dba::selectFirst('user', [], ['uid' => $contact['uid']]); if (!DBM::is_result($user)) { - remove_queue_item($q_item['id']); + Queue::removeItem($q_item['id']); return; } @@ -124,10 +124,10 @@ class Queue $deliver_status = DFRN::deliver($owner, $contact, $data); if ($deliver_status == (-1)) { - update_queue_time($q_item['id']); + Queue::updateTime($q_item['id']); Cache::set($cachekey_deadguy . $contact['notify'], true, CACHE_QUARTER_HOUR); } else { - remove_queue_item($q_item['id']); + Queue::removeItem($q_item['id']); } break; case NETWORK_OSTATUS: @@ -136,10 +136,10 @@ class Queue $deliver_status = Salmon::slapper($owner, $contact['notify'], $data); if ($deliver_status == (-1)) { - update_queue_time($q_item['id']); + Queue::updateTime($q_item['id']); Cache::set($cachekey_deadguy . $contact['notify'], true, CACHE_QUARTER_HOUR); } else { - remove_queue_item($q_item['id']); + Queue::removeItem($q_item['id']); } } break; @@ -149,10 +149,10 @@ class Queue $deliver_status = Diaspora::transmit($owner, $contact, $data, $public, true); if ($deliver_status == (-1)) { - update_queue_time($q_item['id']); + Queue::updateTime($q_item['id']); Cache::set($cachekey_deadguy . $contact['notify'], true, CACHE_QUARTER_HOUR); } else { - remove_queue_item($q_item['id']); + Queue::removeItem($q_item['id']); } } break; @@ -162,9 +162,9 @@ class Queue call_hooks('queue_deliver', $params); if ($params['result']) { - remove_queue_item($q_item['id']); + Queue::removeItem($q_item['id']); } else { - update_queue_time($q_item['id']); + Queue::updateTime($q_item['id']); } break; } From 920a9b9b12b656860b55511fae0ad38eac2fba98 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 15 Jan 2018 20:16:14 -0500 Subject: [PATCH 3/4] Remove requires remove require_once statements --- src/Worker/Notifier.php | 1 - src/Worker/OnePoll.php | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 7c1749f5fd..4b20da314c 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -17,7 +17,6 @@ use Friendica\Protocol\Salmon; use dba; require_once 'include/dba.php'; -require_once 'include/queue_fn.php'; require_once 'include/html2plain.php'; require_once 'include/datetime.php'; require_once 'include/items.php'; diff --git a/src/Worker/OnePoll.php b/src/Worker/OnePoll.php index 9a4ce757a8..3c7df172ab 100644 --- a/src/Worker/OnePoll.php +++ b/src/Worker/OnePoll.php @@ -14,14 +14,13 @@ use dba; require_once 'include/dba.php'; -Class OnePoll +class OnePoll { public static function execute($contact_id = 0, $command = '') { global $a; require_once 'include/datetime.php'; require_once 'include/items.php'; - require_once 'include/queue_fn.php'; logger('start'); From c98e558372adcaef2920cbf4df03211c800fa737 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Mon, 15 Jan 2018 20:16:51 -0500 Subject: [PATCH 4/4] Remove old file remove include/queue_fn.php --- include/queue_fn.php | 84 -------------------------------------------- 1 file changed, 84 deletions(-) delete mode 100644 include/queue_fn.php diff --git a/include/queue_fn.php b/include/queue_fn.php deleted file mode 100644 index f5375258bf..0000000000 --- a/include/queue_fn.php +++ /dev/null @@ -1,84 +0,0 @@ - $id]); -} - -/** - * @brief Checks if the communication with a given contact had problems recently - * - * @param int $cid Contact id - * - * @return bool The communication with this contact has currently problems - */ -function was_recently_delayed($cid) { - // Are there queue entries that were recently added? - $r = q("SELECT `id` FROM `queue` WHERE `cid` = %d - AND `last` > UTC_TIMESTAMP() - INTERVAL 15 MINUTE LIMIT 1", - intval($cid) - ); - - $was_delayed = DBM::is_result($r); - - // We set "term-date" to a current date if the communication has problems. - // If the communication works again we reset this value. - if ($was_delayed) { - $r = q("SELECT `term-date` FROM `contact` WHERE `id` = %d AND `term-date` <= '1000-01-01' LIMIT 1", - intval($cid) - ); - $was_delayed = !DBM::is_result($r); - } - - return $was_delayed; -} - - -function add_to_queue($cid,$network,$msg,$batch = false) { - - $max_queue = Config::get('system','max_contact_queue'); - if ($max_queue < 1) { - $max_queue = 500; - } - - $batch_queue = Config::get('system','max_batch_queue'); - if ($batch_queue < 1) { - $batch_queue = 1000; - } - - $r = q("SELECT COUNT(*) AS `total` FROM `queue` INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id` - WHERE `queue`.`cid` = %d AND `contact`.`self` = 0 ", - intval($cid) - ); - if (DBM::is_result($r)) { - if ($batch && ($r[0]['total'] > $batch_queue)) { - logger('add_to_queue: too many queued items for batch server ' . $cid . ' - discarding message'); - return; - } elseif ((! $batch) && ($r[0]['total'] > $max_queue)) { - logger('add_to_queue: too many queued items for contact ' . $cid . ' - discarding message'); - return; - } - } - - q("INSERT INTO `queue` ( `cid`, `network`, `created`, `last`, `content`, `batch`) - VALUES ( %d, '%s', '%s', '%s', '%s', %d) ", - intval($cid), - dbesc($network), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($msg), - intval(($batch) ? 1: 0) - ); - -}