VulCode
Blog

Pelican Panel: aktualizacja pluginu nie kończy się już błędem

Aktualizacja pluginu w panelu Pelican wywracała się na „Call to a member function query() on null”, bo kod odświeżał model, którego połączenie przed chwilą wyzerował. Teraz pobiera świeży rekord.

DualFroz - VulCode CEODualFroz - VulCode CEO1 min czytania
Pelican Panel: aktualizacja pluginu nie kończy się już błędem - DualFroz - VulCode CEO
Tytuł zmiany w repozytorium
Fix plugin update crashing after the rows are refreshed
Scalono
25.09.2026
Opisano tutaj
6.10.2026

Wpis powstał 11 dni po scaleniu zmiany.

Pelican Panel
Technologie:PHPLaravel

Co nie działało

Pelican to darmowy, otwarty panel do zarządzania serwerami gier, zbudowany na Laravelu i Dockerze. Lista pluginów jest w nim modelem opartym na bibliotece Sushi, która trzyma wiersze w pamięci zamiast w zwykłej tabeli.

Od jednej z wcześniejszych zmian metoda updatePlugin() po pobraniu nowej wersji wywoływała najpierw Plugin::refreshRows(), a potem $plugin->refresh(). Problem w tym, że refreshRows() zeruje połączenie Sushi, więc refresh() na starej instancji modelu kończył się błędem Call to a member function query() on null (zgłoszenie #2588). Aktualizacja pluginu z poziomu panelu po prostu się wywracała.

Co zmieniliśmy

Zamiast odświeżać starą instancję, kod pobiera rekord od nowa przez Plugin::findOrFail(), dokładnie tak, jak robią to już zadania pluginów w tym samym projekcie:

php
Plugin::refreshRows();
$plugin = Plugin::findOrFail($plugin->id);

updatePlugin() zwraca teraz zaktualizowany plugin, a kontroler API odsyła klientowi ten świeży obiekt zamiast nieaktualnej kopii sprzed aktualizacji.

Jak to sprawdziliśmy

Doszedł test integracyjny udanej aktualizacji: udawane pobranie paczki z nową wersją, aktualizacja i sprawdzenie stanu pluginu po niej. Na gałęzi main sprzed poprawki ten test kończy się dokładnie tym samym błędem, który opisywało zgłoszenie. Przy okazji test czyści wiersze Sushi po sobie, żeby usunięte pluginy nie przeciekały do kolejnych testów.

Efekt

Zmianę scalono 25 września 2026. Aktualizacja pluginów w Pelicanie działa z panelu i przez API.

Panel do zarządzania serwerami gier na Laravelu i Dockerze, fork Pterodactyla.

Język
PHP
Gwiazdki na GitHubie
2375

Ten sam przypadek przed zmianą i po niej

Na przykładzie z wpisu: co wychodziło przed poprawką i co wychodzi teraz.

Aktualizacja pluginu w panelu
updatePlugin()

Po pobraniu nowej wersji kod odświeża wiersze modelu Plugin, który biblioteka Sushi trzyma w pamięci.

Przed zmianą
Plugin::refreshRows();
$plugin->refresh();

refreshRows() zeruje połączenie Sushi, więc refresh() na starej instancji kończył się błędem query() on null (zgłoszenie #2588).

Po zmianie
Plugin::refreshRows();
$plugin = Plugin::findOrFail($plugin->id);

Rekord jest pobierany od nowa, updatePlugin() zwraca zaktualizowany plugin, a API odsyła świeży obiekt.

Czego nas to nauczyło

Aktualizacja, która w połowie drogi pada, nie może zostawić systemu w gorszym stanie niż przed nią. To samo sprawdzamy w aktualizacjach paneli, które budujemy.

Z opisu zmiany w pull requeście #2598; test integracyjny na gałęzi main sprzed poprawki kończy się tym samym błędem.

Pytania o zmianę #2598

Gdzie jest zmiana, jak ją sprawdziliśmy i kto ją przyjął.