From 23c165d4d1d9b73966fdd14e8dbf0b10ed216ff7 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 10 Nov 2025 15:07:44 +0100 Subject: [PATCH] fix: wrap database updates in a transaction for consistency in GetContainersStatus --- app/Actions/Docker/GetContainersStatus.php | 25 +++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/app/Actions/Docker/GetContainersStatus.php b/app/Actions/Docker/GetContainersStatus.php index a985871dc..c7f4055f0 100644 --- a/app/Actions/Docker/GetContainersStatus.php +++ b/app/Actions/Docker/GetContainersStatus.php @@ -10,6 +10,7 @@ use App\Models\ServiceDatabase; use Illuminate\Support\Arr; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\DB; use Lorisleiva\Actions\Concerns\AsAction; class GetContainersStatus @@ -376,6 +377,10 @@ public function handle(Server $server, ?Collection $containers = null, ?Collecti if (isset($this->applicationContainerRestartCounts) && $this->applicationContainerRestartCounts->has($applicationId)) { $containerRestartCounts = $this->applicationContainerRestartCounts->get($applicationId); $maxRestartCount = $containerRestartCounts->max() ?? 0; + } + + // Wrap all database updates in a transaction to ensure consistency + DB::transaction(function () use ($application, $maxRestartCount, $containerStatuses) { $previousRestartCount = $application->restart_count ?? 0; if ($maxRestartCount > $previousRestartCount) { @@ -398,18 +403,18 @@ public function handle(Server $server, ?Collection $containers = null, ?Collecti $url = null; } } - } - // Aggregate status after tracking restart counts - $aggregatedStatus = $this->aggregateApplicationStatus($application, $containerStatuses, $maxRestartCount); - if ($aggregatedStatus) { - $statusFromDb = $application->status; - if ($statusFromDb !== $aggregatedStatus) { - $application->update(['status' => $aggregatedStatus]); - } else { - $application->update(['last_online_at' => now()]); + // Aggregate status after tracking restart counts + $aggregatedStatus = $this->aggregateApplicationStatus($application, $containerStatuses, $maxRestartCount); + if ($aggregatedStatus) { + $statusFromDb = $application->status; + if ($statusFromDb !== $aggregatedStatus) { + $application->update(['status' => $aggregatedStatus]); + } else { + $application->update(['last_online_at' => now()]); + } } - } + }); } }