Author: gsim Date: Fri Oct 10 12:57:08 2014 New Revision: 1630854 URL: http://svn.apache.org/r1630854 Log: PROTON-689: added a condition to the transport along with bindings to expose it
Modified: qpid/proton/branches/examples/proton-c/bindings/python/proton.py qpid/proton/branches/examples/proton-c/include/proton/transport.h qpid/proton/branches/examples/proton-c/src/engine/engine-internal.h qpid/proton/branches/examples/proton-c/src/transport/transport.c qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/Transport.java qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java qpid/proton/branches/examples/proton-j/src/main/resources/cengine.py qpid/proton/branches/examples/tests/python/proton_tests/engine.py Modified: qpid/proton/branches/examples/proton-c/bindings/python/proton.py URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/bindings/python/proton.py?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/bindings/python/proton.py (original) +++ qpid/proton/branches/examples/proton-c/bindings/python/proton.py Fri Oct 10 12:57:08 2014 @@ -3136,6 +3136,10 @@ The idle timeout of the connection (floa self._ssl = SSL(self, domain, session_details) return self._ssl + @property + def condition(self): + return cond2obj(pn_transport_condition(self._trans)) + class SASLException(TransportException): pass Modified: qpid/proton/branches/examples/proton-c/include/proton/transport.h URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/include/proton/transport.h?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/include/proton/transport.h (original) +++ qpid/proton/branches/examples/proton-c/include/proton/transport.h Fri Oct 10 12:57:08 2014 @@ -24,6 +24,7 @@ #include <proton/import_export.h> #include <proton/type_compat.h> +#include <proton/condition.h> #include <stddef.h> #include <sys/types.h> @@ -103,20 +104,18 @@ PN_EXTERN pn_transport_t *pn_transport(v PN_EXTERN void pn_transport_free(pn_transport_t *transport); /** - * Get additional error information associated with the transport. + * Get additional information about the condition of the transport. * - * Whenever a transport operation fails (i.e. returns an error code), - * additional error details can be obtained using this function. The - * error object that is returned may also be used to clear the error - * condition. + * When a PN_TRANSPORT_ERROR event occurs, this operation can be used + * to access the details of the error condtion. * * The pointer returned by this operation is valid until the * transport object is freed. * * @param[in] transport the transport object - * @return the transport's error object + * @return the transport's condition object */ -PN_EXTERN pn_error_t *pn_transport_error(pn_transport_t *transport); +PN_EXTERN pn_condition_t *pn_transport_condition(pn_transport_t *transport); /** * Binds the transport to an AMQP connection. Modified: qpid/proton/branches/examples/proton-c/src/engine/engine-internal.h URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/engine/engine-internal.h?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/engine/engine-internal.h (original) +++ qpid/proton/branches/examples/proton-c/src/engine/engine-internal.h Fri Oct 10 12:57:08 2014 @@ -127,6 +127,7 @@ struct pn_transport_t { uint32_t local_max_frame; uint32_t remote_max_frame; pn_condition_t remote_condition; + pn_condition_t condition; #define PN_IO_SSL 0 #define PN_IO_SASL 1 Modified: qpid/proton/branches/examples/proton-c/src/transport/transport.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/transport/transport.c?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/transport/transport.c (original) +++ qpid/proton/branches/examples/proton-c/src/transport/transport.c Fri Oct 10 12:57:08 2014 @@ -163,6 +163,7 @@ static void pn_transport_initialize(void transport->remote_properties = pn_data(0); transport->disp_data = pn_data(0); pn_condition_init(&transport->remote_condition); + pn_condition_init(&transport->condition); transport->local_channels = pn_hash(PN_OBJECT, 0, 0.75); transport->remote_channels = pn_hash(PN_OBJECT, 0, 0.75); @@ -256,6 +257,7 @@ static void pn_transport_finalize(void * pn_free(transport->remote_properties); pn_free(transport->disp_data); pn_condition_tini(&transport->remote_condition); + pn_condition_tini(&transport->condition); pn_free(transport->local_channels); pn_free(transport->remote_channels); if (transport->input_buf) free(transport->input_buf); @@ -350,6 +352,12 @@ pn_error_t *pn_transport_error(pn_transp return NULL; } +pn_condition_t *pn_transport_condition(pn_transport_t *transport) +{ + assert(transport); + return &transport->condition; +} + static void pni_map_remote_handle(pn_link_t *link, uint32_t handle) { link->state.remote_handle = handle; @@ -456,9 +464,11 @@ int pn_do_error(pn_transport_t *transpor transport->close_sent = true; } transport->disp->halt = true; - pn_transport_logf(transport, "ERROR %s %s", condition, buf); + pn_condition_set_name(&transport->condition, condition); + pn_condition_set_description(&transport->condition, buf); pn_collector_t *collector = pni_transport_collector(transport); pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_ERROR); + pn_transport_logf(transport, "ERROR %s %s", condition, buf); return PN_ERR; } Modified: qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/Transport.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/Transport.java?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/Transport.java (original) +++ qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/Transport.java Fri Oct 10 12:57:08 2014 @@ -22,6 +22,7 @@ package org.apache.qpid.proton.engine; import java.nio.ByteBuffer; +import org.apache.qpid.proton.amqp.transport.ErrorCondition; import org.apache.qpid.proton.engine.impl.TransportImpl; @@ -221,4 +222,6 @@ public interface Transport extends Endpo int getRemoteChannelMax(); + ErrorCondition getCondition(); + } Modified: qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java (original) +++ qpid/proton/branches/examples/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java Fri Oct 10 12:57:08 2014 @@ -121,7 +121,7 @@ public class TransportImpl extends Endpo private FrameHandler _frameHandler = this; private boolean _head_closed = false; - private TransportException _tail_error = null; + private ErrorCondition _condition = null; private boolean postedHeadClosed = false; private boolean postedTailClosed = false; @@ -211,6 +211,12 @@ public class TransportImpl extends Endpo } @Override + public ErrorCondition getCondition() + { + return _condition; + } + + @Override public void bind(Connection conn) { // TODO - check if already bound @@ -752,7 +758,7 @@ public class TransportImpl extends Endpo private void processOpen() { - if ((_tail_error != null || + if ((_condition != null || (_connectionEndpoint != null && _connectionEndpoint.getLocalState() != EndpointState.UNINITIALIZED)) && !_isOpenSent) { @@ -929,7 +935,7 @@ public class TransportImpl extends Endpo private void processClose() { - if ((_tail_error != null || + if ((_condition != null || (_connectionEndpoint != null && _connectionEndpoint.getLocalState() == EndpointState.CLOSED)) && !_isCloseSent) { @@ -940,8 +946,7 @@ public class TransportImpl extends Endpo ErrorCondition localError; if (_connectionEndpoint == null) { - localError = new ErrorCondition(ConnectionError.FRAMING_ERROR, - _tail_error.toString()); + localError = _condition; } else { localError = _connectionEndpoint.getCondition(); } @@ -1263,13 +1268,15 @@ public class TransportImpl extends Endpo { if (!_closeReceived || error != null) { if (error == null) { - _tail_error = new TransportException("connection aborted"); + _condition = new ErrorCondition(ConnectionError.FRAMING_ERROR, + "connection aborted"); } else { - _tail_error = error; + _condition = new ErrorCondition(ConnectionError.FRAMING_ERROR, + error.toString()); } _head_closed = true; } - if (_tail_error != null) { + if (_condition != null) { put(Event.Type.TRANSPORT_ERROR, this); } if (!postedTailClosed) { Modified: qpid/proton/branches/examples/proton-j/src/main/resources/cengine.py URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-j/src/main/resources/cengine.py?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-j/src/main/resources/cengine.py (original) +++ qpid/proton/branches/examples/proton-j/src/main/resources/cengine.py Fri Oct 10 12:57:08 2014 @@ -867,6 +867,7 @@ class pn_transport_wrapper: def __init__(self, impl): self.impl = impl + self.condition = pn_condition() def pn_transport(): return wrap(Proton.transport(), pn_transport_wrapper) @@ -944,6 +945,10 @@ def pn_transport_close_tail(trans): def pn_transport_closed(trans): return trans.impl.isClosed() +def pn_transport_condition(trans): + trans.condition.decode(trans.impl.getCondition()) + return trans.condition + from org.apache.qpid.proton.engine import Event PN_CONNECTION_INIT = Event.Type.CONNECTION_INIT Modified: qpid/proton/branches/examples/tests/python/proton_tests/engine.py URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tests/python/proton_tests/engine.py?rev=1630854&r1=1630853&r2=1630854&view=diff ============================================================================== --- qpid/proton/branches/examples/tests/python/proton_tests/engine.py (original) +++ qpid/proton/branches/examples/tests/python/proton_tests/engine.py Fri Oct 10 12:57:08 2014 @@ -2257,12 +2257,14 @@ class EventTest(CollectorTest): t = Transport() t.bind(c) self.expect(Event.CONNECTION_BOUND) + assert t.condition is None t.push("asdf") self.expect(Event.TRANSPORT_ERROR, Event.TRANSPORT_TAIL_CLOSED) + assert t.condition is not None + assert t.condition.name == "amqp:connection:framing-error" + assert "AMQP header mismatch" in t.condition.description p = t.pending() assert p > 0 - # XXX: can't include this because java behaviour is different - #assert "AMQP header mismatch" in t.peek(p), repr(t.peek(p)) t.pop(p) self.expect(Event.TRANSPORT_HEAD_CLOSED, Event.TRANSPORT_CLOSED) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org