Author: jbellis
Date: Mon May 23 01:30:55 2011
New Revision: 1126289
URL: http://svn.apache.org/viewvc?rev=1126289&view=rev
Log:
fix UUIDTypefor direct buffers
patch by Ed Anuff; reviewed by jbellis for CASSANDRA-2682
Modified:
cassandra/branches/cassandra-0.8.0/CHANGES.txt
cassandra/branches/cassandra-0.8.0/src/java/org/apache/cassandra/db/marshal/UUIDType.java
cassandra/branches/cassandra-0.8.0/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java
Modified: cassandra/branches/cassandra-0.8.0/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8.0/CHANGES.txt?rev=1126289&r1=1126288&r2=1126289&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8.0/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.8.0/CHANGES.txt Mon May 23 01:30:55 2011
@@ -3,6 +3,7 @@
* add ant generate-cql-html target (CASSANDRA-2526)
* update CQL consistency levels (CASSANDRA-2566)
* debian packaging fixes (CASSANDRA-2481, 2647)
+ * fix UUIDType for direct buffers (CASSANDRA-2682)
0.8.0-rc1
@@ -90,6 +91,7 @@
* cli no longer divides read_repair_chance by 100 (CASSANDRA-2458)
* made CompactionInfo.getTaskType return an enum (CASSANDRA-2482)
* add a server-wide cap on measured memtable memory usage (CASSANDRA-2006)
+ * add unified UUIDType (CASSANDRA-2233)
0.7.5
Modified:
cassandra/branches/cassandra-0.8.0/src/java/org/apache/cassandra/db/marshal/UUIDType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8.0/src/java/org/apache/cassandra/db/marshal/UUIDType.java?rev=1126289&r1=1126288&r2=1126289&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.8.0/src/java/org/apache/cassandra/db/marshal/UUIDType.java
(original)
+++
cassandra/branches/cassandra-0.8.0/src/java/org/apache/cassandra/db/marshal/UUIDType.java
Mon May 23 01:30:55 2011
@@ -25,11 +25,10 @@ import java.nio.ByteBuffer;
import java.text.ParseException;
import java.util.UUID;
-import org.apache.commons.lang.time.DateUtils;
-
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.UUIDGen;
+import org.apache.commons.lang.time.DateUtils;
/**
* Compares UUIDs using the following criteria:<br>
@@ -39,9 +38,7 @@ import org.apache.cassandra.utils.UUIDGe
* - compare timestamps if both are time-based<br>
* - compare lexically, unsigned msb-to-lsb comparison<br>
*
- * @author edanuff
* @see "com.fasterxml.uuid.UUIDComparator"
- *
*/
public class UUIDType extends AbstractUUIDType
{
@@ -65,25 +62,13 @@ public class UUIDType extends AbstractUU
return 1;
}
- int s1 = b1.arrayOffset() + b1.position();
- byte[] o1 = b1.array();
-
- int s2 = b2.arrayOffset() + b2.position();
- byte[] o2 = b2.array();
-
- if (o1.length == s1)
- {
- return o2.length == s2 ? 0 : -1;
- }
- if (o2.length == s2)
- {
- return 1;
- }
+ int s1 = b1.position();
+ int s2 = b2.position();
// Compare versions
- int v1 = (o1[s1 + 6] >> 4) & 0x0f;
- int v2 = (o2[s2 + 6] >> 4) & 0x0f;
+ int v1 = (b1.get(s1 + 6) >> 4) & 0x0f;
+ int v2 = (b2.get(s2 + 6) >> 4) & 0x0f;
if (v1 != v2)
{
@@ -95,7 +80,7 @@ public class UUIDType extends AbstractUU
if (v1 == 1)
{
// if both time-based, compare as timestamps
- int c = compareTimestampBytes(s1, o1, s2, o2);
+ int c = compareTimestampBytes(b1, b2);
if (c != 0)
{
return c;
@@ -109,10 +94,9 @@ public class UUIDType extends AbstractUU
// Appendix A - Sample Implementation.
// Note: java.util.UUID.compareTo is not a lexical
// comparison
-
for (int i = 0; i < 16; i++)
{
- int c = ((o1[s1 + i]) & 0xFF) - ((o2[s2 + i]) & 0xFF);
+ int c = ((b1.get(s1 + i)) & 0xFF) - ((b2.get(s2 + i)) & 0xFF);
if (c != 0)
{
return c;
@@ -122,45 +106,54 @@ public class UUIDType extends AbstractUU
return 0;
}
- private static int compareTimestampBytes(int s1, byte[] o1, int s2,
- byte[] o2)
+ private static int compareTimestampBytes(ByteBuffer o1, ByteBuffer o2)
{
- int d = (o1[s1 + 6] & 0xF) - (o2[s2 + 6] & 0xF);
+ int o1Pos = o1.position();
+ int o2Pos = o2.position();
+
+ int d = (o1.get(o1Pos + 6) & 0xF) - (o2.get(o2Pos + 6) & 0xF);
if (d != 0)
{
return d;
}
- d = (o1[s1 + 7] & 0xFF) - (o2[s2 + 7] & 0xFF);
+
+ d = (o1.get(o1Pos + 7) & 0xFF) - (o2.get(o2Pos + 7) & 0xFF);
if (d != 0)
{
return d;
}
- d = (o1[s1 + 4] & 0xFF) - (o2[s2 + 4] & 0xFF);
+
+ d = (o1.get(o1Pos + 4) & 0xFF) - (o2.get(o2Pos + 4) & 0xFF);
if (d != 0)
{
return d;
}
- d = (o1[s1 + 5] & 0xFF) - (o2[s2 + 5] & 0xFF);
+
+ d = (o1.get(o1Pos + 5) & 0xFF) - (o2.get(o2Pos + 5) & 0xFF);
if (d != 0)
{
return d;
}
- d = (o1[s1 + 0] & 0xFF) - (o2[s2 + 0] & 0xFF);
+
+ d = (o1.get(o1Pos) & 0xFF) - (o2.get(o2Pos) & 0xFF);
if (d != 0)
{
return d;
}
- d = (o1[s1 + 1] & 0xFF) - (o2[s2 + 1] & 0xFF);
+
+ d = (o1.get(o1Pos + 1) & 0xFF) - (o2.get(o2Pos + 1) & 0xFF);
if (d != 0)
{
return d;
}
- d = (o1[s1 + 2] & 0xFF) - (o2[s2 + 2] & 0xFF);
+
+ d = (o1.get(o1Pos + 2) & 0xFF) - (o2.get(o2Pos + 2) & 0xFF);
if (d != 0)
{
return d;
}
- return (o1[s1 + 3] & 0xFF) - (o2[s2 + 3] & 0xFF);
+
+ return (o1.get(o1Pos + 3) & 0xFF) - (o2.get(o2Pos + 3) & 0xFF);
}
public UUID compose(ByteBuffer bytes)
Modified:
cassandra/branches/cassandra-0.8.0/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8.0/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java?rev=1126289&r1=1126288&r2=1126289&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.8.0/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java
(original)
+++
cassandra/branches/cassandra-0.8.0/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java
Mon May 23 01:30:55 2011
@@ -1,4 +1,5 @@
package org.apache.cassandra.db.marshal;
+
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -20,7 +21,6 @@ package org.apache.cassandra.db.marshal;
*
*/
-
import static org.junit.Assert.assertEquals;
import java.net.InetAddress;
@@ -30,6 +30,7 @@ import java.util.Arrays;
import java.util.Random;
import java.util.UUID;
+import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.UUIDGen;
import org.apache.log4j.Logger;
import org.junit.Test;
@@ -48,6 +49,9 @@ public class UUIDTypeTest
UUID t1 = newTimeBasedUUID();
UUID t2 = newTimeBasedUUID();
+ testCompare(null, t2, -1);
+ testCompare(t1, null, 1);
+
testCompare(t1, t2, -1);
testCompare(t1, t1, 0);
testCompare(t2, t2, 0);
@@ -110,8 +114,8 @@ public class UUIDTypeTest
public String describeCompare(UUID u1, UUID u2, int c)
{
- String tb1 = (u1.version() == 1) ? "time-based " : "random ";
- String tb2 = (u2.version() == 1) ? "time-based " : "random ";
+ String tb1 = (u1 == null) ? "null" : (u1.version() == 1) ? "time-based
" : "random ";
+ String tb2 = (u2 == null) ? "null" : (u2.version() == 1) ? "time-based
" : "random ";
String comp = (c < 0) ? " < " : ((c == 0) ? " = " : " > ");
return tb1 + u1 + comp + tb2 + u2;
}
@@ -131,6 +135,9 @@ public class UUIDTypeTest
public static ByteBuffer bytebuffer(UUID uuid)
{
+ if (uuid == null)
+ return ByteBufferUtil.EMPTY_BYTE_BUFFER;
+
long msb = uuid.getMostSignificantBits();
long lsb = uuid.getLeastSignificantBits();
byte[] bytes = new byte[16];
@@ -149,29 +156,23 @@ public class UUIDTypeTest
public void logJdkUUIDCompareToVariance(UUID u1, UUID u2, int expC)
{
+ if ((u1 == null) || (u2 == null))
+ return;
if (u1.version() != u2.version())
- {
return;
- }
if (u1.version() == 1)
- {
return;
- }
if (u1.compareTo(u2) != expC)
- {
logger.info("*** Note: java.util.UUID.compareTo() would have
compared this differently");
- }
-
}
public void testCompare(UUID u1, UUID u2, int expC)
{
int c = sign(uuidType.compare(bytebuffer(u1), bytebuffer(u2)));
expC = sign(expC);
- assertEquals("Expected " + describeCompare(u1, u2, expC) + ", got "
- + describeCompare(u1, u2, c), expC, c);
+ assertEquals("Expected " + describeCompare(u1, u2, expC) + ", got " +
describeCompare(u1, u2, c), expC, c);
- if (u1.version() == 1 && u2.version() == 1)
+ if (((u1 != null) && (u1.version() == 1)) && ((u2 != null) &&
(u2.version() == 1)))
assertEquals(c, sign(TimeUUIDType.instance.compare(bytebuffer(u1),
bytebuffer(u2))));
logJdkUUIDCompareToVariance(u1, u2, c);