Comments (7)
I got this error while trying to debug a connection issue by restarting rabbitmq. On the producer side, I was getting channel closed errors, but on the consumer side, I received large amounts of these.
from aioamqp.
Arf, py35. Could be why we've never seen this before. Any chance either of you could try your use case with 3.4 to confirm the impact?
Cheers
from aioamqp.
Python 3.5 StreamReaderProtocol sets self._stream_reader to None in connection_close:
def connection_lost(self, exc):
if self._stream_reader is not None:
if exc is None:
self._stream_reader.feed_eof()
else:
self._stream_reader.set_exception(exc)
super().connection_lost(exc)
self._stream_reader = None
self._stream_writer = None
The code needs to check if self._stream_reader is None (or infer that the connection has been closed some other way). I think this issue will be triggered by the task in run()/dispatch_frame() waiting for data to be read from the socket, and then the connection dies.
If the self.worker task (which is where the read_frame exception happens) would be cancelled on connection close, this would be avoided for example. It's also something that should be done to avoid warnings from asyncio, as now the task is left running indefinitely (though it dies on its own to that same exception when the transport is closed, the task is just never cleaned up).
from aioamqp.
In my local version, I've added this before any code where self.reader
is used:
if not self.reader:
logger.warning('No reader found.')
raise exceptions.ChannelClosed()
and then added code to catch the exception where those methods are used, though I don't seem to have caught it everywhere it shows up. If anyone could help with letting me know if that's the proper way to check for it, and if so, at what level of the code I should catch them (in .protocol? outside the package where I use it?) I would really appreciate it. This, or some other way to handle the error, should also be added to the code here once it's been tested.
from aioamqp.
I actually only added this exception catching to .protocol.py
's run()
method:
except exceptions.ChannelClosed as exc:
logger.error('protocol.py: Channel closed, close connection')
self.stop_now.set_result(None)
self._close_channels(exception=exc)
after the except
defined for exceptions.AmqpClosedConnection
and that seems to have worked, though I haven't been able to induce the error state reliably in order to test it thoroughly.
from aioamqp.
So this issue may still happen further along in the same function (there's another call to readexactly()
), the first one is the most likely to cause issues. Let's see if this fix helps and we can fix further fall out later.
Thanks
from aioamqp.
Hi! When you plan to release this bugfix?
from aioamqp.
Related Issues (20)
- rabbitmqctl list_queues via aioamqp HOT 1
- Cleanup login method HOT 1
- channel.basic_consume API docs HOT 2
- AttributeError: 'Channel' object has no attribute 'basic_ack' HOT 1
- Message Properties: 'type' property HOT 7
- If value passed to 'x-message-ttl' is greater than or equal 128, then invalid Negative value is sending to server HOT 3
- Channel publish requires a lock
- Python3.8
- Init login method default value 'AMQPLAIN' HOT 2
- Testing with pamqp 3.0 HOT 6
- Is there any usage example or tutorial documents HOT 1
- Publishing to a non-existing exchange does not raise errors HOT 1
- Republish the pypi docs to pick up Python3.9 HOT 3
- Support server-generated queue names
- AmazonMQ issues on `queue_declare` HOT 1
- Ready for release on pypi? HOT 1
- Channel.basic_server_ack doesn't respect `multiple` flag HOT 3
- Unable to subscribe to a queue with wildcard (asterisk) HOT 3
- using tag uri scheme for queue and exchange names are not longer possible HOT 1
- No longer handling CancelledError on protocol.run
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from aioamqp.