From b1a9666e43af138e55389fb028fa9841f57763e5 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Tue, 1 Sep 2020 08:30:12 +0000
Subject: [PATCH] Splitting workerqueue cleanup

---
 src/Worker/ClearWorkerqueue.php | 50 +++++++++++++++++++
 src/Worker/Cron.php             | 85 +++++++++++++--------------------
 2 files changed, 83 insertions(+), 52 deletions(-)
 create mode 100644 src/Worker/ClearWorkerqueue.php

diff --git a/src/Worker/ClearWorkerqueue.php b/src/Worker/ClearWorkerqueue.php
new file mode 100644
index 0000000000..c46eba62f8
--- /dev/null
+++ b/src/Worker/ClearWorkerqueue.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Worker;
+
+use Friendica\Core\Worker;
+use Friendica\Database\DBA;
+use Friendica\DI;
+
+/**
+ * Delete all done workerqueue entries
+ */
+class ClearWorkerqueue
+{
+	public static function execute()
+	{
+		DBA::delete('workerqueue', ['`done` AND `executed` < UTC_TIMESTAMP() - INTERVAL 1 HOUR']);
+
+		// Optimizing this table only last seconds
+		if (DI::config()->get('system', 'optimize_tables')) {
+			// We are acquiring the two locks from the worker to avoid locking problems
+			if (DI::lock()->acquire(Worker::LOCK_PROCESS, 10)) {
+				if (DI::lock()->acquire(Worker::LOCK_WORKER, 10)) {
+					DBA::e("OPTIMIZE TABLE `workerqueue`");
+					DBA::e("OPTIMIZE TABLE `process`");			
+					DI::lock()->release(Worker::LOCK_WORKER);
+				}
+				DI::lock()->release(Worker::LOCK_PROCESS);
+			}
+		}
+	}
+}
diff --git a/src/Worker/Cron.php b/src/Worker/Cron.php
index 3eb93ba26d..4a23e86f9b 100644
--- a/src/Worker/Cron.php
+++ b/src/Worker/Cron.php
@@ -24,9 +24,7 @@ namespace Friendica\Worker;
 use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Core\Worker;
-use Friendica\Database\DBA;
 use Friendica\DI;
-use Friendica\Util\DateTimeFormat;
 
 class Cron
 {
@@ -46,11 +44,24 @@ class Cron
 			}
 		}
 
-		Logger::notice('cron: start');
+		Logger::notice('start');
+
+		// Ensure to have a .htaccess file.
+		// this is a precaution for systems that update automatically
+		$basepath = $a->getBasePath();
+		if (!file_exists($basepath . '/.htaccess') && is_writable($basepath)) {
+			copy($basepath . '/.htaccess-dist', $basepath . '/.htaccess');
+		}
 
 		// Fork the cron jobs in separate parts to avoid problems when one of them is crashing
 		Hook::fork($a->queue['priority'], "cron");
 
+		// Poll contacts
+		Worker::add(PRIORITY_HIGH, 'PollContacts');
+
+		// Update contact information
+		Worker::add(PRIORITY_LOW, 'UpdatePublicContacts');		
+
 		// run the process to update server directories in the background
 		Worker::add(PRIORITY_LOW, 'UpdateServerDirectories');
 
@@ -63,12 +74,25 @@ class Cron
 		// Repair entries in the database
 		Worker::add(PRIORITY_LOW, 'RepairDatabase');
 
-		// once daily run birthday_updates and then expire in background
-		$d1 = DI::config()->get('system', 'last_expire_day');
-		$d2 = intval(DateTimeFormat::utcNow('d'));
+		// Hourly cron calls
+		if (DI::config()->get('system', 'last_cron_hourly', 0) + 3600 < time()) {
+
+			// Search for new contacts in the directory
+			if (DI::config()->get('system', 'synchronize_directory')) {
+				Worker::add(PRIORITY_LOW, 'PullDirectory');
+			}
+
+			// Delete all done workerqueue entries			
+			Worker::add(PRIORITY_LOW, 'ClearWorkerqueue');
+
+			// Clear cache entries
+			Worker::add(PRIORITY_LOW, 'ClearCache');
+
+			DI::config()->set('system', 'last_cron_hourly', time());
+		}
 
 		// Daily cron calls
-		if ($d2 != intval($d1)) {
+		if (DI::config()->get('system', 'last_cron_daily', 0) + 86400 < time()) {
 
 			Worker::add(PRIORITY_LOW, 'UpdateContactBirthdays');
 
@@ -96,53 +120,10 @@ class Cron
 				Worker::add(PRIORITY_LOW, 'OptimizeTables');
 			}
 	
-			DI::config()->set('system', 'last_expire_day', $d2);
-		}
-
-		// Hourly cron calls
-		if (DI::config()->get('system', 'last_cron_hourly', 0) + 3600 < time()) {
-
-			// Search for new contacts in the directory
-			if (DI::config()->get('system', 'synchronize_directory')) {
-				Worker::add(PRIORITY_LOW, 'PullDirectory');
-			}
-
-			// Delete all done workerqueue entries
-			DBA::delete('workerqueue', ['`done` AND `executed` < UTC_TIMESTAMP() - INTERVAL 1 HOUR']);
-
-			// Optimizing this table only last seconds
-			if (DI::config()->get('system', 'optimize_tables')) {
-				// We are acquiring the two locks from the worker to avoid locking problems
-				if (DI::lock()->acquire(Worker::LOCK_PROCESS, 10)) {
-					if (DI::lock()->acquire(Worker::LOCK_WORKER, 10)) {
-						DBA::e("OPTIMIZE TABLE `workerqueue`");
-						DBA::e("OPTIMIZE TABLE `process`");			
-						DI::lock()->release(Worker::LOCK_WORKER);
-					}
-					DI::lock()->release(Worker::LOCK_PROCESS);
-				}
-			}
-
-			// Clear cache entries
-			Worker::add(PRIORITY_LOW, 'ClearCache');
-
-			DI::config()->set('system', 'last_cron_hourly', time());
-		}
-
-		// Ensure to have a .htaccess file.
-		// this is a precaution for systems that update automatically
-		$basepath = $a->getBasePath();
-		if (!file_exists($basepath . '/.htaccess') && is_writable($basepath)) {
-			copy($basepath . '/.htaccess-dist', $basepath . '/.htaccess');
+			DI::config()->set('system', 'last_cron_daily', time());
 		}
 
-		// Poll contacts
-		Worker::add(PRIORITY_HIGH, 'PollContacts');
-
-		// Update contact information
-		Worker::add(PRIORITY_LOW, 'UpdatePublicContacts');		
-
-		Logger::notice('cron: end');
+		Logger::notice('end');
 
 		DI::config()->set('system', 'last_cron', time());
 
-- 
2.39.5