You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ty...@apache.org on 2016/02/11 17:32:09 UTC

[1/3] cassandra git commit: Make SELECT JSON and toJson() threadsafe

Repository: cassandra
Updated Branches:
  refs/heads/trunk b63e6eef5 -> 6dc1004ce


Make SELECT JSON and toJson() threadsafe

Patch by Ivan Ryndin and Tyler Hobbs; reviewed by Sergio Bossa for
CASSANDRA-11048


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/6b1bd174
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/6b1bd174
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/6b1bd174

Branch: refs/heads/trunk
Commit: 6b1bd1745ab9f04f9e379e6d22764b97693ba2ad
Parents: 90fc896
Author: Tyler Hobbs <ty...@gmail.com>
Authored: Thu Feb 11 10:26:47 2016 -0600
Committer: Tyler Hobbs <ty...@gmail.com>
Committed: Thu Feb 11 10:26:47 2016 -0600

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 src/java/org/apache/cassandra/cql3/Json.java    | 10 ++-
 .../cassandra/cql3/selection/Selection.java     |  2 +-
 .../apache/cassandra/db/marshal/AsciiType.java  |  2 +-
 .../apache/cassandra/db/marshal/MapType.java    |  2 +-
 .../apache/cassandra/db/marshal/UTF8Type.java   |  2 +-
 .../apache/cassandra/db/marshal/UserType.java   |  2 +-
 .../cql3/validation/entities/JsonTest.java      | 70 +++++++++++++++++---
 8 files changed, 76 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 5674b9d..3aca720 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.6
+ * Make SELECT JSON and toJson() threadsafe (CASSANDRA-11048)
  * Fix SELECT on tuple relations for mixed ASC/DESC clustering order (CASSANDRA-7281)
  * (cqlsh) Support utf-8/cp65001 encoding on Windows (CASSANDRA-11030)
  * Fix paging on DISTINCT queries repeats result when first row in partition changes (CASSANDRA-10010)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/src/java/org/apache/cassandra/cql3/Json.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Json.java b/src/java/org/apache/cassandra/cql3/Json.java
index 5284793..78fbd08 100644
--- a/src/java/org/apache/cassandra/cql3/Json.java
+++ b/src/java/org/apache/cassandra/cql3/Json.java
@@ -35,10 +35,16 @@ public class Json
 {
     public static final ObjectMapper JSON_OBJECT_MAPPER = new ObjectMapper();
 
-    public static final JsonStringEncoder JSON_STRING_ENCODER = new JsonStringEncoder();
-
     public static final ColumnIdentifier JSON_COLUMN_ID = new ColumnIdentifier("[json]", true);
 
+    /**
+     * Quotes string contents using standard JSON quoting.
+     */
+    public static String quoteAsJsonString(String s)
+    {
+        return new String(JsonStringEncoder.getInstance().quoteAsString(s));
+    }
+
     public static Object decodeJson(String json)
     {
         try

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/src/java/org/apache/cassandra/cql3/selection/Selection.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java
index f6925b2..6016059 100644
--- a/src/java/org/apache/cassandra/cql3/selection/Selection.java
+++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java
@@ -375,7 +375,7 @@ public abstract class Selection
 
                 ByteBuffer buffer = row.get(i);
                 sb.append('"');
-                sb.append(Json.JSON_STRING_ENCODER.quoteAsString(columnName));
+                sb.append(Json.quoteAsJsonString(columnName));
                 sb.append("\": ");
                 if (buffer == null)
                     sb.append("null");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/src/java/org/apache/cassandra/db/marshal/AsciiType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/AsciiType.java b/src/java/org/apache/cassandra/db/marshal/AsciiType.java
index 953fc09..2356c1c 100644
--- a/src/java/org/apache/cassandra/db/marshal/AsciiType.java
+++ b/src/java/org/apache/cassandra/db/marshal/AsciiType.java
@@ -88,7 +88,7 @@ public class AsciiType extends AbstractType<String>
     {
         try
         {
-            return '"' + new String(Json.JSON_STRING_ENCODER.quoteAsString(ByteBufferUtil.string(buffer, Charset.forName("US-ASCII")))) + '"';
+            return '"' + Json.quoteAsJsonString(ByteBufferUtil.string(buffer, Charset.forName("US-ASCII"))) + '"';
         }
         catch (CharacterCodingException exc)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/src/java/org/apache/cassandra/db/marshal/MapType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/MapType.java b/src/java/org/apache/cassandra/db/marshal/MapType.java
index 22f4df1..434702a 100644
--- a/src/java/org/apache/cassandra/db/marshal/MapType.java
+++ b/src/java/org/apache/cassandra/db/marshal/MapType.java
@@ -244,7 +244,7 @@ public class MapType<K, V> extends CollectionType<Map<K, V>>
             if (key.startsWith("\""))
                 sb.append(key);
             else
-                sb.append('"').append(Json.JSON_STRING_ENCODER.quoteAsString(key)).append('"');
+                sb.append('"').append(Json.quoteAsJsonString(key)).append('"');
 
             sb.append(": ");
             sb.append(values.toJSONString(CollectionSerializer.readValue(buffer, protocolVersion), protocolVersion));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/UTF8Type.java b/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
index 3fd175c..3b93d9a 100644
--- a/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
+++ b/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
@@ -67,7 +67,7 @@ public class UTF8Type extends AbstractType<String>
     {
         try
         {
-            return '"' + new String(Json.JSON_STRING_ENCODER.quoteAsString(ByteBufferUtil.string(buffer, Charset.forName("UTF-8")))) + '"';
+            return '"' + Json.quoteAsJsonString(ByteBufferUtil.string(buffer, Charset.forName("UTF-8"))) + '"';
         }
         catch (CharacterCodingException exc)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/src/java/org/apache/cassandra/db/marshal/UserType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/UserType.java b/src/java/org/apache/cassandra/db/marshal/UserType.java
index 23e2790..40a35b5 100644
--- a/src/java/org/apache/cassandra/db/marshal/UserType.java
+++ b/src/java/org/apache/cassandra/db/marshal/UserType.java
@@ -206,7 +206,7 @@ public class UserType extends TupleType
                 name = "\"" + name + "\"";
 
             sb.append('"');
-            sb.append(Json.JSON_STRING_ENCODER.quoteAsString(name));
+            sb.append(Json.quoteAsJsonString(name));
             sb.append("\": ");
 
             ByteBuffer valueBuffer = buffers[i];

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6b1bd174/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
index 7f8fa0b..57df1e6 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
@@ -25,6 +25,7 @@ import org.apache.cassandra.serializers.SimpleDateSerializer;
 import org.apache.cassandra.serializers.TimeSerializer;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -32,11 +33,12 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.net.InetAddress;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.UUID;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 public class JsonTest extends CQLTester
@@ -927,11 +929,11 @@ public class JsonTest extends CQLTester
 
         // map<set<text>, text> keys
         String innerKey1 = "[\"0\", \"1\"]";
-        String fullKey1 = String.format("{\"%s\": \"%s\"}", new String(Json.JSON_STRING_ENCODER.quoteAsString(innerKey1)), "a");
-        String stringKey1 = new String(Json.JSON_STRING_ENCODER.quoteAsString(fullKey1));
+        String fullKey1 = String.format("{\"%s\": \"%s\"}", Json.quoteAsJsonString(innerKey1), "a");
+        String stringKey1 = Json.quoteAsJsonString(fullKey1);
         String innerKey2 = "[\"3\", \"4\"]";
-        String fullKey2 = String.format("{\"%s\": \"%s\"}", new String(Json.JSON_STRING_ENCODER.quoteAsString(innerKey2)), "b");
-        String stringKey2 = new String(Json.JSON_STRING_ENCODER.quoteAsString(fullKey2));
+        String fullKey2 = String.format("{\"%s\": \"%s\"}", Json.quoteAsJsonString(innerKey2), "b");
+        String stringKey2 = Json.quoteAsJsonString(fullKey2);
         execute("INSERT INTO %s JSON ?", "{\"k\": 0, \"nestedsetmap\": {\"" + stringKey1 + "\": true, \"" + stringKey2 + "\": false}}");
         assertRows(execute("SELECT JSON k, nestedsetmap FROM %s"), row("{\"k\": 0, \"nestedsetmap\": {\"" + stringKey1 + "\": true, \"" + stringKey2 + "\": false}}"));
 
@@ -955,4 +957,56 @@ public class JsonTest extends CQLTester
         execute("INSERT INTO %s JSON ?", "{\"k\": 0, \"a\": {\"a\": 0, \"b\": [1, 2, 3], \"c\": null}, \"b\": null}");
         assertRows(execute("SELECT k, a.a, a.b, a.c, b FROM %s"), row(0, 0, set(1, 2, 3), null, null));
     }
+
+    // done for CASSANDRA-11048
+    @Test
+    public void testJsonTreadSafety() throws Throwable
+    {
+        int numThreads = 10;
+        final int numRows = 10000;
+
+        createTable("CREATE TABLE %s (" +
+                "k text PRIMARY KEY, " +
+                "v text)");
+
+        for (int i = 0; i < numRows; i++)
+            execute("INSERT INTO %s (k, v) VALUES (?, ?)", "" + i, "" + i);
+
+        long seed = System.nanoTime();
+        System.out.println("Seed " + seed);
+        final Random rand = new Random(seed);
+
+        final Runnable worker = new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                try
+                {
+                    for (int i = 0; i < numRows; i++)
+                    {
+                        String key = "" + rand.nextInt(numRows);
+                        assertRows(execute("SELECT JSON * FROM %s WHERE k = ?", key),
+                                row(String.format("{\"k\": \"%s\", \"v\": \"%s\"}", key, key)));
+                    }
+                }
+                catch (Throwable exc)
+                {
+                    exc.printStackTrace();
+                    fail(exc.getMessage());
+                }
+            }
+        };
+
+        ExecutorService executor = Executors.newFixedThreadPool(numThreads);
+        List<Future> futures = new ArrayList<>();
+        for (int i = 0; i < numThreads; i++)
+            futures.add(executor.submit(worker));
+
+        for (Future future : futures)
+            future.get(10, TimeUnit.SECONDS);
+
+        executor.shutdown();
+        Assert.assertTrue(executor.awaitTermination(10, TimeUnit.SECONDS));
+    }
 }


[3/3] cassandra git commit: Merge branch 'cassandra-3.0' into trunk

Posted by ty...@apache.org.
Merge branch 'cassandra-3.0' into trunk


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/6dc1004c
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/6dc1004c
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/6dc1004c

Branch: refs/heads/trunk
Commit: 6dc1004ce7eded5b0c89a92e4c495c32d2de2819
Parents: b63e6ee 9b5af91
Author: Tyler Hobbs <ty...@gmail.com>
Authored: Thu Feb 11 10:29:55 2016 -0600
Committer: Tyler Hobbs <ty...@gmail.com>
Committed: Thu Feb 11 10:29:55 2016 -0600

----------------------------------------------------------------------
 CHANGES.txt                                     |  3 +-
 src/java/org/apache/cassandra/cql3/Json.java    | 10 ++-
 .../cassandra/cql3/selection/Selection.java     |  2 +-
 .../apache/cassandra/db/marshal/AsciiType.java  |  2 +-
 .../apache/cassandra/db/marshal/MapType.java    |  2 +-
 .../apache/cassandra/db/marshal/UTF8Type.java   |  2 +-
 .../apache/cassandra/db/marshal/UserType.java   |  2 +-
 .../cql3/validation/entities/JsonTest.java      | 70 +++++++++++++++++---
 8 files changed, 77 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/6dc1004c/CHANGES.txt
----------------------------------------------------------------------


[2/3] cassandra git commit: Merge branch 'cassandra-2.2' into cassandra-3.0

Posted by ty...@apache.org.
Merge branch 'cassandra-2.2' into cassandra-3.0

Conflicts:
	CHANGES.txt


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9b5af911
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9b5af911
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9b5af911

Branch: refs/heads/trunk
Commit: 9b5af911c9bfdedaeb6562e0e13e9f44e6dbd4e0
Parents: b2f38ef 6b1bd17
Author: Tyler Hobbs <ty...@gmail.com>
Authored: Thu Feb 11 10:29:46 2016 -0600
Committer: Tyler Hobbs <ty...@gmail.com>
Committed: Thu Feb 11 10:29:46 2016 -0600

----------------------------------------------------------------------
 CHANGES.txt                                     |  3 +-
 src/java/org/apache/cassandra/cql3/Json.java    | 10 ++-
 .../cassandra/cql3/selection/Selection.java     |  2 +-
 .../apache/cassandra/db/marshal/AsciiType.java  |  2 +-
 .../apache/cassandra/db/marshal/MapType.java    |  2 +-
 .../apache/cassandra/db/marshal/UTF8Type.java   |  2 +-
 .../apache/cassandra/db/marshal/UserType.java   |  2 +-
 .../cql3/validation/entities/JsonTest.java      | 70 +++++++++++++++++---
 8 files changed, 77 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b5af911/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index e723aba,3aca720..9be4f38
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,15 -1,5 +1,16 @@@
 -2.2.6
 +3.0.4
 + * Properly handle hinted handoff after topology changes (CASSANDRA-5902)
 + * AssertionError when listing sstable files on inconsistent disk state (CASSANDRA-11156)
 + * Fix wrong rack counting and invalid conditions check for TokenAllocation
 +   (CASSANDRA-11139)
 + * Avoid creating empty hint files (CASSANDRA-11090)
 + * Fix leak detection strong reference loop using weak reference (CASSANDRA-11120)
 + * Configurie BatchlogManager to stop delayed tasks on shutdown (CASSANDRA-11062)
 + * Hadoop integration is incompatible with Cassandra Driver 3.0.0 (CASSANDRA-11001)
 + * Add dropped_columns to the list of schema table so it gets handled
 +   properly (CASSANDRA-11050)
- Merged from 2.2.6:
++Merged from 2.2:
+  * Make SELECT JSON and toJson() threadsafe (CASSANDRA-11048)
   * Fix SELECT on tuple relations for mixed ASC/DESC clustering order (CASSANDRA-7281)
   * (cqlsh) Support utf-8/cp65001 encoding on Windows (CASSANDRA-11030)
   * Fix paging on DISTINCT queries repeats result when first row in partition changes (CASSANDRA-10010)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b5af911/src/java/org/apache/cassandra/cql3/Json.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b5af911/src/java/org/apache/cassandra/cql3/selection/Selection.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b5af911/src/java/org/apache/cassandra/db/marshal/AsciiType.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b5af911/src/java/org/apache/cassandra/db/marshal/MapType.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b5af911/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b5af911/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
----------------------------------------------------------------------