Skip to content

DB Connection failure effectively kills queue daemon #18669

@pdbreen

Description

@pdbreen
  • Laravel Version: 5.4.17
  • PHP Version: 7.0
  • Database Driver & Version: Aurora

Description:

Last night, each default DB queue daemon encountered a PDO connection refused error (these can occur on occasion within the AWS infrastructure). This left each daemon running, but in a useless state as any subsequent attempt to perform work resulted in an error attempting to invoke beginTransaction() on null. Restarting queues resolved issue.

Relevant stack traces follow:

Initial error (same error across every daemon instance)

Caused: PDOException SQLSTATE[HY000] [2002] Connection refused 
    vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:43 PDO::__construct
    vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:43 Doctrine\DBAL\Driver\PDOConnection::__construct
    vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:65 Illuminate\Database\Connectors\Connector::createPdoConnection
    vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:43 Illuminate\Database\Connectors\Connector::createConnection
    vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php:24 Illuminate\Database\Connectors\MySqlConnector::connect
    vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php:183 Illuminate\Database\Connectors\ConnectionFactory::Illuminate\Database\Connectors\{closure}
    [internal] call_user_func
    vendor/laravel/framework/src/Illuminate/Database/Connection.php:882 Illuminate\Database\Connection::getPdo
    vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:245 Illuminate\Database\DatabaseManager::refreshPdoConnections
    vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:231 Illuminate\Database\DatabaseManager::reconnect
    vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:165 Illuminate\Database\DatabaseManager::Illuminate\Database\{closure}
    [internal] call_user_func
    vendor/laravel/framework/src/Illuminate/Database/Connection.php:735 Illuminate\Database\Connection::reconnect
    vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:140 Illuminate\Database\Connection::handleBeginTransactionException
    vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:110 Illuminate\Database\Connection::createTransaction
    vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:92 Illuminate\Database\Connection::beginTransaction
    vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php:192 Illuminate\Queue\DatabaseQueue::pop
    vendor/laravel/framework/src/Illuminate/Queue/Worker.php:236 Illuminate\Queue\Worker::getNextJob
    vendor/laravel/framework/src/Illuminate/Queue/Worker.php:101 Illuminate\Queue\Worker::daemon
    vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php:100 Illuminate\Queue\Console\WorkCommand::runWorker
    vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php:83 Illuminate\Queue\Console\WorkCommand::fire
    [internal] call_user_func_array
    vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29 Illuminate\Container\BoundMethod::Illuminate\Container\{closure}
    vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87 Illuminate\Container\BoundMethod::callBoundMethod
    vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31 Illuminate\Container\BoundMethod::call
    vendor/laravel/framework/src/Illuminate/Container/Container.php:531 Illuminate\Container\Container::call
    vendor/laravel/framework/src/Illuminate/Console/Command.php:182 Illuminate\Console\Command::execute
    vendor/symfony/console/Command/Command.php:265 Symfony\Component\Console\Command\Command::run
    vendor/laravel/framework/src/Illuminate/Console/Command.php:167 Illuminate\Console\Command::run
    vendor/symfony/console/Application.php:826 Symfony\Component\Console\Application::doRunCommand
    vendor/symfony/console/Application.php:189 Symfony\Component\Console\Application::doRun
    vendor/symfony/console/Application.php:120 Symfony\Component\Console\Application::run
    vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:123 Illuminate\Foundation\Console\Kernel::handle
    artisan:36 [main]

Subsequent failures on every queue attempt to perform work

Symfony\Component\Debug\Exception\FatalThrowableError Call to a member function beginTransaction() on null 
    vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:108 Illuminate\Database\Connection::createTransaction
    vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:92 Illuminate\Database\Connection::beginTransaction
    vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php:192 Illuminate\Queue\DatabaseQueue::pop
    vendor/laravel/framework/src/Illuminate/Queue/Worker.php:236 Illuminate\Queue\Worker::getNextJob
    vendor/laravel/framework/src/Illuminate/Queue/Worker.php:101 Illuminate\Queue\Worker::daemon
    vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php:100 Illuminate\Queue\Console\WorkCommand::runWorker
    vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php:83 Illuminate\Queue\Console\WorkCommand::fire
    [internal] call_user_func_array
    vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29 Illuminate\Container\BoundMethod::Illuminate\Container\{closure}
    vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87 Illuminate\Container\BoundMethod::callBoundMethod
    vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31 Illuminate\Container\BoundMethod::call
    vendor/laravel/framework/src/Illuminate/Container/Container.php:531 Illuminate\Container\Container::call
    vendor/laravel/framework/src/Illuminate/Console/Command.php:182 Illuminate\Console\Command::execute
    vendor/symfony/console/Command/Command.php:265 Symfony\Component\Console\Command\Command::run
    vendor/laravel/framework/src/Illuminate/Console/Command.php:167 Illuminate\Console\Command::run
    vendor/symfony/console/Application.php:826 Symfony\Component\Console\Application::doRunCommand
    vendor/symfony/console/Application.php:189 Symfony\Component\Console\Application::doRun
    vendor/symfony/console/Application.php:120 Symfony\Component\Console\Application::run
    vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:123 Illuminate\Foundation\Console\Kernel::handle
    artisan:36 [main]

Steps To Reproduce:

Unsure, but it seems simulating a connection failure during a queued job execution could recreate situation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions