[ 
https://issues.apache.org/jira/browse/CASSANDRA-11570?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alexander Ryabets updated CASSANDRA-11570:
------------------------------------------
    Description: 
When I use prepared statement for async execution of multiple statements I get 
JSON with broken data. Keys got totally corrupted when values seems to be 
normal though.

First I encoutered this issue when I were performing stress testing of our 
project using custom script. We are using DataStax C++ driver and execute 
statements from different fibers.

Then I was trying to isolate problem and wrote simple C# program which starts 
multiple Tasks in a loop. Each task uses the once created prepared statement to 
read data from the base. As you can see results are totally mess.

I 've attached archive with console C# project (1 cs file) which just print 
resulting JSON to user. 
Here is the main part of C# code.

{noformat}
static void Main(string[] args)
{
  const int task_count = 300;

  using(var cluster = Cluster.Builder().AddContactPoints(/*contact points 
here*/).Build())
  {
    using(var session = cluster.Connect())
    {
      var prepared = session.Prepare("select json * from test_neptunao.ubuntu 
where id=?");
      var tasks = new Task[task_count];
      for(int i = 0; i < task_count; i++)
      {
        tasks[i] = Query(prepared, session);
      }
      Task.WaitAll(tasks);
    }
  }
  Console.ReadKey();
}

private static Task Query(PreparedStatement prepared, ISession session)
{
  string id = GetIdOfRandomRow();
  var stmt = prepared.Bind(id);
  stmt.SetConsistencyLevel(ConsistencyLevel.One);
  return session.ExecuteAsync(stmt).ContinueWith(tr =>
  {
    foreach(var row in tr.Result)
    {
      var value = row.GetValue<string>(0);
      //some kind of output
    }
  });
}
{noformat}

I also attached cql script with test DB schema.

{noformat}
CREATE KEYSPACE IF NOT EXISTS test_neptunao
WITH replication = {
        'class' : 'SimpleStrategy',
        'replication_factor' : 3
};

use test_neptunao;

create table if not exists ubuntu (
        id timeuuid PRIMARY KEY,
        precise_pangolin text,
        trusty_tahr text,
        wily_werewolf text,     
        vivid_vervet text,
        saucy_salamander text,
        lucid_lynx text
);
{noformat}

  was:
When I use prepared statement for async execution of multiple statements I get 
JSON with broken data. Keys got totally corrupted when values seems to be 
normal though.

First I encoutered this issue when I were performing stress testing of our 
project using custom script. We are using DataStax C++ driver and execute 
statements from different fibers.

Then I was trying to isolate problem and wrote simple C# program which starts 
multiple Tasks in a loop. Each task uses the once created prepared statement to 
read data from the base. As you can see results are totally mess.

I 've attached archive with console C# project (1 cs file) which just print 
resulting JSON to user. 
Here is the main part of C# code.

{noformat}
    static void Main(string[] args)
    {
      const int task_count = 300;

      using(var cluster = 
Cluster.Builder().AddContactPoints("127.0.0.1").Build())
      {
        using(var session = cluster.Connect())
        {
          var prepared = session.Prepare("select json * from 
test_neptunao.ubuntu");
          var tasks = new Task[task_count];
          for(int i = 0; i < task_count; i++)
          {
            tasks[i] = Query(prepared, session);
          }
          Task.WaitAll(tasks);
        }
      }
      Console.ReadKey();
    }

    private static Task Query(PreparedStatement prepared, ISession session)
    {
      var stmt = prepared.Bind();
      stmt.SetConsistencyLevel(ConsistencyLevel.One);
      return session.ExecuteAsync(stmt).ContinueWith(tr =>
      {
        foreach(var row in tr.Result)
        {
          var value = row.GetValue<string>(0);
          Console.WriteLine(value);
        }
      });
    }
{noformat}

I also attached cql script with test DB schema.

{noformat}
CREATE KEYSPACE IF NOT EXISTS test_neptunao
WITH replication = {
        'class' : 'SimpleStrategy',
        'replication_factor' : 3
};

use test_neptunao;

create table if not exists ubuntu (
        id timeuuid PRIMARY KEY,
        precise_pangolin text,
        trusty_tahr text,
        wily_werewolf text,     
        vivid_vervet text,
        saucy_salamander text,
        lucid_lynx text
);
{noformat}


> Concurrent execution of prepared statement returns invalid JSON as result
> -------------------------------------------------------------------------
>
>                 Key: CASSANDRA-11570
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-11570
>             Project: Cassandra
>          Issue Type: Bug
>         Environment: Cassandra 3.2, C++ or C# driver
>            Reporter: Alexander Ryabets
>         Attachments: CassandraPreparedStatementsTest.zip, broken_output.txt, 
> test_neptunao.cql, valid_output.txt
>
>
> When I use prepared statement for async execution of multiple statements I 
> get JSON with broken data. Keys got totally corrupted when values seems to be 
> normal though.
> First I encoutered this issue when I were performing stress testing of our 
> project using custom script. We are using DataStax C++ driver and execute 
> statements from different fibers.
> Then I was trying to isolate problem and wrote simple C# program which starts 
> multiple Tasks in a loop. Each task uses the once created prepared statement 
> to read data from the base. As you can see results are totally mess.
> I 've attached archive with console C# project (1 cs file) which just print 
> resulting JSON to user. 
> Here is the main part of C# code.
> {noformat}
> static void Main(string[] args)
> {
>   const int task_count = 300;
>   using(var cluster = Cluster.Builder().AddContactPoints(/*contact points 
> here*/).Build())
>   {
>     using(var session = cluster.Connect())
>     {
>       var prepared = session.Prepare("select json * from test_neptunao.ubuntu 
> where id=?");
>       var tasks = new Task[task_count];
>       for(int i = 0; i < task_count; i++)
>       {
>         tasks[i] = Query(prepared, session);
>       }
>       Task.WaitAll(tasks);
>     }
>   }
>   Console.ReadKey();
> }
> private static Task Query(PreparedStatement prepared, ISession session)
> {
>   string id = GetIdOfRandomRow();
>   var stmt = prepared.Bind(id);
>   stmt.SetConsistencyLevel(ConsistencyLevel.One);
>   return session.ExecuteAsync(stmt).ContinueWith(tr =>
>   {
>     foreach(var row in tr.Result)
>     {
>       var value = row.GetValue<string>(0);
>       //some kind of output
>     }
>   });
> }
> {noformat}
> I also attached cql script with test DB schema.
> {noformat}
> CREATE KEYSPACE IF NOT EXISTS test_neptunao
> WITH replication = {
>       'class' : 'SimpleStrategy',
>       'replication_factor' : 3
> };
> use test_neptunao;
> create table if not exists ubuntu (
>       id timeuuid PRIMARY KEY,
>       precise_pangolin text,
>       trusty_tahr text,
>       wily_werewolf text,     
>       vivid_vervet text,
>       saucy_salamander text,
>       lucid_lynx text
> );
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to