fix: improve server list reliability with async retry polling instead of blocking usleep

This commit is contained in:
2026-01-25 16:26:46 -05:00
parent 17061d0c35
commit ebfc5c84c9
2 changed files with 35 additions and 18 deletions

View File

@@ -11,18 +11,12 @@ use Illuminate\Support\Facades\Cache;
class Server extends Component
{
protected int $maxRetries = 3;
public int $loadAttempts = 0;
public function mount(ServerModel $server): void
{
parent::mount($server);
// Retry loading VM status if initial load failed
$retries = 0;
while ($this->status === null && $retries < $this->maxRetries) {
usleep(100000); // 100ms delay between retries
$this->loadVmStatus();
$retries++;
}
$this->loadAttempts = 1;
// Check and enforce bandwidth throttling if exceeded (only if status loaded)
if ($this->status !== null) {
@@ -177,13 +171,28 @@ class Server extends Component
public function retryLoadStatus(): void
{
$retries = 0;
while ($this->status === null && $retries < $this->maxRetries) {
$this->loadAttempts++;
$this->loadVmStatus();
// Check bandwidth throttling on successful load
if ($this->status !== null) {
$this->checkAndEnforceBandwidthLimit();
}
}
/**
* Auto-retry loading status via polling (called by wire:poll when status is null)
*/
public function autoRetryLoadStatus(): void
{
if ($this->status === null && $this->loadAttempts < $this->maxRetries) {
$this->loadAttempts++;
$this->loadVmStatus();
if ($this->status === null) {
usleep(200000); // 200ms delay between retries
// Check bandwidth throttling on successful load
if ($this->status !== null) {
$this->checkAndEnforceBandwidthLimit();
}
$retries++;
}
}

View File

@@ -1,4 +1,4 @@
<div class="space-y-4">
<div class="space-y-4" @if(!$status && $loadAttempts < 3) wire:poll.500ms="autoRetryLoadStatus" @endif>
@if(!$status)
{{-- Show loading placeholder if status is not yet loaded --}}
<div class="bg-background-secondary border border-neutral p-4 rounded-lg mb-4 flex flex-col">
@@ -13,7 +13,13 @@
<div class="size-5">
<x-ri-loader-4-line class="animate-spin" />
</div>
<span class="text-sm font-medium">Loading...</span>
<span class="text-sm font-medium">
@if($loadAttempts < 3)
Loading... ({{ $loadAttempts }}/3)
@else
Failed to load
@endif
</span>
</div>
</div>
<div class="flex flex-row flex-wrap gap-4 mt-4">
@@ -26,9 +32,11 @@
<span class="text-base">{{ $server->primaryIpv6->ip ?? 'None' }}</span>
</div>
</div>
<div class="mt-4 pt-4 border-t border-neutral">
<div class="text-sm text-base/50">Unable to fetch server status from Proxmox. <button wire:click="retryLoadStatus" class="text-primary hover:underline">Retry</button></div>
</div>
@if($loadAttempts >= 3)
<div class="mt-4 pt-4 border-t border-neutral">
<div class="text-sm text-base/50">Unable to fetch server status from Proxmox. <button wire:click="retryLoadStatus" class="text-primary hover:underline">Retry</button></div>
</div>
@endif
</div>
@else
<a href="{{ route('proxmox.server.overview', ['server' => $server->id]) }}" wire:navigate>