Author: gdusbabek
Date: Thu Mar 4 20:17:04 2010
New Revision: 919154
URL: http://svn.apache.org/viewvc?rev=919154&view=rev
Log:
CASSANDRA-825 use jug for TimeUUID generation
Added:
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java
Modified:
incubator/cassandra/trunk/ivy.xml
Modified: incubator/cassandra/trunk/ivy.xml
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/ivy.xml?rev=919154&r1=919153&r2=919154&view=diff
==============================================================================
--- incubator/cassandra/trunk/ivy.xml (original)
+++ incubator/cassandra/trunk/ivy.xml Thu Mar 4 20:17:04 2010
@@ -47,6 +47,12 @@
<dependency org="org.apache.rat" name="apache-rat" rev="0.6"
conf="qa->default"/>
+ <dependency org="org.mortbay.jetty" name="jetty" rev="6.1.21"/>
+
+ <dependency org="org.safehaus.jug" name="jug" rev="2.0.0">
+ <!-- I can't figure out how to tell ivy to grab the classifier=asl
version of this lib, so I force it. -->
+ <artifact name="jug" type="jar" ext="jar"
url="http://repo1.maven.org/maven2/org/safehaus/jug/jug/2.0.0/jug-2.0.0-asl.jar"/>
+ </dependency>
</dependencies>
</ivy-module>
Added:
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java?rev=919154&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java
(added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java
Thu Mar 4 20:17:04 2010
@@ -0,0 +1,62 @@
+package org.apache.cassandra.utils;
+
+import org.safehaus.uuid.EthernetAddress;
+import org.safehaus.uuid.UUIDGenerator;
+
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Random;
+import java.util.UUID;
+
+/**
+ * Generates type 1 (time-based) UUIDs
+ */
+public class UUIDGen
+{
+ /** creates a type1 uuid but substitutes hash of the IP where the mac
would go. */
+ public static synchronized UUID makeType1UUIDFromHost(InetAddress addr)
+ {
+ try
+ {
+ MessageDigest digest = MessageDigest.getInstance("MD5");
+ digest.update(addr.getAddress());
+ byte[] md5 = digest.digest();
+ byte[] fauxMac = new byte[6];
+ System.arraycopy(md5, 0, fauxMac, 0, Math.min(md5.length,
fauxMac.length));
+ return
makeType1UUID(UUIDGenerator.getInstance().generateTimeBasedUUID(new
EthernetAddress(fauxMac)).toByteArray());
+ }
+ catch (NoSuchAlgorithmException ex)
+ {
+ throw new RuntimeException("Your platform has no support for
generating MD5 sums");
+ }
+ }
+
+ /** creates a type 1 uuid from raw bytes. */
+ static UUID makeType1UUID(byte[] raw)
+ {
+ long most = 0;
+ long least = 0;
+ assert raw.length == 16;
+ for (int i = 0; i < 8; i++)
+ most = (most << 8) | (raw[i] & 0xff);
+ for (int i =8 ; i < 16; i++)
+ least = (least << 8) | (raw[i] & 0xff);
+ return new UUID(most, least);
+ }
+
+ /** decomposes a uuid into raw bytes. */
+ static byte[] decompose(UUID uuid)
+ {
+ long most = uuid.getMostSignificantBits();
+ long least = uuid.getLeastSignificantBits();
+ byte[] b = new byte[16];
+ for (int i = 0; i < 8; i++)
+ {
+ b[i] = (byte)(most >>> ((7-i) * 8));
+ b[8+i] = (byte)(least >>> ((7-i) * 8));
+ }
+ return b;
+ }
+}
Added:
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java?rev=919154&view=auto
==============================================================================
---
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java
(added)
+++
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java
Thu Mar 4 20:17:04 2010
@@ -0,0 +1,56 @@
+package org.apache.cassandra.utils;
+
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.junit.Test;
+
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.UUID;
+
+
+public class UUIDTests
+{
+ @Test
+ public void verifyType1() throws UnknownHostException
+ {
+
+ UUID uuid =
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1"));
+ assert uuid.version() == 1;
+ }
+
+ @Test
+ public void verifyOrdering1() throws UnknownHostException
+ {
+ UUID one =
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1"));
+ UUID two =
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.2"));
+ assert one.timestamp() < two.timestamp();
+ }
+
+
+ @Test
+ public void testDecomposeAndRaw() throws UnknownHostException
+ {
+ UUID a =
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1"));
+ byte[] decomposed = UUIDGen.decompose(a);
+ UUID b = UUIDGen.makeType1UUID(decomposed);
+ assert a.equals(b);
+ }
+
+ @Test
+ public void testTimeUUIDType() throws UnknownHostException
+ {
+ TimeUUIDType comp = new TimeUUIDType();
+ byte[] first =
UUIDGen.decompose(UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1")));
+ byte[] second =
UUIDGen.decompose(UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1")));
+ assert comp.compare(first, second) < 0;
+ assert comp.compare(second, first) > 0;
+ byte[] sameAsFirst = UUIDGen.decompose(UUIDGen.makeType1UUID(first));
+ assert comp.compare(first, sameAsFirst) == 0;
+ }
+
+ private void assertNonZero(BigInteger i)
+ {
+ assert i.toString(2).indexOf("1") > -1;
+ }
+}