amphp / mysql

An async MySQL client for PHP, optimizing database interactions with efficient non-blocking capabilities. Perfect for responsive, high-performance applications.
Other
358 stars 63 forks source link

ConnectionPool is not restoring connection when database restarts. #30

Closed marcioAlmada closed 7 years ago

marcioAlmada commented 7 years ago

Using https://github.com/amphp/mysql/commit/21801b09af6da5d14c949cc0b6ce1c260330c30d Currently a connection pool owned by an Aerys application is not able to recover when the database restarts. Error:

"ArgumentCountError: Too few arguments to function Amp\\Mysql\\Connection::Amp\\Mysql\\{closure}(), 0 passed in ./vendor/vendor/amphp/mysql/lib/Stmt.php on line 42 and exactly 1 expected in ./vendor/vendor/amphp/mysql/lib/Connection.php:40
Stack trace:
#0 ./vendor/vendor/amphp/mysql/lib/Stmt.php(42): Amp\\Mysql\\Connection::Amp\\Mysql\\{closure}()
#1 ./vendor/vendor/amphp/mysql/lib/Stmt.php(139): Amp\\Mysql\\Stmt->conn()
#2 ./vendor/src/DataStorage/MysqlAsyncStorage.php(228): Amp\\Mysql\\Stmt->execute(Array)
#3 ./vendor/src/DataStorage/MysqlAsyncStorage.php(131): Fs\\Blacklist\\DataStorage\\MysqlAsyncStorage->do('msisdn_permissi...', Array)
#4 ./vendor/src/RouteHandler/V3/MsisdnStatusHandler.php(53): Fs\\Blacklist\\DataStorage\\MysqlAsyncStorage->getMsisdnPermissionHistory('vivo', '5511981349170', NULL)
#5 ./vendor/src/AbstractRestHandler.php(73): Fs\\Blacklist\\RouteHandler\\V3\\MsisdnStatusHandler->get(Object(Aerys\\StandardRequest), Object(Aerys\\StandardResponse), Object(stdClass))
#6 ./vendor/vendor/amphp/aerys/lib/Bootstrapper.php(212): Fs\\Blacklist\\AbstractRestHandler->__invoke(Object(Aerys\\StandardRequest), Object(Aerys\\StandardResponse), Array)
#7 [internal function]: class@anonymous->__invoke(Object(Aerys\\StandardRequest), Object(Aerys\\StandardResponse))
#8 ./vendor/vendor/amphp/amp/lib/functions.php(791): Generator->current()
#9 ./vendor/vendor/amphp/amp/lib/functions.php(779): Amp\\__coroutineAdvance(Object(Amp\\CoroutineState))
#10 ./vendor/vendor/amphp/aerys/lib/Server.php(765): Amp\\resolve(Object(Generator))
#11 ./vendor/vendor/amphp/aerys/lib/Server.php(716): Aerys\\Server->tryApplication(Object(Aerys\\InternalRequest), Object(class@anonymous), Array)
#12 ./vendor/vendor/amphp/aerys/lib/Server.php(555): Aerys\\Server->respond(Object(Aerys\\InternalRequest))
#13 ./vendor/vendor/amphp/aerys/lib/Server.php(530): Aerys\\Server->onParsedMessageWithoutEntity(Object(Aerys\\Client), Array)
#14 ./vendor/vendor/amphp/aerys/lib/Http1Driver.php(318): Aerys\\Server->onParseEmit(Object(Aerys\\Client), 2, Array, NULL)
#15 [internal function]: Aerys\\Http1Driver->parser(Object(Aerys\\Client))
#16 ./vendor/vendor/amphp/aerys/lib/Server.php(524): Generator->send('GET /v3/vivo/ms...')
#17 ./vendor/vendor/amphp/amp/lib/UvReactor.php(424): Aerys\\Server->onReadable('000000004153540...', Resource id #268, Object(Aerys\\Client))
#18 ./vendor/vendor/amphp/amp/lib/UvReactor.php(401): Amp\\UvReactor->invokePollWatcher(Object(stdClass))
#19 [internal function]: Amp\\UvReactor->Amp\\{closure}(Resource id #269, 0, 1, Resource id #268)
#20 ./vendor/vendor/amphp/amp/lib/UvReactor.php(93): uv_run(Resource id #60, 1)
#21 ./vendor/vendor/amphp/amp/lib/functions.php(46): Amp\\UvReactor->run(Object(Closure))
#22 ./vendor/vendor/amphp/aerys/bin/aerys(106): Amp\\run(Object(Closure))
#23 {main}
DaveRandom commented 7 years ago

For ref, this requires an $init arg, but is invoked here with no arg as $restore()

marcioAlmada commented 7 years ago

@DaveRandom good catch, FYI there is a PR #31

bwoebi commented 7 years ago

Yep, thanks. This can be closed now with #31 being merged?

marcioAlmada commented 7 years ago

I'm kinda stuck now. Let me confirm in a few hours.

marcioAlmada commented 7 years ago

Yep, it seems fixed. The case of prepared statement reuse + database restart is still crashing. I'll see if it's possible to fix the issue through another pull request.

Thanks!

bwoebi commented 7 years ago

@marcioAlmada If you do know how to effectively test these things, it would be much appreciated...

kelunik commented 7 years ago

Just restarting the server in a test case.