This is an automated email from the ASF dual-hosted git repository.
astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
The following commit(s) were added to refs/heads/main by this push:
new 581a433fe PROTON-2883/PROTON-2884: Modified dispositions should
default to failed = true
581a433fe is described below
commit 581a433fe3edffef0a724cec424bdffbf7072738
Author: Andrew Stitcher <[email protected]>
AuthorDate: Tue Apr 8 22:06:04 2025 -0400
PROTON-2883/PROTON-2884: Modified dispositions should default to failed =
true
---
cpp/src/delivery.cpp | 2 +-
python/proton/_delivery.py | 2 +-
python/proton/_handlers.py | 7 ++++---
python/tests/proton_tests/engine.py | 22 ++++++++++++++++++++++
4 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/cpp/src/delivery.cpp b/cpp/src/delivery.cpp
index 8dc050e25..9f03eaf73 100644
--- a/cpp/src/delivery.cpp
+++ b/cpp/src/delivery.cpp
@@ -49,6 +49,6 @@ delivery::~delivery() = default;
void delivery::accept() { settle_delivery(pn_object(), ACCEPTED); }
void delivery::reject() { settle_delivery(pn_object(), REJECTED); }
void delivery::release() { settle_delivery(pn_object(), RELEASED); }
-void delivery::modify() { settle_delivery(pn_object(), MODIFIED); }
+void delivery::modify() {
pn_disposition_set_failed(pn_delivery_local(pn_object()), true);
settle_delivery(pn_object(), MODIFIED); }
}
diff --git a/python/proton/_delivery.py b/python/proton/_delivery.py
index 7fbf425e5..90bf3689f 100644
--- a/python/proton/_delivery.py
+++ b/python/proton/_delivery.py
@@ -425,7 +425,7 @@ class RejectedDisposition(LocalDisposition):
class ModifiedDisposition(LocalDisposition):
- def __init__(self, failed: bool = None, undeliverable: bool = None,
+ def __init__(self, failed: bool = True, undeliverable: bool = None,
annotations: Optional[dict['symbol', 'PythonAMQPData']] =
None):
self._failed = failed
self._undeliverable = undeliverable
diff --git a/python/proton/_handlers.py b/python/proton/_handlers.py
index 08096c775..819f8431c 100644
--- a/python/proton/_handlers.py
+++ b/python/proton/_handlers.py
@@ -24,7 +24,7 @@ import time
import weakref
from ._condition import Condition
-from ._delivery import Delivery
+from ._delivery import Delivery, ModifiedDisposition
from ._endpoints import Endpoint
from ._events import Event, _dispatch
from ._exceptions import ProtonException
@@ -187,7 +187,7 @@ class Acking(object):
"""
self.settle(delivery, Delivery.REJECTED)
- def release(self, delivery: Delivery, delivered: bool = True) -> None:
+ def release(self, delivery: Delivery, delivered: bool = True, failed: bool
= True, undeliverable: bool = False) -> None:
"""
Releases a received message, making it available at the source
for any (other) interested receiver. The ``delivered``
@@ -206,7 +206,8 @@ class Acking(object):
delivery flag :const:`proton.Delivery.RELEASED`
"""
if delivered:
- self.settle(delivery, Delivery.MODIFIED)
+ delivery.local = ModifiedDisposition(failed=failed,
undeliverable=undeliverable)
+ self.settle(delivery)
else:
self.settle(delivery, Delivery.RELEASED)
diff --git a/python/tests/proton_tests/engine.py
b/python/tests/proton_tests/engine.py
index 5289db059..8b99539d3 100644
--- a/python/tests/proton_tests/engine.py
+++ b/python/tests/proton_tests/engine.py
@@ -2380,6 +2380,25 @@ class NewModifiedTester(DispositionTester):
assert dlv.remote.annotations == self._annotations,
(dlv.remote.annotations, self._annotations)
+class NewDefaultModifiedTester(DispositionTester):
+ def __init__(self):
+ self._failed = True
+ self._undeliverable = False
+ self._annotations = None
+ super().__init__(Disposition.MODIFIED)
+
+ def apply(self, dlv: Delivery):
+ dlv.local = ModifiedDisposition()
+ dlv.update()
+
+ def check(self, dlv: Delivery):
+ assert dlv.remote_state == self._type
+ assert dlv.remote.type == self._type
+ assert dlv.remote.failed == self._failed, (dlv.remote.failed,
self._failed)
+ assert dlv.remote.undeliverable == self._undeliverable,
(dlv.remote.undeliverable, self._undeliverable)
+ assert dlv.remote.annotations == self._annotations,
(dlv.remote.annotations, self._annotations)
+
+
class CustomTester(DispositionTester):
def __init__(self, type, data):
self._data = data
@@ -2505,6 +2524,9 @@ class DeliveryTest(Test):
self._testDisposition(NewModifiedTester(failed=True,
undeliverable=True,
annotations={"key": "value"}))
+ def testNewDefaultModified(self):
+ self._testDisposition(NewDefaultModifiedTester())
+
def testTransactional(self):
self._testDisposition(TransactionalTester(id=b'1324xxx',
outcome_type=Disposition.ACCEPTED))
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]