qpid-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From g...@apache.org
Subject svn commit: r1654365 - /qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp
Date Fri, 23 Jan 2015 20:25:46 GMT
Author: gsim
Date: Fri Jan 23 20:25:45 2015
New Revision: 1654365

URL: http://svn.apache.org/r1654365
Log:
QPID-6310: handle maximal range

Modified:
    qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp?rev=1654365&r1=1654364&r2=1654365&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/framing/SequenceSet.cpp Fri Jan 23 20:25:45 2015
@@ -33,7 +33,18 @@ namespace framing {
 
 namespace {
 //each range contains 2 numbers, 4 bytes each
-uint16_t RANGE_SIZE = 2 * 4; 
+uint16_t RANGE_SIZE = 2 * 4;
+int32_t MAX_RANGE = 2147483647;//2^31-1
+
+int32_t gap(const SequenceNumber& a, const SequenceNumber& b)
+{
+    return a < b ? b - a : a - b;
+}
+
+bool is_max_range(const SequenceNumber& a, const SequenceNumber& b)
+{
+    return gap(a, b) == MAX_RANGE;
+}
 }
 
 void SequenceSet::encode(Buffer& buffer) const
@@ -58,7 +69,17 @@ void SequenceSet::decode(Buffer& buffer)
         SequenceNumber b(buffer.getLong());
         if (b < a)
             throw IllegalArgumentException(QPID_MSG("Invalid range in sequence set: " <<
a << " -> " << b));
-        add(a, b);
+        if (is_max_range(a, b)) {
+            //RangeSet holds 'half-closed' ranges, where the end is
+            //one past the 'highest' value in the range. So if the
+            //range is already the maximum expressable with a 32bit
+            //sequence number, we can't represent it as a
+            //'half-closed' range, so we represent it as two ranges.
+            add(a, b-1);
+            add(b);
+        } else {
+            add(a, b);
+        }
     }
 }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


Mime
View raw message