From 268e26eaae7723f2d4b9bb8c5e291d623eab2ee7 Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Wed, 15 Jan 2014 11:40:19 -0600
Subject: [PATCH] Periodically optimize core tables

This is instead of optimizing the lock table for every cron run, which
wastes a lot of db server io
---
 include/class.cron.php | 46 +++++++++++++++++++++++++++++++++++++++++-
 include/class.lock.php |  3 +--
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/include/class.cron.php b/include/class.cron.php
index 3aa0357c1..390ff0769 100644
--- a/include/class.cron.php
+++ b/include/class.cron.php
@@ -32,7 +32,9 @@ class Cron {
 
     function PurgeLogs() {
         global $ost;
-        if($ost) $ost->purgeLogs();
+        // Once a day on a 5-minute cron
+        if (rand(1,300) == 42)
+            if($ost) $ost->purgeLogs();
     }
 
     function PurgeDrafts() {
@@ -45,6 +47,47 @@ class Cron {
         AttachmentFile::deleteOrphans();
     }
 
+    function MaybeOptimizeTables() {
+        // Once a week on a 5-minute cron
+        $chance = rand(1,2000);
+        switch ($chance) {
+        case 42:
+            @db_query('OPTIMIZE TABLE '.TICKET_LOCK_TABLE);
+            break;
+        case 242:
+            @db_query('OPTIMIZE TABLE '.SYSLOG_TABLE);
+            break;
+        case 442:
+            @db_query('OPTIMIZE TABLE '.DRAFT_TABLE);
+            break;
+
+        // Start optimizing core ticket tables when we have an archiving
+        // system available
+        case 142:
+            #@db_query('OPTIMIZE TABLE '.TICKET_TABLE);
+            break;
+        case 542:
+            #@db_query('OPTIMIZE TABLE '.FORM_ENTRY_TABLE);
+            break;
+        case 642:
+            #@db_query('OPTIMIZE TABLE '.FORM_ANSWER_TABLE);
+            break;
+        case 342:
+            #@db_query('OPTIMIZE TABLE '.FILE_TABLE);
+            # XXX: Please do not add an OPTIMIZE for the file_chunk table!
+            break;
+
+        // Start optimizing user tables when we have a user directory
+        // sporting deletes
+        case 742:
+            #@db_query('OPTIMIZE TABLE '.USER_TABLE);
+            break;
+        case 842:
+            #@db_query('OPTIMIZE TABLE '.USER_EMAIL_TABLE);
+            break;
+        }
+    }
+
     function run(){ //called by outside cron NOT autocron
         global $ost;
         if (!$ost || $ost->isUpgradePending())
@@ -55,6 +98,7 @@ class Cron {
         self::PurgeLogs();
         self::CleanOrphanedFiles();
         self::PurgeDrafts();
+        self::MaybeOptimizeTables();
     }
 }
 ?>
diff --git a/include/class.lock.php b/include/class.lock.php
index bbf53b549..d6bcbad9d 100644
--- a/include/class.lock.php
+++ b/include/class.lock.php
@@ -147,11 +147,10 @@ class TicketLock {
         return db_query($sql);
     }
 
-    //Called  via cron 
+    //Called  via cron
     function cleanup() {
         //Cleanup any expired locks.
         db_query('DELETE FROM '.TICKET_LOCK_TABLE.' WHERE expire<NOW()');
-        @db_query('OPTIMIZE TABLE '.TICKET_LOCK_TABLE);
     }
 }
 ?>
-- 
GitLab