Skip to content

Commit 5936b69

Browse files
authored
[SB] Fix NoneType Error on Idle Connection Drop (Azure#31743)
* where the problem occurs * remove prints * fix for None type on connection lost * remove space * update error message * error message in async * move attribute error position * attribute error * update error message * remove whitespace * changelog
1 parent f9e1d3e commit 5936b69

File tree

3 files changed

+73
-56
lines changed

3 files changed

+73
-56
lines changed

sdk/servicebus/azure-servicebus/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
### Bugs Fixed
1010

11+
- Fix the error `NoneType object has no attribute 'settle_messages'` which was raised when a connection was dropped due to a blocked process ([#30514](https://github.com/Azure/azure-sdk-for-python/issues/30514))
12+
1113
### Other Changes
1214

1315
## 7.11.1 (2023-07-12)

sdk/servicebus/azure-servicebus/azure/servicebus/_transport/_pyamqp_transport.py

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -742,35 +742,42 @@ def settle_message_via_receiver_link(
742742
dead_letter_error_description: Optional[str] = None,
743743
) -> None:
744744
# pylint: disable=protected-access
745-
if settle_operation == MESSAGE_COMPLETE:
746-
return handler.settle_messages(message._delivery_id, 'accepted')
747-
if settle_operation == MESSAGE_ABANDON:
748-
return handler.settle_messages(
749-
message._delivery_id,
750-
'modified',
751-
delivery_failed=True,
752-
undeliverable_here=False
753-
)
754-
if settle_operation == MESSAGE_DEAD_LETTER:
755-
return handler.settle_messages(
756-
message._delivery_id,
757-
'rejected',
758-
error=AMQPError(
759-
condition=DEADLETTERNAME,
760-
description=dead_letter_error_description,
761-
info={
762-
RECEIVER_LINK_DEAD_LETTER_REASON: dead_letter_reason,
763-
RECEIVER_LINK_DEAD_LETTER_ERROR_DESCRIPTION: dead_letter_error_description,
764-
}
745+
try:
746+
if settle_operation == MESSAGE_COMPLETE:
747+
return handler.settle_messages(message._delivery_id, 'accepted')
748+
if settle_operation == MESSAGE_ABANDON:
749+
return handler.settle_messages(
750+
message._delivery_id,
751+
'modified',
752+
delivery_failed=True,
753+
undeliverable_here=False
765754
)
766-
)
767-
if settle_operation == MESSAGE_DEFER:
768-
return handler.settle_messages(
769-
message._delivery_id,
770-
'modified',
771-
delivery_failed=True,
772-
undeliverable_here=True
773-
)
755+
if settle_operation == MESSAGE_DEAD_LETTER:
756+
return handler.settle_messages(
757+
message._delivery_id,
758+
'rejected',
759+
error=AMQPError(
760+
condition=DEADLETTERNAME,
761+
description=dead_letter_error_description,
762+
info={
763+
RECEIVER_LINK_DEAD_LETTER_REASON: dead_letter_reason,
764+
RECEIVER_LINK_DEAD_LETTER_ERROR_DESCRIPTION: dead_letter_error_description,
765+
}
766+
)
767+
)
768+
if settle_operation == MESSAGE_DEFER:
769+
return handler.settle_messages(
770+
message._delivery_id,
771+
'modified',
772+
delivery_failed=True,
773+
undeliverable_here=True
774+
)
775+
except AttributeError as ae:
776+
raise RuntimeError("handler is not initialized and cannot complete the message") from ae
777+
778+
except AMQPConnectionError as e:
779+
raise RuntimeError("Connection lost during settle operation.") from e
780+
774781
raise ValueError(
775782
f"Unsupported settle operation type: {settle_operation}"
776783
)

sdk/servicebus/azure-servicebus/azure/servicebus/aio/_transport/_pyamqp_transport_async.py

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from ..._pyamqp.aio._authentication_async import JWTTokenAuthAsync
1616
from ..._pyamqp.aio._connection_async import Connection as ConnectionAsync
1717
from ..._pyamqp.error import (
18+
AMQPConnectionError,
1819
AMQPError,
1920
MessageException,
2021
)
@@ -277,35 +278,42 @@ async def settle_message_via_receiver_link_async(
277278
dead_letter_error_description: Optional[str] = None,
278279
) -> None:
279280
# pylint: disable=protected-access
280-
if settle_operation == MESSAGE_COMPLETE:
281-
return await handler.settle_messages_async(message._delivery_id, 'accepted')
282-
if settle_operation == MESSAGE_ABANDON:
283-
return await handler.settle_messages_async(
284-
message._delivery_id,
285-
'modified',
286-
delivery_failed=True,
287-
undeliverable_here=False
288-
)
289-
if settle_operation == MESSAGE_DEAD_LETTER:
290-
return await handler.settle_messages_async(
291-
message._delivery_id,
292-
'rejected',
293-
error=AMQPError(
294-
condition=DEADLETTERNAME,
295-
description=dead_letter_error_description,
296-
info={
297-
RECEIVER_LINK_DEAD_LETTER_REASON: dead_letter_reason,
298-
RECEIVER_LINK_DEAD_LETTER_ERROR_DESCRIPTION: dead_letter_error_description,
299-
}
281+
try:
282+
if settle_operation == MESSAGE_COMPLETE:
283+
return await handler.settle_messages_async(message._delivery_id, 'accepted')
284+
if settle_operation == MESSAGE_ABANDON:
285+
return await handler.settle_messages_async(
286+
message._delivery_id,
287+
'modified',
288+
delivery_failed=True,
289+
undeliverable_here=False
290+
)
291+
if settle_operation == MESSAGE_DEAD_LETTER:
292+
return await handler.settle_messages_async(
293+
message._delivery_id,
294+
'rejected',
295+
error=AMQPError(
296+
condition=DEADLETTERNAME,
297+
description=dead_letter_error_description,
298+
info={
299+
RECEIVER_LINK_DEAD_LETTER_REASON: dead_letter_reason,
300+
RECEIVER_LINK_DEAD_LETTER_ERROR_DESCRIPTION: dead_letter_error_description,
301+
}
302+
)
303+
)
304+
if settle_operation == MESSAGE_DEFER:
305+
return await handler.settle_messages_async(
306+
message._delivery_id,
307+
'modified',
308+
delivery_failed=True,
309+
undeliverable_here=True
300310
)
301-
)
302-
if settle_operation == MESSAGE_DEFER:
303-
return await handler.settle_messages_async(
304-
message._delivery_id,
305-
'modified',
306-
delivery_failed=True,
307-
undeliverable_here=True
308-
)
311+
except AttributeError as ae:
312+
raise RuntimeError("handler is not initialized and cannot complete the message") from ae
313+
314+
except AMQPConnectionError as e:
315+
raise RuntimeError("Connection lost during settle operation.") from e
316+
309317
raise ValueError(
310318
f"Unsupported settle operation type: {settle_operation}"
311319
)

0 commit comments

Comments
 (0)