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