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());
+    }
+}