avoid upgrade taking hours
authordemeritcowboy <demeritcowboy@hotmail.com>
Thu, 19 Jan 2023 03:25:23 +0000 (22:25 -0500)
committerdemeritcowboy <demeritcowboy@hotmail.com>
Fri, 20 Jan 2023 00:05:12 +0000 (19:05 -0500)
CRM/Upgrade/Incremental/php/FiveFiftySeven.php

index 06977c0000a49d667d855dcec6c69b0bfb95a9b3..cc58cfbce54959ddc26b47de66b654f65a9c00c1 100644 (file)
  */
 class CRM_Upgrade_Incremental_php_FiveFiftySeven extends CRM_Upgrade_Incremental_Base {
 
+  /**
+   * How many activities before the queries used here are slow. Guessing.
+   */
+  const ACTIVITY_THRESHOLD = 1000000;
+
   public function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
     if ($rev === '5.57.alpha1') {
-      if (CRM_Core_DAO::singleValueQuery('SELECT COUNT(id) FROM civicrm_activity WHERE is_current_revision = 0')) {
+      // The query on is_current_revision is slow if there's a lot of activities. So limit when it gets run.
+      $activityCount = CRM_Core_DAO::singleValueQuery('SELECT MAX(id) FROM civicrm_activity');
+      if ($activityCount < self::ACTIVITY_THRESHOLD && CRM_Core_DAO::singleValueQuery('SELECT COUNT(id) FROM civicrm_activity WHERE is_current_revision = 0')) {
         $preUpgradeMessage .= '<p>' . ts('Your database contains CiviCase activity revisions which are deprecated and will begin to appear as duplicates in SearchKit/api4/etc.<ul><li>For further instructions see this <a %1>Lab Snippet</a>.</li></ul>', [1 => 'target="_blank" href="https://lab.civicrm.org/-/snippets/85"']) . '</p>';
       }
+      // Similarly the original_id ON DELETE drop+recreate is slow, so if we
+      // don't add the task farther down below, then tell people what to do at
+      // their convenience.
+      elseif ($activityCount >= self::ACTIVITY_THRESHOLD) {
+        $preUpgradeMessage .= '<p>' . ts('Your database contains too many activities to efficiently run a query needed to check for deprecated case activity revisions and to fix a bad foreign key constraint and it may take hours to run. You can run these queries manually at your convenience:<ul><li>SELECT COUNT(id) FROM `civicrm_activity` WHERE `is_current_revision` = 0;</li><li>ALTER TABLE `civicrm_activity` DROP FOREIGN KEY `FK_civicrm_activity_original_id`;</li><li>ALTER TABLE `civicrm_activity` ADD CONSTRAINT `FK_civicrm_activity_original_id` FOREIGN KEY (`original_id`) REFERENCES `civicrm_activity` (`id`) ON DELETE SET NULL;</li><li>For more information see this <a %1>Lab Snippet</a>.</li></ul>', [1 => 'target="_blank" href="https://lab.civicrm.org/-/snippets/85"']) . '</p>';
+      }
     }
   }
 
@@ -37,7 +50,9 @@ class CRM_Upgrade_Incremental_php_FiveFiftySeven extends CRM_Upgrade_Incremental
    */
   public function upgrade_5_57_alpha1($rev): void {
     $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
-    $this->addTask('Fix dangerous delete cascade', 'fixDeleteCascade');
+    if (CRM_Core_DAO::singleValueQuery('SELECT MAX(id) FROM civicrm_activity') < self::ACTIVITY_THRESHOLD) {
+      $this->addTask('Fix dangerous delete cascade', 'fixDeleteCascade');
+    }
     $this->addExtensionTask('Enable SearchKit extension', ['org.civicrm.search_kit'], 1100);
     $this->addExtensionTask('Enable Flexmailer extension', ['org.civicrm.flexmailer']);
   }