Skip to content

Infinite loop when handling an exception (critical bug in my opinion) #774

Closed
@enumag

Description

@enumag

I'm using the Symfony bundle. I start my consumer using bin/console enqueue/consume and sure enough it works just fine.

However if one of the consumed messages causes an exception, the consumer freezes without even writing anything to console or log - the exception is nowhere to be seen.

I used xdebug to find out what caused it and I believe the reason is that Symfony/Console runs into an infinite loop while trying to print the exception.

The reason why that happens is this code in your bundle:

$wrapper = $e;
while ($prev = $wrapper->getPrevious()) {
if ($exception === $wrapper = $prev) {
throw $e;
}
}
if ($exception !== $wrapper) {
$prev = new \ReflectionProperty('Exception', 'previous');
$prev->setAccessible(true);
$prev->setValue($wrapper, $exception);
}

It effectively creates a pair of exceptions where each has set the other one as the previous:

$e->getPrevious()->getPrevious() === $e // true

(or a longer chain of exceptions where the last one has the first one as previous - still effectively a cycle of exceptions)

I don't quite understand what is the idea behind this but obviously when an error handler tries to dump the exception chain this causes an infinite loop because ->getPrevious() never returns null.

Can you explain what the code in QueueConsumer::onProcessorException() is supposed to do? I'm quite sure this isn't intentional. When I remove the code I linked above, everything works as expected.

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