]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #8640 from annando/annando/issue8635
authorHypolite Petovan <hypolite@mrpetovan.com>
Sat, 16 May 2020 12:04:18 +0000 (08:04 -0400)
committerGitHub <noreply@github.com>
Sat, 16 May 2020 12:04:18 +0000 (08:04 -0400)
Issue 8635: Avoid concurrent database updates

src/Database/DBStructure.php

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