]> git.mxchange.org Git - friendica.git/commitdiff
Issue 8635: Avoid concurrent database updates
authorMichael <heluecht@pirati.ca>
Sat, 16 May 2020 08:15:51 +0000 (08:15 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 16 May 2020 08:15:51 +0000 (08:15 +0000)
Possibly helps with #8635

src/Database/DBStructure.php

index 0ff97d0c6c3685aa162b733b9b2b766902e332f7..9f225cbb93c3ec5bcef55d4ffebcc460f3cdde8f 100644 (file)
@@ -291,6 +291,12 @@ class DBStructure
         */
        public static function update($basePath, $verbose, $action, $install = false, array $tables = null, array $definition = null)
        {
+               if (!$install) {
+                       if (self::isUpdating()) {
+                               return DI::l10n()->t('Another database update is currently running.');
+                       }
+               }
+
                if ($action && !$install) {
                        DI::config()->set('system', 'maintenance', 1);
                        DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: Database update', DateTimeFormat::utcNow() . ' ' . date('e')));
@@ -1060,4 +1066,31 @@ class DBStructure
                        DBA::close($tokens);
                }
        }
+
+       /**
+        * Checks if a database update is currently running
+        *
+        * @return boolean
+        */
+       private static function isUpdating()
+       {
+               $processes = DBA::select(['information_schema' => 'processlist'],
+                       ['command', 'info'], ['db' => DBA::databaseName()]);
+
+               $isUpdate = false;
+
+               while ($process = DBA::fetch($processes)) {
+                       if (empty($process['info'])) {
+                               continue;
+                       }
+                       $parts = explode(' ', $process['info']);
+                       $command = strtolower(array_shift($parts));
+                       if ($command == 'alter') {
+                               $isUpdate = true;
+                       }
+               }
+               DBA::close($processes);
+
+               return $isUpdate;
+       }
 }