diff --git a/src/Appwrite/Platform/Tasks/Migrate.php b/src/Appwrite/Platform/Tasks/Migrate.php index 21f83109ff..4d921ff137 100644 --- a/src/Appwrite/Platform/Tasks/Migrate.php +++ b/src/Appwrite/Platform/Tasks/Migrate.php @@ -3,8 +3,8 @@ namespace Appwrite\Platform\Tasks; use Appwrite\Migration\Migration; +use Redis; use Utopia\App; -use Utopia\Cache\Cache; use Utopia\CLI\Console; use Utopia\Database\Database; use Utopia\Database\Document; @@ -12,10 +12,13 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Platform\Action; use Utopia\Registry\Registry; +use Utopia\System\System; use Utopia\Validator\Text; class Migrate extends Action { + protected Redis $redis; + public static function getName(): string { return 'migrate'; @@ -27,34 +30,54 @@ class Migrate extends Action ->desc('Migrate Appwrite to new version') /** @TODO APP_VERSION_STABLE needs to be defined */ ->param('version', APP_VERSION_STABLE, new Text(8), 'Version to migrate to.', true) - ->inject('cache') ->inject('dbForConsole') ->inject('getProjectDB') ->inject('register') - ->callback(fn ($version, $cache, $dbForConsole, $getProjectDB, Registry $register) => $this->action($version, $cache, $dbForConsole, $getProjectDB, $register)); + ->callback(fn ($version, $dbForConsole, $getProjectDB, Registry $register) => $this->action($version, $dbForConsole, $getProjectDB, $register)); + } - private function clearProjectsCache(Cache $cache, Document $project) + private function clearProjectsCache(Document $project) { try { - $cache->purge("cache-_{$project->getInternalId()}:*"); + do { + $iterator = null; + $pattern = "default-cache-_{$project->getInternalId()}:*"; + $keys = $this->redis->scan($iterator, $pattern, 1000); + if ($keys !== false) { + foreach ($keys as $key) { + $this->redis->del($key); + } + } + } while ($iterator > 0); + } catch (\Throwable $th) { - Console::error('Failed to clear project ("' . $project->getId() . '") cache with error: ' . $th->getMessage()); + Console::error('Failed to clear project ("'.$project->getId().'") cache with error: '.$th->getMessage()); } } - public function action(string $version, Cache $cache, Database $dbForConsole, callable $getProjectDB, Registry $register) + public function action(string $version, Database $dbForConsole, callable $getProjectDB, Registry $register) { Authorization::disable(); - if (!array_key_exists($version, Migration::$versions)) { + if (! array_key_exists($version, Migration::$versions)) { Console::error("Version {$version} not found."); Console::exit(1); + return; } + $this->redis = new Redis(); + $this->redis->connect( + System::getEnv('_APP_REDIS_HOST', null), + System::getEnv('_APP_REDIS_PORT', 6379), + 3, + null, + 10 + ); + $app = new App('UTC'); - Console::success('Starting Data Migration to version ' . $version); + Console::success('Starting Data Migration to version '.$version); $console = $app->getResource('console'); @@ -74,11 +97,11 @@ class Migrate extends Action $totalProjects = $dbForConsole->count('projects') + 1; } - $class = 'Appwrite\\Migration\\Version\\' . Migration::$versions[$version]; + $class = 'Appwrite\\Migration\\Version\\'.Migration::$versions[$version]; /** @var Migration $migration */ $migration = new $class(); - while (!empty($projects)) { + while (! empty($projects)) { foreach ($projects as $project) { /** * Skip user projects with id 'console' @@ -87,7 +110,7 @@ class Migrate extends Action continue; } - $this->clearProjectsCache($cache, $project); + $this->clearProjectsCache($project); try { // TODO: Iterate through all project DBs @@ -99,11 +122,11 @@ class Migrate extends Action ->setPDO($register->get('db', true)) ->execute(); } catch (\Throwable $th) { - Console::error('Failed to update project ("' . $project->getId() . '") version with error: ' . $th->getMessage()); + Console::error('Failed to update project ("'.$project->getId().'") version with error: '.$th->getMessage()); throw $th; } - $this->clearProjectsCache($cache, $project); + $this->clearProjectsCache($project); } $sum = \count($projects); @@ -112,7 +135,7 @@ class Migrate extends Action $offset = $offset + $limit; $count = $count + $sum; - Console::log('Migrated ' . $count . '/' . $totalProjects . ' projects...'); + Console::log('Migrated '.$count.'/'.$totalProjects.' projects...'); } Console::success('Data Migration Completed');