)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"787a06ead6b2d2b3a226dd005e0b081730968197","unresolved":true,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"If this situation is detected then a warning is logged and"},{"line_number":21,"context_line":"an ``ExchangeLimitReached`` exception is raised to allow"},{"line_number":22,"context_line":"upper layers to implement a retry strategy."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"[1] https://github.com/rabbitmq/rabbitmq-server/releases/tag/v4.1.4"},{"line_number":25,"context_line":"[2] https://github.com/rabbitmq/rabbitmq-server/pull/14339/files"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"554cc68a_69e5d856","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":43},"updated":"2025-11-10 15:39:55.000000000","message":"So I re-looked into the existing logic and noticed that this new exception may be just translated to MessageDeliveryFailure by Connection.ensure and there is not real way to upper layers to identify the error cause. Do I misunderstand something ?","commit_id":"2a2a76f74f794f98c40abdfb13030eb11a15a94b"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"dad171ec7ec7b85a1f8029e2210b1b0efd98945e","unresolved":true,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"If this situation is detected then a warning is logged and"},{"line_number":21,"context_line":"an ``ExchangeLimitReached`` exception is raised to allow"},{"line_number":22,"context_line":"upper layers to implement a retry strategy."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"[1] https://github.com/rabbitmq/rabbitmq-server/releases/tag/v4.1.4"},{"line_number":25,"context_line":"[2] https://github.com/rabbitmq/rabbitmq-server/pull/14339/files"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"68227f9d_961d40c3","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":43},"in_reply_to":"554cc68a_69e5d856","updated":"2025-11-12 09:14:33.000000000","message":"Indeed, you are right, I missed to isolate this new `ExchangeLimitReached` exception type from the exception management logic of the Connection.ensure method.","commit_id":"2a2a76f74f794f98c40abdfb13030eb11a15a94b"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"25b1bd3d357f8b78dd272fbd85dd2c11e2e19580","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e2cf2f7d_075dc4e7","updated":"2025-11-04 13:16:12.000000000","message":"I think I addressed all your comments, let me know if they match your ideas.\nConcerning the follow-up patch, I\u0027ll rework it once this patch will be merged to avoid resolving conflicts in series.","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5cb384aa2db60331a9eefb693ef98337dcc75c56","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6fc854a9_0f472bc3","updated":"2025-10-23 13:15:10.000000000","message":"agreed with tkajinam","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"af1b37feb66da7a53a920fed1c1422a4e001e94a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3f26f928_5ced944a","updated":"2025-11-12 09:17:07.000000000","message":"@Takashi: Thanks for your previous review. I left your comments opened. I\u0027ll let you close them if you estimate that they are solved, else please let me know if some aspects are not clear.","commit_id":"3bc41510c37bbbdf3ef407dafa0357e784e63f60"}],"oslo_messaging/_drivers/impl_rabbit.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"57138cc1e65547cb05ac1aea6a0c158b0d9468ff","unresolved":true,"context_lines":[{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    LOG.warning("},{"line_number":1626,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1627,"context_line":"                        \"cluster limit reached\")"},{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ed420780_2d551aca","line":1628,"range":{"start_line":1625,"start_character":0,"end_line":1628,"end_character":67},"updated":"2025-10-23 10:43:52.000000000","message":"Can we just pack these into a single line so that the line can be more easily grep-ed ?","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"ba77edd8b54e6daca47aa3d81edec77af90c1957","unresolved":true,"context_lines":[{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    LOG.warning("},{"line_number":1626,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1627,"context_line":"                        \"cluster limit reached\")"},{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""}],"source_content_type":"text/x-python","patch_set":2,"id":"826c4c46_7c70dbd8","line":1628,"range":{"start_line":1625,"start_character":0,"end_line":1628,"end_character":67},"in_reply_to":"0cbb64b0_401a6ada","updated":"2025-11-04 12:54:39.000000000","message":"And merging 1626 and 1627 into a single line would lead to line length over 80 chars","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"425fbb12d258b417844ab30ae03a3e7474414704","unresolved":false,"context_lines":[{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    LOG.warning("},{"line_number":1626,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1627,"context_line":"                        \"cluster limit reached\")"},{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff0bde3d_38e04258","line":1628,"range":{"start_line":1625,"start_character":0,"end_line":1628,"end_character":67},"in_reply_to":"3c1edbf6_95404695","updated":"2025-11-13 10:13:24.000000000","message":"Done","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"787a06ead6b2d2b3a226dd005e0b081730968197","unresolved":true,"context_lines":[{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    LOG.warning("},{"line_number":1626,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1627,"context_line":"                        \"cluster limit reached\")"},{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3c1edbf6_95404695","line":1628,"range":{"start_line":1625,"start_character":0,"end_line":1628,"end_character":67},"in_reply_to":"40d4669f_86692316","updated":"2025-11-10 15:39:55.000000000","message":"Reading the existing code, I see in most call cases these exceptions is logged by _error_callback defined in _ensure_publishing so I think these logs are just redundant.","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"25b1bd3d357f8b78dd272fbd85dd2c11e2e19580","unresolved":false,"context_lines":[{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    LOG.warning("},{"line_number":1626,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1627,"context_line":"                        \"cluster limit reached\")"},{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""}],"source_content_type":"text/x-python","patch_set":2,"id":"efd87373_8cbe977e","line":1628,"range":{"start_line":1625,"start_character":0,"end_line":1628,"end_character":67},"in_reply_to":"826c4c46_7c70dbd8","updated":"2025-11-04 13:16:12.000000000","message":"Done","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"57a01fde68c65abdde805550b386dba0b4bb64cc","unresolved":true,"context_lines":[{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    LOG.warning("},{"line_number":1626,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1627,"context_line":"                        \"cluster limit reached\")"},{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""}],"source_content_type":"text/x-python","patch_set":2,"id":"0cbb64b0_401a6ada","line":1628,"range":{"start_line":1625,"start_character":0,"end_line":1628,"end_character":67},"in_reply_to":"ed420780_2d551aca","updated":"2025-11-04 12:52:24.000000000","message":"Just to be sure, you want to merge both logs warnings, or just line 1626 and 1627?","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"01219e725f036497778f492ef4f38e41d72922d5","unresolved":true,"context_lines":[{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    LOG.warning("},{"line_number":1626,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1627,"context_line":"                        \"cluster limit reached\")"},{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""}],"source_content_type":"text/x-python","patch_set":2,"id":"40d4669f_86692316","line":1628,"range":{"start_line":1625,"start_character":0,"end_line":1628,"end_character":67},"in_reply_to":"efd87373_8cbe977e","updated":"2025-11-10 15:14:39.000000000","message":"What I was requesting was to merge two LOG.warning call to a single one so I think it\u0027s not yet done.","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"57138cc1e65547cb05ac1aea6a0c158b0d9468ff","unresolved":true,"context_lines":[{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""},{"line_number":1632,"context_line":"                        \"a retry strategy.\")"},{"line_number":1633,"context_line":"            self._declared_exchanges.add(exchange.name)"},{"line_number":1634,"context_line":""},{"line_number":1635,"context_line":"        log_info \u003d {\u0027msg\u0027: msg,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ec59cde5_9eff6d7a","line":1632,"range":{"start_line":1631,"start_character":48,"end_line":1632,"end_character":42},"updated":"2025-10-23 10:43:52.000000000","message":"I\u0027m not too sure about this message because it\u0027s not very clear if retry is a good/only solution. There can be a case where operators just prefer bumping the limit.\n\nI\u0027d rather think that \"cluster limit reached\" would be enough and operators/developers should decide the required action on that bare error message.\n\n(the same may be applied to the release note and commit message)","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"25b1bd3d357f8b78dd272fbd85dd2c11e2e19580","unresolved":false,"context_lines":[{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""},{"line_number":1632,"context_line":"                        \"a retry strategy.\")"},{"line_number":1633,"context_line":"            self._declared_exchanges.add(exchange.name)"},{"line_number":1634,"context_line":""},{"line_number":1635,"context_line":"        log_info \u003d {\u0027msg\u0027: msg,"}],"source_content_type":"text/x-python","patch_set":2,"id":"948f6e19_fc7d1127","line":1632,"range":{"start_line":1631,"start_character":48,"end_line":1632,"end_character":42},"in_reply_to":"74c2d6b9_16629aa9","updated":"2025-11-04 13:16:12.000000000","message":"Done","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"57a01fde68c65abdde805550b386dba0b4bb64cc","unresolved":true,"context_lines":[{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""},{"line_number":1632,"context_line":"                        \"a retry strategy.\")"},{"line_number":1633,"context_line":"            self._declared_exchanges.add(exchange.name)"},{"line_number":1634,"context_line":""},{"line_number":1635,"context_line":"        log_info \u003d {\u0027msg\u0027: msg,"}],"source_content_type":"text/x-python","patch_set":2,"id":"74c2d6b9_16629aa9","line":1632,"range":{"start_line":1631,"start_character":48,"end_line":1632,"end_character":42},"in_reply_to":"78898e10_1134f6c3","updated":"2025-11-04 12:52:24.000000000","message":"Ack, will rework it.","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5cb384aa2db60331a9eefb693ef98337dcc75c56","unresolved":true,"context_lines":[{"line_number":1628,"context_line":"                    LOG.warning(\"Server message: {err.reply_text}\")"},{"line_number":1629,"context_line":"                    raise exceptions.ExchangeLimitReached("},{"line_number":1630,"context_line":"                        f\"Cannot create exchange \u0027{exchange.name}\u0027: \""},{"line_number":1631,"context_line":"                        \"cluster limit reached. Consider implementing\""},{"line_number":1632,"context_line":"                        \"a retry strategy.\")"},{"line_number":1633,"context_line":"            self._declared_exchanges.add(exchange.name)"},{"line_number":1634,"context_line":""},{"line_number":1635,"context_line":"        log_info \u003d {\u0027msg\u0027: msg,"}],"source_content_type":"text/x-python","patch_set":2,"id":"78898e10_1134f6c3","line":1632,"range":{"start_line":1631,"start_character":48,"end_line":1632,"end_character":42},"in_reply_to":"ec59cde5_9eff6d7a","updated":"2025-10-23 13:15:10.000000000","message":"Agreed, fwiw","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"787a06ead6b2d2b3a226dd005e0b081730968197","unresolved":true,"context_lines":[{"line_number":1620,"context_line":"                elif \"PRECONDITION_FAILED - exchange limit of\" in str(err):"},{"line_number":1621,"context_line":"                    # Warn even if an exception is raised to ensure"},{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    ex \u003d exchange.name"},{"line_number":1626,"context_line":"                    msg \u003d f\"Can\u0027t create exchange \u0027{ex}\u0027 cluster limit reached\""}],"source_content_type":"text/x-python","patch_set":3,"id":"11ca8fa0_ff33b6b8","line":1623,"range":{"start_line":1623,"start_character":41,"end_line":1623,"end_character":51},"updated":"2025-11-10 15:39:55.000000000","message":"The commit message states Upper but here you say underlying. Which one is correct ?","commit_id":"2a2a76f74f794f98c40abdfb13030eb11a15a94b"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"425fbb12d258b417844ab30ae03a3e7474414704","unresolved":false,"context_lines":[{"line_number":1620,"context_line":"                elif \"PRECONDITION_FAILED - exchange limit of\" in str(err):"},{"line_number":1621,"context_line":"                    # Warn even if an exception is raised to ensure"},{"line_number":1622,"context_line":"                    # the awarness of a possible resource limit."},{"line_number":1623,"context_line":"                    # Could be useful if underlying layers decide to"},{"line_number":1624,"context_line":"                    # implement a retry logic."},{"line_number":1625,"context_line":"                    ex \u003d exchange.name"},{"line_number":1626,"context_line":"                    msg \u003d f\"Can\u0027t create exchange \u0027{ex}\u0027 cluster limit reached\""}],"source_content_type":"text/x-python","patch_set":3,"id":"0d874706_f99c56c9","line":1623,"range":{"start_line":1623,"start_character":41,"end_line":1623,"end_character":51},"in_reply_to":"11ca8fa0_ff33b6b8","updated":"2025-11-13 10:13:24.000000000","message":"Done","commit_id":"2a2a76f74f794f98c40abdfb13030eb11a15a94b"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"425fbb12d258b417844ab30ae03a3e7474414704","unresolved":true,"context_lines":[{"line_number":1181,"context_line":"            # NOTE(gsantomaggio): we must reraise this without"},{"line_number":1182,"context_line":"            # trigger error_callback"},{"line_number":1183,"context_line":"            raise"},{"line_number":1184,"context_line":"        except exceptions.ExchangeLimitReached:"},{"line_number":1185,"context_line":"            # NOTE(hberaud): we must reraise this without"},{"line_number":1186,"context_line":"            # trigger error_callback"},{"line_number":1187,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"84f5af29_7698f259","line":1184,"range":{"start_line":1184,"start_character":26,"end_line":1184,"end_character":46},"updated":"2025-11-13 10:13:24.000000000","message":"If we directly raise this to client then ExchangeLimitReached should inherit MessageDeliveryFailure, otherwise it breaks backword-compatibility.\n\nAlso, I\u0027m still unsure what is the handling we expect applications may implement for this specific error ? Could you describe it (in reply to this comment) more in detail ? I honestly don\u0027t know if any application can implement specific handling logic which always work for this error, because the error more looks like a problem at rabbitmq server side.","commit_id":"3bc41510c37bbbdf3ef407dafa0357e784e63f60"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"5b66d98414880db5b56a4b06a07027c33969954f","unresolved":true,"context_lines":[{"line_number":1181,"context_line":"            # NOTE(gsantomaggio): we must reraise this without"},{"line_number":1182,"context_line":"            # trigger error_callback"},{"line_number":1183,"context_line":"            raise"},{"line_number":1184,"context_line":"        except exceptions.ExchangeLimitReached:"},{"line_number":1185,"context_line":"            # NOTE(hberaud): we must reraise this without"},{"line_number":1186,"context_line":"            # trigger error_callback"},{"line_number":1187,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"a671016a_115a2b5b","line":1184,"range":{"start_line":1184,"start_character":26,"end_line":1184,"end_character":46},"in_reply_to":"29e2e15a_8e8db2e2","updated":"2025-11-17 09:39:03.000000000","message":"I think the exchange limit can be resolved during a retry if the server usage decreases between attempts, what\u0027s why I think it could be useful to raise an `ExchangeLimitReached`.\n\nBut if you prefer I could follow the classic `MessageDeliveryFailure` pace.","commit_id":"3bc41510c37bbbdf3ef407dafa0357e784e63f60"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"4d3eef47b94feb32261c4b4c788db1c0635a929d","unresolved":true,"context_lines":[{"line_number":1181,"context_line":"            # NOTE(gsantomaggio): we must reraise this without"},{"line_number":1182,"context_line":"            # trigger error_callback"},{"line_number":1183,"context_line":"            raise"},{"line_number":1184,"context_line":"        except exceptions.ExchangeLimitReached:"},{"line_number":1185,"context_line":"            # NOTE(hberaud): we must reraise this without"},{"line_number":1186,"context_line":"            # trigger error_callback"},{"line_number":1187,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"ebdef024_35bfb256","line":1184,"range":{"start_line":1184,"start_character":26,"end_line":1184,"end_character":46},"in_reply_to":"84f5af29_7698f259","updated":"2025-11-14 10:38:50.000000000","message":"You\u0027re right, this is a server-side limitation. However, the upper layer could implement an optional retry mechanism with a configurable failure rate, applying a threshold-based failure-aware decision pattern to enable smarter, adaptive handling.\n\nA kind of upper layer opt-in logic that could allow to choose between best effort mode vs fail fast modes.","commit_id":"3bc41510c37bbbdf3ef407dafa0357e784e63f60"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"7bbb0b36d469f2cd012e51c8cf75656613f8c4f8","unresolved":true,"context_lines":[{"line_number":1181,"context_line":"            # NOTE(gsantomaggio): we must reraise this without"},{"line_number":1182,"context_line":"            # trigger error_callback"},{"line_number":1183,"context_line":"            raise"},{"line_number":1184,"context_line":"        except exceptions.ExchangeLimitReached:"},{"line_number":1185,"context_line":"            # NOTE(hberaud): we must reraise this without"},{"line_number":1186,"context_line":"            # trigger error_callback"},{"line_number":1187,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":6,"id":"29e2e15a_8e8db2e2","line":1184,"range":{"start_line":1184,"start_character":26,"end_line":1184,"end_character":46},"in_reply_to":"ebdef024_35bfb256","updated":"2025-11-17 09:27:16.000000000","message":"Hmm... I\u0027m not too sure why that logic can be implemented specifically to exchange limit here, because I don\u0027t know if the exchange limit can be resolved during retry for certain reasons. For example what differs it from the","commit_id":"3bc41510c37bbbdf3ef407dafa0357e784e63f60"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"425fbb12d258b417844ab30ae03a3e7474414704","unresolved":true,"context_lines":[{"line_number":1617,"context_line":"                # NOTE(hberaud): Since v4.1.4 RabbitMQ allow to configure"},{"line_number":1618,"context_line":"                # a limit on the cluster-wide number of exchanges"},{"line_number":1619,"context_line":"                # that applications can create. The code below catch this"},{"line_number":1620,"context_line":"                # kind of error and log a warning to ensure that operators"},{"line_number":1621,"context_line":"                # are informed and then raise an Exception to allow upper"},{"line_number":1622,"context_line":"                # layers to implement retry strategies."},{"line_number":1623,"context_line":"                # https://github.com/rabbitmq/rabbitmq-server/pull/14339"}],"source_content_type":"text/x-python","patch_set":6,"id":"b2cbdb6f_316ea8dd","line":1620,"range":{"start_line":1620,"start_character":31,"end_line":1620,"end_character":50},"updated":"2025-11-13 10:13:24.000000000","message":"Maybe remove this ?","commit_id":"3bc41510c37bbbdf3ef407dafa0357e784e63f60"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"e9e1f46e77a7f4a68573fb4ed9a581d67a710b9b","unresolved":false,"context_lines":[{"line_number":1617,"context_line":"                # NOTE(hberaud): Since v4.1.4 RabbitMQ allow to configure"},{"line_number":1618,"context_line":"                # a limit on the cluster-wide number of exchanges"},{"line_number":1619,"context_line":"                # that applications can create. The code below catch this"},{"line_number":1620,"context_line":"                # kind of error and log a warning to ensure that operators"},{"line_number":1621,"context_line":"                # are informed and then raise an Exception to allow upper"},{"line_number":1622,"context_line":"                # layers to implement retry strategies."},{"line_number":1623,"context_line":"                # https://github.com/rabbitmq/rabbitmq-server/pull/14339"}],"source_content_type":"text/x-python","patch_set":6,"id":"12f47385_009c051c","line":1620,"range":{"start_line":1620,"start_character":31,"end_line":1620,"end_character":50},"in_reply_to":"b2cbdb6f_316ea8dd","updated":"2025-11-17 08:53:44.000000000","message":"Done","commit_id":"3bc41510c37bbbdf3ef407dafa0357e784e63f60"}],"releasenotes/notes/handle-cluster-exchange-limit-e845c4fa82f6bbba.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5cb384aa2db60331a9eefb693ef98337dcc75c56","unresolved":true,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Since version 4.1.4 RabbitMQ allow to configure a limit on the"},{"line_number":5,"context_line":"    cluster-wide number of exchanges that applications. That\u0027s a"},{"line_number":6,"context_line":"    guard against applications that leak resources."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    oslo.messaging now detect when the exchange limit is reached"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"b7237ab3_b929e7d5","line":5,"updated":"2025-10-23 13:15:10.000000000","message":"```suggestion\n    cluster-wide number of exchanges that applications as a\n```","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"25b1bd3d357f8b78dd272fbd85dd2c11e2e19580","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Since version 4.1.4 RabbitMQ allow to configure a limit on the"},{"line_number":5,"context_line":"    cluster-wide number of exchanges that applications. That\u0027s a"},{"line_number":6,"context_line":"    guard against applications that leak resources."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    oslo.messaging now detect when the exchange limit is reached"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"69377cf8_17f9d369","line":5,"in_reply_to":"b7237ab3_b929e7d5","updated":"2025-11-04 13:16:12.000000000","message":"Done","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5cb384aa2db60331a9eefb693ef98337dcc75c56","unresolved":true,"context_lines":[{"line_number":5,"context_line":"    cluster-wide number of exchanges that applications. That\u0027s a"},{"line_number":6,"context_line":"    guard against applications that leak resources."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    oslo.messaging now detect when the exchange limit is reached"},{"line_number":9,"context_line":"    when a publisher try to declare a new exchange and then raise"},{"line_number":10,"context_line":"    an ``ExchangeLimitReached`` exception to allow upper layers"},{"line_number":11,"context_line":"    to implement a retry strategy."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"538a9473_abdfb5ba","line":11,"range":{"start_line":8,"start_character":0,"end_line":11,"end_character":34},"updated":"2025-10-23 13:15:10.000000000","message":"```suggestion\n    oslo.messaging now detects when the exchange limit is reached\n    when a publisher tries to declare a new exchange and then raises\n    an ``ExchangeLimitReached`` exception. Upper layers are then\n    responsible for handling this, through e.g. increasing the limit\n    or implementing a retry strategy.\n```","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"25b1bd3d357f8b78dd272fbd85dd2c11e2e19580","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    cluster-wide number of exchanges that applications. That\u0027s a"},{"line_number":6,"context_line":"    guard against applications that leak resources."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    oslo.messaging now detect when the exchange limit is reached"},{"line_number":9,"context_line":"    when a publisher try to declare a new exchange and then raise"},{"line_number":10,"context_line":"    an ``ExchangeLimitReached`` exception to allow upper layers"},{"line_number":11,"context_line":"    to implement a retry strategy."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"cbe0bae0_c983621a","line":11,"range":{"start_line":8,"start_character":0,"end_line":11,"end_character":34},"in_reply_to":"538a9473_abdfb5ba","updated":"2025-11-04 13:16:12.000000000","message":"Done","commit_id":"c2e381aa2db177b71f46a1babfeb76c2a75af042"}]}
