You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2013/07/05 19:36:27 UTC
svn commit: r1500080 - in /qpid/proton/trunk: proton-c/bindings/python/
proton-c/include/proton/ proton-c/src/engine/ proton-c/src/messenger/
proton-j/proton-api/src/main/resources/ tests/python/proton_tests/
Author: kgiusti
Date: Fri Jul 5 17:36:27 2013
New Revision: 1500080
URL: http://svn.apache.org/r1500080
Log:
PROTON-81: provide accessors to link settlement mode
Modified:
qpid/proton/trunk/proton-c/bindings/python/proton.py
qpid/proton/trunk/proton-c/include/proton/engine.h
qpid/proton/trunk/proton-c/src/engine/engine-internal.h
qpid/proton/trunk/proton-c/src/engine/engine.c
qpid/proton/trunk/proton-c/src/messenger/messenger.c
qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py
qpid/proton/trunk/tests/python/proton_tests/engine.py
Modified: qpid/proton/trunk/proton-c/bindings/python/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/proton.py?rev=1500080&r1=1500079&r2=1500080&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/proton.py (original)
+++ qpid/proton/trunk/proton-c/bindings/python/proton.py Fri Jul 5 17:36:27 2013
@@ -2058,6 +2058,13 @@ def wrap_link(link):
class Link(Endpoint):
+ SND_UNSETTLED = PN_SND_UNSETTLED
+ SND_SETTLED = PN_SND_SETTLED
+ SND_MIXED = PN_SND_MIXED
+
+ RCV_FIRST = PN_RCV_FIRST
+ RCV_SECOND = PN_RCV_SECOND
+
def __init__(self, link):
Endpoint.__init__(self)
self._link = link
@@ -2147,6 +2154,26 @@ class Link(Endpoint):
def is_receiver(self):
return pn_link_is_receiver(self._link)
+ @property
+ def remote_snd_settle_mode(self):
+ return pn_link_remote_snd_settle_mode(self._link)
+
+ @property
+ def remote_rcv_settle_mode(self):
+ return pn_link_remote_rcv_settle_mode(self._link)
+
+ def _get_snd_settle_mode(self):
+ return pn_link_snd_settle_mode(self._link)
+ def _set_snd_settle_mode(self, mode):
+ pn_link_set_snd_settle_mode(self._link, mode)
+ snd_settle_mode = property(_get_snd_settle_mode, _set_snd_settle_mode)
+
+ def _get_rcv_settle_mode(self):
+ return pn_link_rcv_settle_mode(self._link)
+ def _set_rcv_settle_mode(self, mode):
+ pn_link_set_rcv_settle_mode(self._link, mode)
+ rcv_settle_mode = property(_get_rcv_settle_mode, _set_rcv_settle_mode)
+
class Terminus(object):
Modified: qpid/proton/trunk/proton-c/include/proton/engine.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/engine.h?rev=1500080&r1=1500079&r2=1500080&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/engine.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/engine.h Fri Jul 5 17:36:27 2013
@@ -70,6 +70,15 @@ typedef enum {
PN_DIST_MODE_COPY,
PN_DIST_MODE_MOVE
} pn_distribution_mode_t;
+typedef enum {
+ PN_SND_UNSETTLED = 0,
+ PN_SND_SETTLED = 1,
+ PN_SND_MIXED = 2
+} pn_snd_settle_mode_t;
+typedef enum {
+ PN_RCV_FIRST = 0, /**< implicitly settle rcvd xfers */
+ PN_RCV_SECOND = 1 /**< explicit disposition required */
+} pn_rcv_settle_mode_t;
typedef struct pn_disposition_t pn_disposition_t;
typedef struct pn_delivery_t pn_delivery_t;
@@ -447,6 +456,12 @@ PN_EXTERN bool pn_link_advance(pn_link_t
PN_EXTERN int pn_link_credit(pn_link_t *link);
PN_EXTERN int pn_link_queued(pn_link_t *link);
PN_EXTERN int pn_link_available(pn_link_t *link);
+PN_EXTERN pn_snd_settle_mode_t pn_link_snd_settle_mode(pn_link_t *link);
+PN_EXTERN pn_rcv_settle_mode_t pn_link_rcv_settle_mode(pn_link_t *link);
+PN_EXTERN pn_snd_settle_mode_t pn_link_remote_snd_settle_mode(pn_link_t *link);
+PN_EXTERN pn_rcv_settle_mode_t pn_link_remote_rcv_settle_mode(pn_link_t *link);
+PN_EXTERN void pn_link_set_snd_settle_mode(pn_link_t *link, pn_snd_settle_mode_t);
+PN_EXTERN void pn_link_set_rcv_settle_mode(pn_link_t *link, pn_rcv_settle_mode_t);
PN_EXTERN int pn_link_unsettled(pn_link_t *link);
PN_EXTERN pn_delivery_t *pn_unsettled_head(pn_link_t *link);
Modified: qpid/proton/trunk/proton-c/src/engine/engine-internal.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine-internal.h?rev=1500080&r1=1500079&r2=1500080&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine-internal.h (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine-internal.h Fri Jul 5 17:36:27 2013
@@ -232,6 +232,10 @@ struct pn_link_t {
pn_delivery_t *current;
pn_delivery_t *settled_head;
pn_delivery_t *settled_tail;
+ uint8_t snd_settle_mode;
+ uint8_t rcv_settle_mode;
+ uint8_t remote_snd_settle_mode;
+ uint8_t remote_rcv_settle_mode;
size_t unsettled_count;
pn_sequence_t available;
pn_sequence_t credit;
Modified: qpid/proton/trunk/proton-c/src/engine/engine.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine.c?rev=1500080&r1=1500079&r2=1500080&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine.c Fri Jul 5 17:36:27 2013
@@ -949,6 +949,10 @@ pn_link_t *pn_link_new(int type, pn_sess
link->drain = false;
link->drained = false;
link->context = 0;
+ link->snd_settle_mode = PN_SND_MIXED;
+ link->rcv_settle_mode = PN_RCV_FIRST;
+ link->remote_snd_settle_mode = PN_SND_MIXED;
+ link->remote_rcv_settle_mode = PN_RCV_FIRST;
// begin transport state
link->state.local_handle = -1;
@@ -1508,6 +1512,40 @@ int pn_link_queued(pn_link_t *link)
return link ? link->queued : 0;
}
+pn_snd_settle_mode_t pn_link_snd_settle_mode(pn_link_t *link)
+{
+ return link ? (pn_snd_settle_mode_t)link->snd_settle_mode
+ : PN_SND_MIXED;
+}
+
+pn_rcv_settle_mode_t pn_link_rcv_settle_mode(pn_link_t *link)
+{
+ return link ? (pn_rcv_settle_mode_t)link->rcv_settle_mode
+ : PN_RCV_FIRST;
+}
+
+pn_snd_settle_mode_t pn_link_remote_snd_settle_mode(pn_link_t *link)
+{
+ return link ? (pn_snd_settle_mode_t)link->remote_snd_settle_mode
+ : PN_SND_MIXED;
+}
+
+pn_rcv_settle_mode_t pn_link_remote_rcv_settle_mode(pn_link_t *link)
+{
+ return link ? (pn_rcv_settle_mode_t)link->remote_rcv_settle_mode
+ : PN_RCV_FIRST;
+}
+void pn_link_set_snd_settle_mode(pn_link_t *link, pn_snd_settle_mode_t mode)
+{
+ if (link)
+ link->snd_settle_mode = (uint8_t)mode;
+}
+void pn_link_set_rcv_settle_mode(pn_link_t *link, pn_rcv_settle_mode_t mode)
+{
+ if (link)
+ link->rcv_settle_mode = (uint8_t)mode;
+}
+
void pn_real_settle(pn_delivery_t *delivery)
{
pn_link_t *link = delivery->link;
@@ -1722,8 +1760,12 @@ int pn_do_attach(pn_dispatcher_t *disp)
bool src_dynamic, tgt_dynamic;
pn_sequence_t idc;
pn_bytes_t dist_mode;
- int err = pn_scan_args(disp, "D.[SIo..D.[SIsIo.s]D.[SIsIo]..I]", &name, &handle,
+ bool snd_settle, rcv_settle;
+ uint8_t snd_settle_mode, rcv_settle_mode;
+ int err = pn_scan_args(disp, "D.[SIo?B?BD.[SIsIo.s]D.[SIsIo]..I]", &name, &handle,
&is_sender,
+ &snd_settle, &snd_settle_mode,
+ &rcv_settle, &rcv_settle_mode,
&source, &src_dr, &src_exp, &src_timeout, &src_dynamic, &dist_mode,
&target, &tgt_dr, &tgt_exp, &tgt_timeout, &tgt_dynamic,
&idc);
@@ -1774,6 +1816,11 @@ int pn_do_attach(pn_dispatcher_t *disp)
pn_terminus_set_type(rtgt, PN_UNSPECIFIED);
}
+ if (snd_settle)
+ link->remote_snd_settle_mode = snd_settle_mode;
+ if (rcv_settle)
+ link->remote_rcv_settle_mode = rcv_settle_mode;
+
pn_data_clear(link->remote_source.properties);
pn_data_clear(link->remote_source.filter);
pn_data_clear(link->remote_source.outcomes);
@@ -2336,10 +2383,12 @@ int pn_process_link_setup(pn_transport_t
pn_hash_put(ssn_state->local_handles, state->local_handle, link);
const pn_distribution_mode_t dist_mode = link->source.distribution_mode;
int err = pn_post_frame(transport->disp, ssn_state->local_channel,
- "DL[SIonn?DL[SIsIoC?sCnCC]?DL[SIsIoCC]nnI]", ATTACH,
+ "DL[SIoBB?DL[SIsIoC?sCnCC]?DL[SIsIoCC]nnI]", ATTACH,
pn_string_get(link->name),
state->local_handle,
endpoint->type == RECEIVER,
+ link->snd_settle_mode,
+ link->rcv_settle_mode,
(bool) link->source.type, SOURCE,
pn_string_get(link->source.address),
link->source.durability,
Modified: qpid/proton/trunk/proton-c/src/messenger/messenger.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger/messenger.c?rev=1500080&r1=1500079&r2=1500080&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger/messenger.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger/messenger.c Fri Jul 5 17:36:27 2013
@@ -894,6 +894,12 @@ pn_link_t *pn_messenger_link(pn_messenge
pn_session_t *ssn = pn_session(connection);
pn_session_open(ssn);
link = sender ? pn_sender(ssn, "sender-xxx") : pn_receiver(ssn, "receiver-xxx");
+ if ((sender && pn_messenger_get_outgoing_window(messenger)) ||
+ (!sender && pn_messenger_get_incoming_window(messenger))) {
+ // use explicit settlement via dispositions (not pre-settled)
+ pn_link_set_snd_settle_mode( link, PN_SND_UNSETTLED );
+ pn_link_set_rcv_settle_mode( link, PN_RCV_SECOND );
+ }
// XXX
pn_terminus_set_address(pn_link_target(link), name);
pn_terminus_set_address(pn_link_source(link), name);
Modified: qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py?rev=1500080&r1=1500079&r2=1500080&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py (original)
+++ qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py Fri Jul 5 17:36:27 2013
@@ -34,7 +34,7 @@ from org.apache.qpid.proton.message impo
from org.apache.qpid.proton.codec import \
DataFactory, Data as JData
from org.apache.qpid.proton.messenger import MessengerFactory, MessengerException, Status
-from org.apache.qpid.proton.amqp.transport import ErrorCondition
+from org.apache.qpid.proton.amqp.transport import ErrorCondition, SenderSettleMode, ReceiverSettleMode
from org.apache.qpid.proton.amqp.messaging import Source, Target, Accepted, \
Rejected, Received, Modified, Released, AmqpValue
from org.apache.qpid.proton.amqp import UnsignedInteger, UnsignedLong, UnsignedByte, UnsignedShort, Symbol, \
@@ -297,6 +297,13 @@ def wrap_link(impl):
class Link(Endpoint):
+ SND_UNSETTLED = SenderSettleMode.UNSETTLED
+ SND_SETTLED = SenderSettleMode.SETTLED
+ SND_MIXED = SenderSettleMode.MIXED
+
+ RCV_FIRST = ReceiverSettleMode.FIRST
+ RCV_SECOND = ReceiverSettleMode.SECOND
+
def __init__(self, impl):
Endpoint.__init__(self)
self.impl = impl
@@ -353,6 +360,27 @@ class Link(Endpoint):
def next(self, mask):
return wrap_link(self.impl.next(*self._enums(mask)))
+ @property
+ def remote_snd_settle_mode(self):
+ return self.impl.getRemoteSenderSettleMode()
+
+ @property
+ def remote_rcv_settle_mode(self):
+ return self.impl.getRemoteReceiverSettleMode()
+
+ def _get_snd_settle_mode(self):
+ return self.impl.getSenderSettleMode()
+ def _set_snd_settle_mode(self, mode):
+ self.impl.setSenderSettleMode(mode)
+ snd_settle_mode = property(_get_snd_settle_mode, _set_snd_settle_mode)
+
+ def _get_rcv_settle_mode(self):
+ return self.impl.getReceiverSettleMode()
+ def _set_rcv_settle_mode(self, mode):
+ self.impl.setReceiverSettleMode(mode)
+ rcv_settle_mode = property(_get_rcv_settle_mode, _set_rcv_settle_mode)
+
+
class DataDummy:
def format(self):
Modified: qpid/proton/trunk/tests/python/proton_tests/engine.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/engine.py?rev=1500080&r1=1500079&r2=1500080&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/engine.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/engine.py Fri Jul 5 17:36:27 2013
@@ -511,6 +511,23 @@ class LinkTest(Test):
rcond = self.rcv.remote_condition
assert rcond == cond, (rcond, cond)
+ def test_settle_mode(self):
+ self.snd.snd_settle_mode = Link.SND_UNSETTLED
+ assert self.snd.snd_settle_mode == Link.SND_UNSETTLED
+ self.rcv.rcv_settle_mode = Link.RCV_SECOND
+ assert self.rcv.rcv_settle_mode == Link.RCV_SECOND
+
+ assert self.snd.remote_rcv_settle_mode != Link.RCV_SECOND
+ assert self.rcv.remote_snd_settle_mode != Link.SND_UNSETTLED
+
+ self.snd.open()
+ self.rcv.open()
+ self.pump()
+
+ assert self.snd.remote_rcv_settle_mode == Link.RCV_SECOND
+ assert self.rcv.remote_snd_settle_mode == Link.SND_UNSETTLED
+
+
class TerminusConfig:
def __init__(self, address=None, timeout=None, durability=None, filter=None,
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org