You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2014/05/21 17:54:38 UTC
[1/5] git commit: Invalidate key cache on table drop
Repository: cassandra
Updated Branches:
refs/heads/trunk a519c0a6d -> 91741025c
Invalidate key cache on table drop
patch by thobbs; reviewed by slebresne for CASSANDRA-6525
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/ca213ccd
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/ca213ccd
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/ca213ccd
Branch: refs/heads/trunk
Commit: ca213ccdc029e74f548115dfbb61c65d221e5e42
Parents: 20e058b
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed May 21 11:44:50 2014 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed May 21 11:44:50 2014 +0200
----------------------------------------------------------------------
CHANGES.txt | 1 +
src/java/org/apache/cassandra/db/ColumnFamilyStore.java | 6 ++++++
2 files changed, 7 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/ca213ccd/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index bd0031e..432d688 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -47,6 +47,7 @@
* Proper null handle for IF with map element access (CASSANDRA-7155)
* Improve compaction visibility (CASSANDRA-7242)
* Fix 2ndary index queries with DESC clustering order (CASSANDRA-6950)
+ * Invalid key cache entries on DROP (CASSANDRA-6525)
Merged from 1.2:
* Add Cloudstack snitch (CASSANDRA-7147)
* Update system.peers correctly when relocating tokens (CASSANDRA-7126)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/ca213ccd/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 3fac640..709935a 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -37,6 +37,7 @@ import org.cliffc.high_scale_lib.NonBlockingHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.cassandra.cache.KeyCacheKey;
import org.apache.cassandra.cache.IRowCacheEntry;
import org.apache.cassandra.cache.RowCacheKey;
import org.apache.cassandra.cache.RowCacheSentinel;
@@ -339,6 +340,11 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
for (RowCacheKey key : CacheService.instance.rowCache.getKeySet())
if (key.cfId == metadata.cfId)
invalidateCachedRow(key);
+
+ String ksname = keyspace.getName();
+ for (KeyCacheKey key : CacheService.instance.keyCache.getKeySet())
+ if (key.getPathInfo().left.equals(ksname) && key.getPathInfo().right.equals(name))
+ CacheService.instance.keyCache.remove(key);
}
/**
[4/5] git commit: Merge branch 'cassandra-2.0' into cassandra-2.1
Posted by sl...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1
Conflicts:
CHANGES.txt
src/java/org/apache/cassandra/db/ColumnFamilyStore.java
src/java/org/apache/cassandra/db/commitlog/CommitLogAllocator.java
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e024a1cc
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e024a1cc
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e024a1cc
Branch: refs/heads/trunk
Commit: e024a1cc2ba9e50f1272ad76cb34582e38c256be
Parents: 82be86a 2635632
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed May 21 17:49:40 2014 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed May 21 17:49:40 2014 +0200
----------------------------------------------------------------------
CHANGES.txt | 3 +
.../apache/cassandra/db/ColumnFamilyStore.java | 1 +
.../apache/cassandra/db/marshal/DateType.java | 38 +---------
.../cassandra/db/marshal/TimeUUIDType.java | 6 +-
.../cassandra/db/marshal/TimestampType.java | 43 +----------
.../apache/cassandra/db/marshal/UUIDType.java | 38 ++--------
.../serializers/TimestampSerializer.java | 68 ++++++++++++++---
.../apache/cassandra/service/CacheService.java | 11 +++
.../cassandra/db/RecoveryManagerTest.java | 3 +
.../serializers/TimestampSerializerTest.java | 77 ++++++++++++++++++++
10 files changed, 166 insertions(+), 122 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e024a1cc/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 0b8be6e,bddb1d1..209ff70
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -57,7 -32,27 +57,10 @@@ Merged from 2.0
* Re-add parameter columns to tracing session (CASSANDRA-6942)
* Fix writetime/ttl functions for static columns (CASSANDRA-7081)
* Suggest CTRL-C or semicolon after three blank lines in cqlsh (CASSANDRA-7142)
- * (Hadoop) support authentication in CqlRecordReader (CASSANDRA-7221)
- * (Hadoop) Close java driver Cluster in CQLRR.close (CASSANDRA-7228)
- * Fix potential SlabAllocator yield-starvation (CASSANDRA-7133)
- * Warn when 'USING TIMESTAMP' is used on a CAS BATCH (CASSANDRA-7067)
- * Starting threads in OutboundTcpConnectionPool constructor causes race conditions (CASSANDRA-7177)
- * return all cpu values from BackgroundActivityMonitor.readAndCompute (CASSANDRA-7183)
- * fix c* launch issues on Russian os's due to output of linux 'free' cmd (CASSANDRA-6162)
- * Fix disabling autocompaction (CASSANDRA-7187)
- * Fix potential NumberFormatException when deserializing IntegerType (CASSANDRA-7088)
- * cqlsh can't tab-complete disabling compaction (CASSANDRA-7185)
- * cqlsh: Accept and execute CQL statement(s) from command-line parameter (CASSANDRA-7172)
- * Fix IllegalStateException in CqlPagingRecordReader (CASSANDRA-7198)
- * Fix the InvertedIndex trigger example (CASSANDRA-7211)
- * Add --resolve-ip option to 'nodetool ring' (CASSANDRA-7210)
- * Fix duplicated error messages on directory creation error at startup (CASSANDRA-5818)
- * reduce garbage on codec flag deserialization (CASSANDRA-7244)
- * Proper null handle for IF with map element access (CASSANDRA-7155)
- * Improve compaction visibility (CASSANDRA-7242)
* Fix 2ndary index queries with DESC clustering order (CASSANDRA-6950)
+ * Invalid key cache entries on DROP (CASSANDRA-6525)
+ * Fix flapping RecoveryManagerTest (CASSANDRA-7084)
++ * Add missing iso8601 patterns for date strings (6973)
Merged from 1.2:
* Add Cloudstack snitch (CASSANDRA-7147)
* Update system.peers correctly when relocating tokens (CASSANDRA-7126)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e024a1cc/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 3786ef5,709935a..4d334e7
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@@ -372,7 -337,14 +372,8 @@@ public class ColumnFamilyStore implemen
data.unreferenceSSTables();
indexManager.invalidate();
- for (RowCacheKey key : CacheService.instance.rowCache.getKeySet())
- if (key.cfId == metadata.cfId)
- invalidateCachedRow(key);
-
- String ksname = keyspace.getName();
- for (KeyCacheKey key : CacheService.instance.keyCache.getKeySet())
- if (key.getPathInfo().left.equals(ksname) && key.getPathInfo().right.equals(name))
- CacheService.instance.keyCache.remove(key);
+ CacheService.instance.invalidateRowCacheForCf(metadata.cfId);
++ CacheService.instance.invalidateKeyCacheForCf(metadata.cfId);
}
/**
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e024a1cc/src/java/org/apache/cassandra/db/marshal/DateType.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e024a1cc/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e024a1cc/src/java/org/apache/cassandra/db/marshal/UUIDType.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e024a1cc/src/java/org/apache/cassandra/service/CacheService.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/CacheService.java
index 78f6d66,f626e17..f51a166
--- a/src/java/org/apache/cassandra/service/CacheService.java
+++ b/src/java/org/apache/cassandra/service/CacheService.java
@@@ -283,6 -236,6 +283,17 @@@ public class CacheService implements Ca
keyCache.clear();
}
++ public void invalidateKeyCacheForCf(UUID cfId)
++ {
++ Iterator<KeyCacheKey> keyCacheIterator = keyCache.getKeySet().iterator();
++ while (keyCacheIterator.hasNext())
++ {
++ KeyCacheKey key = keyCacheIterator.next();
++ if (key.cfId.equals(cfId))
++ keyCacheIterator.remove();
++ }
++ }
++
public void invalidateRowCache()
{
rowCache.clear();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e024a1cc/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
index e812dfb,d14d184..687df5a
--- a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
@@@ -20,8 -20,10 +20,9 @@@ package org.apache.cassandra.db
import java.io.IOException;
import java.util.Date;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
+ import org.apache.cassandra.OrderedJUnit4ClassRunner;
import org.apache.cassandra.Util;
import org.junit.Assert;
import org.junit.Test;
@@@ -32,8 -35,9 +34,9 @@@ import org.apache.cassandra.db.commitlo
import static org.apache.cassandra.Util.column;
import static org.apache.cassandra.db.KeyspaceTest.assertColumns;
+import static org.apache.cassandra.Util.cellname;
+ @RunWith(OrderedJUnit4ClassRunner.class)
public class RecoveryManagerTest extends SchemaLoader
{
@Test
[5/5] git commit: Merge branch 'cassandra-2.1' into trunk
Posted by sl...@apache.org.
Merge branch 'cassandra-2.1' into trunk
Conflicts:
src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
src/java/org/apache/cassandra/db/marshal/UUIDType.java
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/91741025
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/91741025
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/91741025
Branch: refs/heads/trunk
Commit: 91741025cd81d3d62408edcac25c29ae23adb2a0
Parents: a519c0a e024a1c
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed May 21 17:54:27 2014 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed May 21 17:54:27 2014 +0200
----------------------------------------------------------------------
CHANGES.txt | 3 +
.../apache/cassandra/db/ColumnFamilyStore.java | 1 +
.../apache/cassandra/db/marshal/DateType.java | 38 +---------
.../cassandra/db/marshal/TimestampType.java | 43 +----------
.../serializers/TimestampSerializer.java | 68 ++++++++++++++---
.../apache/cassandra/service/CacheService.java | 11 +++
.../cassandra/db/RecoveryManagerTest.java | 3 +
.../serializers/TimestampSerializerTest.java | 77 ++++++++++++++++++++
8 files changed, 155 insertions(+), 89 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/91741025/CHANGES.txt
----------------------------------------------------------------------
[2/5] git commit: Fix flapping RecoveryManagerTest
Posted by sl...@apache.org.
Fix flapping RecoveryManagerTest
patch by benedict; reviewed by jbellis for CASSANDRA-7084
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/484d2816
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/484d2816
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/484d2816
Branch: refs/heads/trunk
Commit: 484d2816940cd2eb22d2365fcb376dd27e059e2e
Parents: ca213cc
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed May 21 11:48:21 2014 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed May 21 11:48:21 2014 +0200
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/db/commitlog/CommitLogAllocator.java | 6 ++++--
test/unit/org/apache/cassandra/db/RecoveryManagerTest.java | 3 +++
3 files changed, 8 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/484d2816/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 432d688..3f8e3d0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -48,6 +48,7 @@
* Improve compaction visibility (CASSANDRA-7242)
* Fix 2ndary index queries with DESC clustering order (CASSANDRA-6950)
* Invalid key cache entries on DROP (CASSANDRA-6525)
+ * Fix flapping RecoveryManagerTest (CASSANDRA-7084)
Merged from 1.2:
* Add Cloudstack snitch (CASSANDRA-7147)
* Update system.peers correctly when relocating tokens (CASSANDRA-7126)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/484d2816/src/java/org/apache/cassandra/db/commitlog/CommitLogAllocator.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogAllocator.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogAllocator.java
index 3009a63..7ab062b 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogAllocator.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogAllocator.java
@@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicLong;
import com.google.common.collect.Iterables;
+import com.google.common.util.concurrent.Uninterruptibles;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,7 +37,6 @@ import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.config.Schema;
import org.apache.cassandra.db.ColumnFamilyStore;
import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.io.FSError;
import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.service.StorageService;
@@ -343,9 +343,11 @@ public class CommitLogAllocator
{
logger.debug("Closing and clearing existing commit log segments...");
- while (!queue.isEmpty())
+ while (StorageService.tasks.getActiveCount() > 0 || !queue.isEmpty())
Thread.yield();
+ Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MILLISECONDS);
+
for (CommitLogSegment segment : Iterables.concat(activeSegments, availableSegments))
segment.close();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/484d2816/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
index c053211..d14d184 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
@@ -23,9 +23,11 @@ import java.util.Date;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
+import org.apache.cassandra.OrderedJUnit4ClassRunner;
import org.apache.cassandra.Util;
import org.junit.Assert;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.apache.cassandra.SchemaLoader;
import org.apache.cassandra.db.commitlog.CommitLog;
@@ -35,6 +37,7 @@ import org.apache.cassandra.utils.ByteBufferUtil;
import static org.apache.cassandra.Util.column;
import static org.apache.cassandra.db.KeyspaceTest.assertColumns;
+@RunWith(OrderedJUnit4ClassRunner.class)
public class RecoveryManagerTest extends SchemaLoader
{
@Test
[3/5] git commit: Add missing iso8601 patterns for date strings
Posted by sl...@apache.org.
Add missing iso8601 patterns for date strings
patch by chander; reviewed by slebresne for CASSANDRA-6973
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/26356322
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/26356322
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/26356322
Branch: refs/heads/trunk
Commit: 2635632270289fbbab2f3e3181f20aa98c34a879
Parents: 484d281
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Wed May 21 17:29:12 2014 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Wed May 21 17:29:12 2014 +0200
----------------------------------------------------------------------
CHANGES.txt | 4 +
.../apache/cassandra/db/marshal/DateType.java | 41 +----------
.../cassandra/db/marshal/TimeUUIDType.java | 6 +-
.../cassandra/db/marshal/TimestampType.java | 43 +----------
.../apache/cassandra/db/marshal/UUIDType.java | 38 ++--------
.../serializers/TimestampSerializer.java | 68 ++++++++++++++---
.../serializers/TimestampSerializerTest.java | 77 ++++++++++++++++++++
7 files changed, 152 insertions(+), 125 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/26356322/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 3f8e3d0..bddb1d1 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,7 @@
+2.0.9
+ * Add missing iso8601 patterns for date strings (6973)
+
+
2.0.8
* Always reallocate buffers in HSHA (CASSANDRA-6285)
* (Hadoop) support authentication in CqlRecordReader (CASSANDRA-7221)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/26356322/src/java/org/apache/cassandra/db/marshal/DateType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/DateType.java b/src/java/org/apache/cassandra/db/marshal/DateType.java
index 8e28bd4..0c97688 100644
--- a/src/java/org/apache/cassandra/db/marshal/DateType.java
+++ b/src/java/org/apache/cassandra/db/marshal/DateType.java
@@ -38,9 +38,6 @@ public class DateType extends AbstractType<Date>
public static final DateType instance = new DateType();
- static final String DEFAULT_FORMAT = TimestampSerializer.iso8601Patterns[3];
- static final SimpleDateFormat FORMATTER = new SimpleDateFormat(DEFAULT_FORMAT);
-
DateType() {} // singleton
public int compare(ByteBuffer o1, ByteBuffer o2)
@@ -63,43 +60,7 @@ public class DateType extends AbstractType<Date>
if (source.isEmpty())
return ByteBufferUtil.EMPTY_BYTE_BUFFER;
- return ByteBufferUtil.bytes(dateStringToTimestamp(source));
- }
-
- public static long dateStringToTimestamp(String source) throws MarshalException
- {
- long millis;
-
- if (source.toLowerCase().equals("now"))
- {
- millis = System.currentTimeMillis();
- }
- // Milliseconds since epoch?
- else if (source.matches("^-?\\d+$"))
- {
- try
- {
- millis = Long.parseLong(source);
- }
- catch (NumberFormatException e)
- {
- throw new MarshalException(String.format("unable to make long (for date) from: '%s'", source), e);
- }
- }
- // Last chance, attempt to parse as date-time string
- else
- {
- try
- {
- millis = DateUtils.parseDateStrictly(source, TimestampSerializer.iso8601Patterns).getTime();
- }
- catch (ParseException e1)
- {
- throw new MarshalException(String.format("unable to coerce '%s' to a formatted date (long)", source), e1);
- }
- }
-
- return millis;
+ return ByteBufferUtil.bytes(TimestampSerializer.dateStringToTimestamp(source));
}
@Override
http://git-wip-us.apache.org/repos/asf/cassandra/blob/26356322/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
index 51cf47a..fa82f06 100644
--- a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
+++ b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
@@ -25,6 +25,7 @@ import org.apache.cassandra.cql3.CQL3Type;
import org.apache.cassandra.serializers.TypeSerializer;
import org.apache.cassandra.serializers.MarshalException;
import org.apache.cassandra.serializers.TimeUUIDSerializer;
+import org.apache.cassandra.serializers.TimestampSerializer;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.UUIDGen;
@@ -110,9 +111,10 @@ public class TimeUUIDType extends AbstractType<UUID>
if (uuid.version() != 1)
throw new MarshalException("TimeUUID supports only version 1 UUIDs");
- } else
+ }
+ else
{
- idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(DateType.dateStringToTimestamp(source)));
+ idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(TimestampSerializer.dateStringToTimestamp(source)));
}
return idBytes;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/26356322/src/java/org/apache/cassandra/db/marshal/TimestampType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/TimestampType.java b/src/java/org/apache/cassandra/db/marshal/TimestampType.java
index cf1ea41..69ead8e 100644
--- a/src/java/org/apache/cassandra/db/marshal/TimestampType.java
+++ b/src/java/org/apache/cassandra/db/marshal/TimestampType.java
@@ -18,9 +18,7 @@
package org.apache.cassandra.db.marshal;
import java.nio.ByteBuffer;
-import java.text.ParseException;
import java.util.Date;
-import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,7 +27,6 @@ import org.apache.cassandra.serializers.TypeSerializer;
import org.apache.cassandra.serializers.MarshalException;
import org.apache.cassandra.serializers.TimestampSerializer;
import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.commons.lang3.time.DateUtils;
/**
* Type for date-time values.
@@ -44,8 +41,6 @@ public class TimestampType extends AbstractType<Date>
public static final TimestampType instance = new TimestampType();
- private static final Pattern timestampPattern = Pattern.compile("^-?\\d+$");
-
private TimestampType() {} // singleton
public int compare(ByteBuffer o1, ByteBuffer o2)
@@ -59,43 +54,7 @@ public class TimestampType extends AbstractType<Date>
if (source.isEmpty())
return ByteBufferUtil.EMPTY_BYTE_BUFFER;
- return ByteBufferUtil.bytes(dateStringToTimestamp(source));
- }
-
- public static long dateStringToTimestamp(String source) throws MarshalException
- {
- long millis;
-
- if (source.toLowerCase().equals("now"))
- {
- millis = System.currentTimeMillis();
- }
- // Milliseconds since epoch?
- else if (timestampPattern.matcher(source).matches())
- {
- try
- {
- millis = Long.parseLong(source);
- }
- catch (NumberFormatException e)
- {
- throw new MarshalException(String.format("unable to make long (for date) from: '%s'", source), e);
- }
- }
- // Last chance, attempt to parse as date-time string
- else
- {
- try
- {
- millis = DateUtils.parseDateStrictly(source, TimestampSerializer.iso8601Patterns).getTime();
- }
- catch (ParseException e1)
- {
- throw new MarshalException(String.format("unable to coerce '%s' to a formatted date (long)", source), e1);
- }
- }
-
- return millis;
+ return ByteBufferUtil.bytes(TimestampSerializer.dateStringToTimestamp(source));
}
@Override
http://git-wip-us.apache.org/repos/asf/cassandra/blob/26356322/src/java/org/apache/cassandra/db/marshal/UUIDType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/UUIDType.java b/src/java/org/apache/cassandra/db/marshal/UUIDType.java
index 4b0751e..969ff17 100644
--- a/src/java/org/apache/cassandra/db/marshal/UUIDType.java
+++ b/src/java/org/apache/cassandra/db/marshal/UUIDType.java
@@ -26,12 +26,11 @@ import org.apache.cassandra.cql3.CQL3Type;
import org.apache.cassandra.serializers.TypeSerializer;
import org.apache.cassandra.serializers.MarshalException;
import org.apache.cassandra.serializers.UUIDSerializer;
+import org.apache.cassandra.serializers.TimestampSerializer;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.UUIDGen;
import org.apache.commons.lang3.time.DateUtils;
-import static org.apache.cassandra.serializers.TimestampSerializer.iso8601Patterns;
-
/**
* Compares UUIDs using the following criteria:<br>
* - if count of supplied bytes is less than 16, compare counts<br>
@@ -165,8 +164,6 @@ public class UUIDType extends AbstractType<UUID>
if (source.isEmpty())
return ByteBufferUtil.EMPTY_BYTE_BUFFER;
- ByteBuffer idBytes = null;
-
// ffffffff-ffff-ffff-ffff-ffffffffff
if (TimeUUIDType.regexPattern.matcher(source).matches())
{
@@ -174,43 +171,22 @@ public class UUIDType extends AbstractType<UUID>
try
{
uuid = UUID.fromString(source);
- idBytes = ByteBuffer.wrap(UUIDGen.decompose(uuid));
+ return ByteBuffer.wrap(UUIDGen.decompose(uuid));
}
catch (IllegalArgumentException e)
{
throw new MarshalException(String.format("unable to make UUID from '%s'", source), e);
}
- } else if (source.toLowerCase().equals("now"))
- {
- idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes());
}
- // Milliseconds since epoch?
- else if (source.matches("^\\d+$"))
+
+ try
{
- try
- {
- idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(Long.parseLong(source)));
- }
- catch (NumberFormatException e)
- {
- throw new MarshalException(String.format("unable to make version 1 UUID from '%s'", source), e);
- }
+ return ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(TimestampSerializer.dateStringToTimestamp(source)));
}
- // Last chance, attempt to parse as date-time string
- else
+ catch (MarshalException e)
{
- try
- {
- long timestamp = DateUtils.parseDate(source, iso8601Patterns).getTime();
- idBytes = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(timestamp));
- }
- catch (ParseException e1)
- {
- throw new MarshalException(String.format("unable to coerce '%s' to version 1 UUID", source), e1);
- }
+ throw new MarshalException(String.format("unable to make version 1 UUID from '%s'", source), e);
}
-
- return idBytes;
}
public CQL3Type asCQL3Type()
http://git-wip-us.apache.org/repos/asf/cassandra/blob/26356322/src/java/org/apache/cassandra/serializers/TimestampSerializer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/serializers/TimestampSerializer.java b/src/java/org/apache/cassandra/serializers/TimestampSerializer.java
index f2a40f1..5cb9586 100644
--- a/src/java/org/apache/cassandra/serializers/TimestampSerializer.java
+++ b/src/java/org/apache/cassandra/serializers/TimestampSerializer.java
@@ -21,30 +21,49 @@ import org.apache.cassandra.utils.ByteBufferUtil;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
+import java.text.ParseException;
import java.util.Date;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.time.DateUtils;
public class TimestampSerializer implements TypeSerializer<Date>
{
- public static final String[] iso8601Patterns = new String[] {
+ private static final String[] dateStringPatterns = new String[] {
"yyyy-MM-dd HH:mm",
"yyyy-MM-dd HH:mm:ss",
- "yyyy-MM-dd HH:mmZ",
- "yyyy-MM-dd HH:mm:ssZ",
+ "yyyy-MM-dd HH:mmX",
+ "yyyy-MM-dd HH:mmXX",
+ "yyyy-MM-dd HH:mmXXX",
+ "yyyy-MM-dd HH:mm:ssX",
+ "yyyy-MM-dd HH:mm:ssXX",
+ "yyyy-MM-dd HH:mm:ssXXX",
"yyyy-MM-dd HH:mm:ss.SSS",
- "yyyy-MM-dd HH:mm:ss.SSSZ",
+ "yyyy-MM-dd HH:mm:ss.SSSX",
+ "yyyy-MM-dd HH:mm:ss.SSSXX",
+ "yyyy-MM-dd HH:mm:ss.SSSXXX",
"yyyy-MM-dd'T'HH:mm",
- "yyyy-MM-dd'T'HH:mmZ",
+ "yyyy-MM-dd'T'HH:mmX",
+ "yyyy-MM-dd'T'HH:mmXX",
+ "yyyy-MM-dd'T'HH:mmXXX",
"yyyy-MM-dd'T'HH:mm:ss",
- "yyyy-MM-dd'T'HH:mm:ssZ",
+ "yyyy-MM-dd'T'HH:mm:ssX",
+ "yyyy-MM-dd'T'HH:mm:ssXX",
+ "yyyy-MM-dd'T'HH:mm:ssXXX",
"yyyy-MM-dd'T'HH:mm:ss.SSS",
- "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
+ "yyyy-MM-dd'T'HH:mm:ss.SSSX",
+ "yyyy-MM-dd'T'HH:mm:ss.SSSXX",
+ "yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
"yyyy-MM-dd",
- "yyyy-MM-ddZ"
+ "yyyy-MM-ddX",
+ "yyyy-MM-ddXX",
+ "yyyy-MM-ddXXX"
};
- static final String DEFAULT_FORMAT = iso8601Patterns[3];
+ private static final String DEFAULT_FORMAT = dateStringPatterns[3];
+ private static final Pattern timestampPattern = Pattern.compile("^-?\\d+$");
- static final ThreadLocal<SimpleDateFormat> FORMATTER = new ThreadLocal<SimpleDateFormat>()
+ private static final ThreadLocal<SimpleDateFormat> FORMATTER = new ThreadLocal<SimpleDateFormat>()
{
protected SimpleDateFormat initialValue()
{
@@ -64,6 +83,35 @@ public class TimestampSerializer implements TypeSerializer<Date>
return value == null ? ByteBufferUtil.EMPTY_BYTE_BUFFER : ByteBufferUtil.bytes(value.getTime());
}
+ public static long dateStringToTimestamp(String source) throws MarshalException
+ {
+ if (source.equalsIgnoreCase("now"))
+ return System.currentTimeMillis();
+
+ // Milliseconds since epoch?
+ if (timestampPattern.matcher(source).matches())
+ {
+ try
+ {
+ return Long.parseLong(source);
+ }
+ catch (NumberFormatException e)
+ {
+ throw new MarshalException(String.format("unable to make long (for date) from: '%s'", source), e);
+ }
+ }
+
+ // Last chance, attempt to parse as date-time string
+ try
+ {
+ return DateUtils.parseDateStrictly(source, dateStringPatterns).getTime();
+ }
+ catch (ParseException e1)
+ {
+ throw new MarshalException(String.format("unable to coerce '%s' to a formatted date (long)", source), e1);
+ }
+ }
+
public void validate(ByteBuffer bytes) throws MarshalException
{
if (bytes.remaining() != 8 && bytes.remaining() != 0)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/26356322/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java b/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java
new file mode 100644
index 0000000..d991845
--- /dev/null
+++ b/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cassandra.serializers;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import org.junit.Test;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.serializers.TimestampSerializer;
+
+public class TimestampSerializerTest
+{
+ private String dates[] = new String[]
+ {
+ "2014-04-01",
+ "2014-04-01+0000",
+ "2014-04-01 20:30",
+ "2014-04-01 20:30:35",
+ "2014-04-01 20:30:35Z",
+ "2014-04-01 20:30+07",
+ "2014-04-01 20:30+0700",
+ "2014-04-01 20:30+07:00",
+ "2014-04-01 20:30:35+07",
+ "2014-04-01 20:30:35+0700",
+ "2014-04-01 20:30:35+07:00",
+ "2014-04-01 20:30:35.898",
+ "2014-04-01 20:30:35.898Z",
+ "2014-04-01 20:30:35.898+07",
+ "2014-04-01 20:30:35.898+0700",
+ "2014-04-01 20:30:35.898+07:00",
+ "2014-04-01T20:30",
+ "2014-04-01T20:30:25",
+ "2014-04-01T20:30:35Z",
+ "2014-04-01T20:30:35+00:00",
+ "2014-04-01T20:30:35+0700",
+ "2014-04-01T20:30:35+07:00",
+ "2014-04-01T20:30:35.898",
+ "2014-04-01T20:30:35.898+00:00"
+ };
+
+ @Test
+ public void testDateStringToTimestamp()
+ {
+ List<String> unparsedDates = new ArrayList<>();
+ for (String date: dates)
+ {
+ try
+ {
+ long millis = TimestampSerializer.dateStringToTimestamp(date);
+ }
+ catch (MarshalException e)
+ {
+ unparsedDates.add(date);
+ }
+ }
+ assertTrue("Unable to parse: " + unparsedDates, unparsedDates.isEmpty());
+ }
+}