Uploaded image for project: 'Couchbase Java Client'
  1. Couchbase Java Client
  2. JCBC-429

Possible race condition with add() multiple times on the same key

    XMLWordPrintable

Details

    • Bug
    • Resolution: Won't Fix
    • Major
    • None
    • 1.3.2
    • Core
    • Security Level: Public
    • None

    Description

      public class CouchbaseAddTest {

      private ExecutorService pool;

      public static void main(String[] args)

      { new CouchbaseAddTest().run(); }

      public void run() {
      // create a pool of 4 threads
      pool = Executors.newFixedThreadPool(4);

      // create 4 writers to run in parallel
      List<Future> fs = new ArrayList<Future>(4);
      for (int i=0; i<4; i++)

      { fs.add(pool.submit(new Writer(i+1))); }

      for (Future f : fs) {
      try

      { f.get(); }

      catch (Exception e)

      { e.printStackTrace(); }
      }
      pool.shutdown();
      }

      private class Writer implements Runnable {
      private int id;
      private Gson gson;

      public Writer(int id) { this.id = id; gson = new Gson(); }

      @Override
      public void run() {
      try {
      // Connect to the Cluster
      CouchbaseClient client = getClient();

      for (int i=0; i<1; i++) {
      addDoc(client, i);

      try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
      }

      // Shutting down client
      client.shutdown();
      } catch (Exception e) { e.printStackTrace(); }

      }

      private CouchbaseClient getClient() throws IOException, URISyntaxException

      { CouchbaseConnectionFactoryBuilder builder = new CouchbaseConnectionFactoryBuilder(); builder.setReadBufferSize(16384); //16384 builder.setOpTimeout(60000); //60000 builder.setFailureMode(FailureMode.Redistribute); builder. setOpQueueMaxBlockTime(5000); // add extra List<URI> couchServers = Arrays.asList( new URI("http://server1:8091/pools"), new URI("http://server2:8091/pools"), new URI("http://server3:8091/pools"), new URI("http://server4:8091/pools") ); CouchbaseConnectionFactory connectionFactory = builder.buildCouchbaseConnection(couchServers, "usage", "", ""); return new com.couchbase.client.CouchbaseClient(connectionFactory); }

      private void addDoc(CouchbaseClient client, int n) {
      Doc doc = null;
      String value = null;

      String key = String.format("dc1-daily-%d", n);
      if (get(client, key)==null)

      { doc = new Doc(); value = gson.toJson(doc); add(client, key, value); }

      key = String.format("daily-%d", n);
      if (get(client, key)==null) { doc = new Doc(); value = gson.toJson(doc); add(client, key, value); }

      }

      private Object get(CouchbaseClient client, String key)

      { return client.gets(key); }

      private void add(CouchbaseClient client, String key, String value) {

      OperationFuture f = client.add(key, value);
      OperationStatus status = null;
      try

      { status = f.getStatus(); }

      catch (Exception e)

      { e.printStackTrace(); }

      if (status!=null && status.isSuccess())

      { System.out.println(String.format("%d Writer %d - Added %s", System.currentTimeMillis(), id, key)); }

      else

      { System.out.println(String.format("%d Writer %d - Add failed %s", System.currentTimeMillis(), id, key)); }

      }
      }

      private static class Doc {

      public String[] s =

      { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" }

      ;
      }
      }

      In some environments, this leads to duplicate adds being reported:

      1393524003358 Writer 3 - Added dc1-daily-0
      1393524003360 Writer 4 - Added dc1-daily-0
      1393524003363 Writer 4 - Added daily-0
      1393524003363 Writer 3 - Added daily-0
      1393524003367 Writer 2 - Added dc1-daily-0
      1393524003368 Writer 1 - Add failed dc1-daily-0
      1393524003370 Writer 2 - Added daily-0

      instead of the correct

      1393524753507 Writer 1 - Added dc1-daily-0
      1393524753507 Writer 2 - Add failed dc1-daily-0
      1393524753507 Writer 4 - Add failed dc1-daily-0
      1393524753507 Writer 3 - Add failed dc1-daily-0
      1393524753510 Writer 2 - Added daily-0
      1393524753510 Writer 4 - Add failed daily-0
      1393524753510 Writer 1 - Add failed daily-0
      1393524753511 Writer 3 - Add failed daily-0

      reproduction was not yet successful

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            scalabl3 scalabl3
            daschl Michael Nitschinger
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes

                PagerDuty