pterodactyl / panel

Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.
https://pterodactyl.io
Other
6.7k stars 1.7k forks source link

Server transfer fails when server needs too long to stop #4656

Closed Sarsum closed 1 year ago

Sarsum commented 1 year ago

Current Behavior

The transfer of a server fails when the server needs too long to stop and the message Could not establish a connection to the machine running this server. Please try again. appears. It results in the server staying on the old node but being locked in the transfer state (you cannot start the server or initiate a new transfer until restarting wings).

I have had a look at the transfer logic in the wings. The old system started everything asynchronously (including the stopping the of server) while the new system tries to stop the server before returning a successfull message to the panel.

Expected Behavior

The transfer should run after the server is gracefully stopped.

It might be neccessary to move the stopping of the servers into an ansync function, since increasing the timeout for the request isn't very useful (there might always be servers that need too long stop).

Steps to Reproduce

  1. Start some kind of server which needs a long time to stop (e.g. a Minecraft modpack)
  2. Transfer it to another node

Panel Version

1.11.2

Wings Version

1.11.0

Games and/or Eggs Affected

No response

Docker Image

No response

Error Logs

[2023-01-17 07:40:56] production.WARNING: GuzzleHttp\Exception\ConnectException: cURL error 28: Operation timed out after 15001 milliseconds with 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://REDACTED/api/servers/REDACTED/transfer in /REDACTED/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:210
Stack trace:
#0 /REDACTED/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(158): GuzzleHttp\Handler\CurlFactory::createRejection()
#1 /REDACTED/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(110): GuzzleHttp\Handler\CurlFactory::finishError()
#2 /REDACTED/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(47): GuzzleHttp\Handler\CurlFactory::finish()
#3 /REDACTED/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke()
#4 /REDACTED/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(48): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}()
#5 /REDACTED/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(64): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}()
#6 /REDACTED/vendor/guzzlehttp/guzzle/src/Middleware.php(31): GuzzleHttp\PrepareBodyMiddleware->__invoke()
#7 /REDACTED/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(71): GuzzleHttp\Middleware::GuzzleHttp\{closure}()
#8 /REDACTED/vendor/guzzlehttp/guzzle/src/Middleware.php(63): GuzzleHttp\RedirectMiddleware->__invoke()
#9 /REDACTED/vendor/guzzlehttp/guzzle/src/HandlerStack.php(75): GuzzleHttp\Middleware::GuzzleHttp\{closure}()
#10 /REDACTED/vendor/guzzlehttp/guzzle/src/Client.php(331): GuzzleHttp\HandlerStack->__invoke()
#11 /REDACTED/vendor/guzzlehttp/guzzle/src/Client.php(168): GuzzleHttp\Client->transfer()
#12 /REDACTED/vendor/guzzlehttp/guzzle/src/Client.php(187): GuzzleHttp\Client->requestAsync()
#13 /REDACTED/vendor/guzzlehttp/guzzle/src/ClientTrait.php(95): GuzzleHttp\Client->request()
#14 /REDACTED/app/Repositories/Wings/DaemonTransferRepository.php(20): GuzzleHttp\Client->post()
#15 /REDACTED/app/Http/Controllers/Admin/Servers/ServerTransferController.php(84): Pterodactyl\Repositories\Wings\DaemonTransferRepository->notify()
#16 /REDACTED/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php(30): Pterodactyl\Http\Controllers\Admin\Servers\ServerTransferController->Pterodactyl\Http\Controllers\Admin\Servers\{closure}()
#17 /REDACTED/app/Http/Controllers/Admin/Servers/ServerTransferController.php(87): Illuminate\Database\Connection->transaction()
#18 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): Pterodactyl\Http\Controllers\Admin\Servers\ServerTransferController->transfer()
#19 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction()
#20 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Route.php(260): Illuminate\Routing\ControllerDispatcher->dispatch()
#21 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\Routing\Route->runController()
#22 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Router.php(798): Illuminate\Routing\Route->run()
#23 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Routing\Router->Illuminate\Routing\{closure}()
#24 /REDACTED/app/Http/Middleware/AdminAuthenticate.php(22): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#25 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Pterodactyl\Http\Middleware\AdminAuthenticate->handle()
#26 /REDACTED/app/Http/Middleware/RequireTwoFactorAuthentication.php(54): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#27 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Pterodactyl\Http\Middleware\RequireTwoFactorAuthentication->handle()
#28 /REDACTED/app/Http/Middleware/LanguageMiddleware.php(25): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#29 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Pterodactyl\Http\Middleware\LanguageMiddleware->handle()
#30 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#31 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Middleware\SubstituteBindings->handle()
#32 /REDACTED/vendor/laravel/framework/src/Illuminate/Session/Middleware/AuthenticateSession.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#33 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Session\Middleware\AuthenticateSession->handle()
#34 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#35 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle()
#36 /REDACTED/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#37 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\View\Middleware\ShareErrorsFromSession->handle()
#38 /REDACTED/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#39 /REDACTED/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest()
#40 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Session\Middleware\StartSession->handle()
#41 /REDACTED/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#42 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle()
#43 /REDACTED/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#44 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Cookie\Middleware\EncryptCookies->handle()
#45 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#46 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Router.php(799): Illuminate\Pipeline\Pipeline->then()
#47 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Router.php(776): Illuminate\Routing\Router->runRouteWithinStack()
#48 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Router.php(740): Illuminate\Routing\Router->runRoute()
#49 /REDACTED/vendor/laravel/framework/src/Illuminate/Routing/Router.php(729): Illuminate\Routing\Router->dispatchToRoute()
#50 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(190): Illuminate\Routing\Router->dispatch()
#51 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#52 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#53 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#54 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#55 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#56 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#57 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#58 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#59 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#60 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#61 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#62 /REDACTED/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#63 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\HandleCors->handle()
#64 /REDACTED/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#65 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\TrustProxies->handle()
#66 /REDACTED/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#67 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(165): Illuminate\Pipeline\Pipeline->then()
#68 /REDACTED/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(134): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#69 /REDACTED/public/index.php(68): Illuminate\Foundation\Http\Kernel->handle()
#70 {main} {"request_id":null}

Is there an existing issue for this?

matthewpi commented 1 year ago

https://github.com/pterodactyl/wings/commit/6e0c095bb8e15b835577dc2d17aa45529e2bd8a9 https://github.com/pterodactyl/wings/commit/a36cab1783d766f10ba038c62ce0bbb2226e0b87