Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Dear release team, This is a bug-fix point release from upstream adding some exception handling in the oslo.messaging code, which I believe would be valuable to have in Debian. Only the .py upstream source code change is relevant to read in the attached debdiff (the rest of is upstream CI configuration). Please unblock python-oslo.messaging/12.5.2-1. Cheers, Thomas Goirand (zigo)
diff -Nru python-oslo.messaging-12.5.1/debian/changelog python-oslo.messaging-12.5.2/debian/changelog --- python-oslo.messaging-12.5.1/debian/changelog 2020-12-20 10:30:34.000000000 +0100 +++ python-oslo.messaging-12.5.2/debian/changelog 2021-03-31 13:18:24.000000000 +0200 @@ -1,3 +1,9 @@ +python-oslo.messaging (12.5.2-1) unstable; urgency=medium + + * New upstream release. + + -- Thomas Goirand <z...@debian.org> Wed, 31 Mar 2021 13:18:24 +0200 + python-oslo.messaging (12.5.1-1) unstable; urgency=medium * New upstream version diff -Nru python-oslo.messaging-12.5.1/doc/source/admin/rabbit.rst python-oslo.messaging-12.5.2/doc/source/admin/rabbit.rst --- python-oslo.messaging-12.5.1/doc/source/admin/rabbit.rst 2020-10-15 14:25:27.000000000 +0200 +++ python-oslo.messaging-12.5.2/doc/source/admin/rabbit.rst 2021-02-18 11:46:49.000000000 +0100 @@ -66,7 +66,8 @@ through the *Connection* class. With mandatory flag RabbitMQ raises a callback if the message is not routed to -any queue. +any queue. This callback will be used to loop for a timeout and let's a chance +to sender to recover. .. _Exchange is a AMQP mechanism: https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchanges .. _queues: https://www.rabbitmq.com/queues.html diff -Nru python-oslo.messaging-12.5.1/lower-constraints.txt python-oslo.messaging-12.5.2/lower-constraints.txt --- python-oslo.messaging-12.5.1/lower-constraints.txt 2020-10-15 14:25:27.000000000 +0200 +++ python-oslo.messaging-12.5.2/lower-constraints.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,83 +0,0 @@ -alabaster==0.7.10 -amqp==2.5.2 -appdirs==1.3.0 -Babel==2.3.4 -bandit==1.1.0 -cachetools==2.0.0 -cffi==1.14.0 -cliff==2.8.0 -cmd2==0.8.0 -confluent-kafka==1.3.0 -contextlib2==0.4.0 -coverage==4.0 -debtcollector==1.2.0 -docutils==0.11 -dulwich==0.15.0 -eventlet==0.23.0 -extras==1.0.0 -fasteners==0.7.0 -fixtures==3.0.0 -futurist==1.2.0 -gitdb==0.6.4 -GitPython==1.0.1 -greenlet==0.4.15 -imagesize==0.7.1 -iso8601==0.1.11 -Jinja2==2.10 -keystoneauth1==3.4.0 -kombu==4.6.6 -linecache2==1.0.0 -MarkupSafe==1.1.1 -mock==2.0.0 -mox3==0.20.0 -msgpack-python==0.4.0 -netaddr==0.8.0 -netifaces==0.10.4 -os-client-config==1.28.0 -oslo.concurrency==3.25.0 -oslo.config==5.2.0 -oslo.context==2.19.2 -oslo.i18n==3.15.3 -oslo.log==3.36.0 -oslo.middleware==3.31.0 -oslo.serialization==2.18.0 -oslo.service==1.24.0 -oslo.utils==3.37.0 -oslotest==3.2.0 -Paste==2.0.2 -PasteDeploy==1.5.0 -pbr==2.0.0 -pifpaf==2.2.0 -prettytable==0.7.2 -pycparser==2.18 -Pygments==2.2.0 -pyinotify==0.9.6 -pyngus==2.2.0 -pyparsing==2.1.0 -pyperclip==1.5.27 -python-dateutil==2.5.3 -python-mimeparse==1.6.0 -python-qpid-proton==0.20.0 -python-subunit==1.0.0 -pytz==2013.6 -PyYAML==3.13 -repoze.lru==0.7 -requests==2.14.2 -requestsexceptions==1.2.0 -rfc3986==0.3.1 -Routes==2.3.1 -six==1.10.0 -smmap==0.9.0 -snowballstemmer==1.2.1 -statsd==3.2.1 -stestr==2.0.0 -stevedore==1.20.0 -tenacity==4.4.0 -testscenarios==0.4 -testtools==2.2.0 -traceback2==1.4.0 -unittest2==1.1.0 -vine==1.1.4 -WebOb==1.7.1 -wrapt==1.7.0 -xattr==0.9.2 diff -Nru python-oslo.messaging-12.5.1/oslo_messaging/_drivers/amqpdriver.py python-oslo.messaging-12.5.2/oslo_messaging/_drivers/amqpdriver.py --- python-oslo.messaging-12.5.1/oslo_messaging/_drivers/amqpdriver.py 2020-10-15 14:25:27.000000000 +0200 +++ python-oslo.messaging-12.5.2/oslo_messaging/_drivers/amqpdriver.py 2021-02-18 11:46:49.000000000 +0100 @@ -145,39 +145,67 @@ while True: try: with self.listener.driver._get_connection( - rpc_common.PURPOSE_SEND) as conn: + rpc_common.PURPOSE_SEND, + ) as conn: self._send_reply(conn, reply, failure) + return - except rpc_amqp.AMQPDestinationNotFound: - if timer.check_return() > 0: - LOG.debug(("The reply %(msg_id)s cannot be sent " - "%(reply_q)s reply queue doesn't exist, " - "retrying..."), { - 'msg_id': self.msg_id, - 'reply_q': self.reply_q}) - time.sleep(0.25) - else: + except oslo_messaging.MessageUndeliverable: + # queue not found + if timer.check_return() <= 0: self._obsolete_reply_queues.add(self.reply_q, self.msg_id) - infos = { + LOG.error( + 'The reply %(msg_id)s failed to send after ' + '%(duration)d seconds due to a missing queue ' + '(%(reply_q)s). Abandoning...', { + 'msg_id': self.msg_id, + 'duration': duration, + 'reply_q': self.reply_q}) + return + + LOG.debug( + 'The reply %(msg_id)s could not be sent due to a missing ' + 'queue (%(reply_q)s). Retrying...', { 'msg_id': self.msg_id, - 'reply_q': self.reply_q, - 'duration': duration - } - LOG.info("The reply %(msg_id)s cannot be sent " - "%(reply_q)s reply queue don't exist after " - "%(duration)s sec abandoning...", infos) + 'reply_q': self.reply_q}) + time.sleep(0.25) + except rpc_amqp.AMQPDestinationNotFound as exc: + # exchange not found/down + if timer.check_return() <= 0: + self._obsolete_reply_queues.add(self.reply_q, self.msg_id) + LOG.error( + 'The reply %(msg_id)s failed to send after ' + '%(duration)d seconds due to a broker issue ' + '(%(exc)s). Abandoning...', { + 'msg_id': self.msg_id, + 'duration': duration, + 'exc': exc}) return + LOG.debug( + 'The reply %(msg_id)s could not be sent due to a broker ' + 'issue (%(exc)s). Retrying...', { + 'msg_id': self.msg_id, + 'exc': exc}) + time.sleep(0.25) + def heartbeat(self): # generate a keep alive for RPC call monitoring with self.listener.driver._get_connection( - rpc_common.PURPOSE_SEND) as conn: + rpc_common.PURPOSE_SEND, + ) as conn: try: self._send_reply(conn, None, None, ending=False) + except oslo_messaging.MessageUndeliverable: + # internal exception that indicates queue gone - + # broker unreachable. + raise MessageDeliveryFailure( + "Heartbeat send failed. Missing queue") except rpc_amqp.AMQPDestinationNotFound: - # internal exception that indicates queue/exchange gone - + # internal exception that indicates exchange gone - # broker unreachable. - raise MessageDeliveryFailure("Heartbeat send failed") + raise MessageDeliveryFailure( + "Heartbeat send failed. Missing exchange") # NOTE(sileht): Those have already be ack in RpcListener IO thread # We keep them as noop until all drivers do the same diff -Nru python-oslo.messaging-12.5.1/oslo_messaging/_drivers/impl_rabbit.py python-oslo.messaging-12.5.2/oslo_messaging/_drivers/impl_rabbit.py --- python-oslo.messaging-12.5.1/oslo_messaging/_drivers/impl_rabbit.py 2020-10-15 14:25:27.000000000 +0200 +++ python-oslo.messaging-12.5.2/oslo_messaging/_drivers/impl_rabbit.py 2021-02-18 11:46:49.000000000 +0100 @@ -167,12 +167,18 @@ default=2, help='How often times during the heartbeat_timeout_threshold ' 'we check the heartbeat.'), - cfg.IntOpt('direct_mandatory_flag', - default=True, - help='Enable/Disable the RabbitMQ mandatory flag ' - 'for direct send. The direct send is used as reply, ' - 'so the MessageUndeliverable exception is raised ' - 'in case the client queue does not exist.'), + cfg.BoolOpt('direct_mandatory_flag', + default=True, + deprecated_for_removal=True, + deprecated_reason='Mandatory flag no longer deactivable.', + help='(DEPRECATED) Enable/Disable the RabbitMQ mandatory ' + 'flag for direct send. The direct send is used as reply, ' + 'so the MessageUndeliverable exception is raised ' + 'in case the client queue does not exist.' + 'MessageUndeliverable exception will be used to loop for a ' + 'timeout to lets a chance to sender to recover.' + 'This flag is deprecated and it will not be possible to ' + 'deactivate this functionality anymore'), cfg.BoolOpt('enable_cancel_on_failover', default=False, help="Enable x-cancel-on-ha-failover flag so that " @@ -510,6 +516,7 @@ # if it was already monkey patched by eventlet/greenlet. global threading threading = stdlib_threading + self.direct_mandatory_flag = driver_conf.direct_mandatory_flag if self.ssl: diff -Nru python-oslo.messaging-12.5.1/releasenotes/notes/disable-mandatory-flag-a6210a534f3853f0.yaml python-oslo.messaging-12.5.2/releasenotes/notes/disable-mandatory-flag-a6210a534f3853f0.yaml --- python-oslo.messaging-12.5.1/releasenotes/notes/disable-mandatory-flag-a6210a534f3853f0.yaml 1970-01-01 01:00:00.000000000 +0100 +++ python-oslo.messaging-12.5.2/releasenotes/notes/disable-mandatory-flag-a6210a534f3853f0.yaml 2021-02-18 11:46:49.000000000 +0100 @@ -0,0 +1,5 @@ +--- +upgrade: + - | + Deprecating the ``direct_mandatory_flag``. It will not be possible to + deactivate this functionality anymore. diff -Nru python-oslo.messaging-12.5.1/releasenotes/notes/handle-missing-queue-553a803f94976be7.yaml python-oslo.messaging-12.5.2/releasenotes/notes/handle-missing-queue-553a803f94976be7.yaml --- python-oslo.messaging-12.5.1/releasenotes/notes/handle-missing-queue-553a803f94976be7.yaml 1970-01-01 01:00:00.000000000 +0100 +++ python-oslo.messaging-12.5.2/releasenotes/notes/handle-missing-queue-553a803f94976be7.yaml 2021-02-18 11:46:49.000000000 +0100 @@ -0,0 +1,5 @@ +--- +features: + - | + Adding retry strategy based on the mandatory flag. Missing exchanges and + queues are now identified separately for logging purposes. diff -Nru python-oslo.messaging-12.5.1/tox.ini python-oslo.messaging-12.5.2/tox.ini --- python-oslo.messaging-12.5.1/tox.ini 2020-10-15 14:25:27.000000000 +0200 +++ python-oslo.messaging-12.5.2/tox.ini 2021-02-18 11:46:49.000000000 +0100 @@ -118,9 +118,3 @@ [testenv:bindep] deps = bindep commands = bindep {posargs} - -[testenv:lower-constraints] -deps = - -c{toxinidir}/lower-constraints.txt - -r{toxinidir}/test-requirements.txt - -r{toxinidir}/requirements.txt diff -Nru python-oslo.messaging-12.5.1/.zuul.yaml python-oslo.messaging-12.5.2/.zuul.yaml --- python-oslo.messaging-12.5.1/.zuul.yaml 2020-10-15 14:25:27.000000000 +0200 +++ python-oslo.messaging-12.5.2/.zuul.yaml 2021-02-18 11:46:49.000000000 +0100 @@ -108,7 +108,6 @@ - check-requirements - lib-forward-testing-python3 - openstack-cover-jobs - - openstack-lower-constraints-jobs - openstack-python3-victoria-jobs - periodic-stable-jobs - publish-openstack-docs-pti