From 134eb6324ed44cf85f90780053917fa9ced6918e Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 13 Mar 2025 23:07:51 -0600 Subject: [PATCH] Update AccountPostCountStatUpdate, fix memory leak --- .../Commands/AccountPostCountStatUpdate.php | 68 +++++++++++++------ app/Services/Account/AccountStatService.php | 10 +++ 2 files changed, 56 insertions(+), 22 deletions(-) diff --git a/app/Console/Commands/AccountPostCountStatUpdate.php b/app/Console/Commands/AccountPostCountStatUpdate.php index 6d5ba00a6..9ba26553a 100644 --- a/app/Console/Commands/AccountPostCountStatUpdate.php +++ b/app/Console/Commands/AccountPostCountStatUpdate.php @@ -2,11 +2,11 @@ namespace App\Console\Commands; -use Illuminate\Console\Command; -use App\Services\AccountService; +use App\Profile; use App\Services\Account\AccountStatService; +use App\Services\AccountService; use App\Status; -use App\Profile; +use Illuminate\Console\Command; class AccountPostCountStatUpdate extends Command { @@ -29,29 +29,53 @@ class AccountPostCountStatUpdate extends Command */ public function handle() { - $ids = AccountStatService::getAllPostCountIncr(); - if(!$ids || !count($ids)) { + $chunkSize = 100; + $lastId = 0; + + while (true) { + $ids = AccountStatService::getPostCountChunk($lastId, $chunkSize); + + if (empty($ids)) { + break; + } + + foreach ($ids as $id) { + $this->processAccount($id); + $lastId = $id; + } + + if (function_exists('gc_collect_cycles')) { + gc_collect_cycles(); + } + } + + return 0; + } + + private function processAccount($id) + { + $acct = AccountService::get($id, true); + if (! $acct) { + AccountStatService::removeFromPostCount($id); + return; } - foreach($ids as $id) { - $acct = AccountService::get($id, true); - if(!$acct) { + + $statusCount = Status::whereProfileId($id)->count(); + if ($statusCount != $acct['statuses_count']) { + $profile = Profile::find($id); + if (! $profile) { AccountStatService::removeFromPostCount($id); - continue; - } - $statusCount = Status::whereProfileId($id)->count(); - if($statusCount != $acct['statuses_count']) { - $profile = Profile::find($id); - if(!$profile) { - AccountStatService::removeFromPostCount($id); - continue; - } - $profile->status_count = $statusCount; - $profile->save(); - AccountService::del($id); + + return; } - AccountStatService::removeFromPostCount($id); + + $profile->status_count = $statusCount; + $profile->save(); + + AccountService::del($id); } - return; + + AccountStatService::removeFromPostCount($id); } } diff --git a/app/Services/Account/AccountStatService.php b/app/Services/Account/AccountStatService.php index 12fd3f94f..dd99ef7fc 100644 --- a/app/Services/Account/AccountStatService.php +++ b/app/Services/Account/AccountStatService.php @@ -28,4 +28,14 @@ class AccountStatService { return Redis::zrange(self::REFRESH_CACHE_KEY, 0, $limit); } + + public static function getPostCountChunk($lastId, $count) + { + return Redis::zrangebyscore( + self::REFRESH_CACHE_KEY, + '(' . $lastId, + '+inf', + ['limit' => [0, $count]] + ); + } }