You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2015/04/25 21:36:06 UTC
[05/13] qpid-proton git commit: PROTON-844: police handle-max in
proton-j
PROTON-844: police handle-max in proton-j
* when receiving an attach with a handle > handle-max, the connection
should be closed
* when attempting to allocate a new local handle when handle-max are
already in-use should throw an Exception
* the default of 1024 handle-max is quite small when proton-c appears to
default to 4294967295 - increase it more modestly to 65536
Closes #16
(cherry picked from commit f937ccd04a99575cb44ec4108908d155e9f3a101)
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/b59ed4ca
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/b59ed4ca
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/b59ed4ca
Branch: refs/heads/0.9.x
Commit: b59ed4ca8056eb4306f051081a0bad15cf6e03ba
Parents: b9e5d02
Author: Dominic Evans <do...@uk.ibm.com>
Authored: Thu Apr 2 18:59:27 2015 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Sat Apr 25 20:24:17 2015 +0100
----------------------------------------------------------------------
.../qpid/proton/engine/impl/TransportImpl.java | 26 +++++++++++++++++---
.../proton/engine/impl/TransportSession.java | 16 ++++++------
2 files changed, 31 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b59ed4ca/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
index b866ca8..39a059b 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
@@ -1092,7 +1092,27 @@ public class TransportImpl extends EndpointImpl
else
{
SessionImpl session = transportSession.getSession();
- TransportLink<?> transportLink = transportSession.getLinkFromRemoteHandle(attach.getHandle());
+ final UnsignedInteger handle = attach.getHandle();
+ if (handle.compareTo(transportSession.getHandleMax()) > 0) {
+ // The handle-max value is the highest handle value that can be used on the session. A peer MUST
+ // NOT attempt to attach a link using a handle value outside the range that its partner can handle.
+ // A peer that receives a handle outside the supported range MUST close the connection with the
+ // framing-error error-code.
+ ErrorCondition condition =
+ new ErrorCondition(ConnectionError.FRAMING_ERROR,
+ "handle-max exceeded");
+ _connectionEndpoint.setCondition(condition);
+ _connectionEndpoint.setLocalState(EndpointState.CLOSED);
+ if (!_isCloseSent) {
+ Close close = new Close();
+ close.setError(condition);
+ _isCloseSent = true;
+ writeFrame(0, close, null, null);
+ }
+ close_tail();
+ return;
+ }
+ TransportLink<?> transportLink = transportSession.getLinkFromRemoteHandle(handle);
LinkImpl link = null;
if(transportLink != null)
@@ -1127,8 +1147,8 @@ public class TransportImpl extends EndpointImpl
link.setRemoteSenderSettleMode(attach.getSndSettleMode());
transportLink.setName(attach.getName());
- transportLink.setRemoteHandle(attach.getHandle());
- transportSession.addLinkRemoteHandle(transportLink, attach.getHandle());
+ transportLink.setRemoteHandle(handle);
+ transportSession.addLinkRemoteHandle(transportLink, handle);
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b59ed4ca/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
index 6d96043..1b23df7 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
@@ -23,6 +23,7 @@ package org.apache.qpid.proton.engine.impl;
import java.util.HashMap;
import java.util.Map;
+
import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.UnsignedInteger;
import org.apache.qpid.proton.amqp.transport.Disposition;
@@ -38,16 +39,16 @@ class TransportSession
private int _localChannel = -1;
private int _remoteChannel = -1;
private boolean _openSent;
- private UnsignedInteger _handleMax = UnsignedInteger.valueOf(1024);
+ private final UnsignedInteger _handleMax = UnsignedInteger.valueOf(65536);
private UnsignedInteger _outgoingDeliveryId = UnsignedInteger.ZERO;
private UnsignedInteger _incomingWindowSize = UnsignedInteger.ZERO;
private UnsignedInteger _outgoingWindowSize = UnsignedInteger.ZERO;
private UnsignedInteger _nextOutgoingId = UnsignedInteger.ONE;
private UnsignedInteger _nextIncomingId = null;
- private TransportLink[] _remoteHandleMap = new TransportLink[1024];
- private TransportLink[] _localHandleMap = new TransportLink[1024];
- private Map<String, TransportLink> _halfOpenLinks = new HashMap<String, TransportLink>();
+ private final TransportLink[] _remoteHandleMap = new TransportLink[_handleMax.intValue() + 1];
+ private final TransportLink[] _localHandleMap = new TransportLink[_handleMax.intValue() + 1];
+ private final Map<String, TransportLink> _halfOpenLinks = new HashMap<String, TransportLink>();
private UnsignedInteger _incomingDeliveryId = null;
@@ -55,9 +56,9 @@ class TransportSession
private UnsignedInteger _remoteOutgoingWindow;
private UnsignedInteger _remoteNextIncomingId = _nextOutgoingId;
private UnsignedInteger _remoteNextOutgoingId;
- private Map<UnsignedInteger, DeliveryImpl>
+ private final Map<UnsignedInteger, DeliveryImpl>
_unsettledIncomingDeliveriesById = new HashMap<UnsignedInteger, DeliveryImpl>();
- private Map<UnsignedInteger, DeliveryImpl>
+ private final Map<UnsignedInteger, DeliveryImpl>
_unsettledOutgoingDeliveriesById = new HashMap<UnsignedInteger, DeliveryImpl>();
private int _unsettledIncomingSize;
private boolean _endReceived;
@@ -218,8 +219,7 @@ class TransportSession
return rc;
}
}
- // TODO - error
- return UnsignedInteger.MAX_VALUE;
+ throw new IllegalStateException("no local handle available for allocation");
}
public void addLinkRemoteHandle(TransportLink link, UnsignedInteger remoteHandle)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org