You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by nn...@apache.org on 2018/01/05 01:21:04 UTC

[geode] branch develop updated: GEODE-4184: Handled concurrent access of HashSet

This is an automated email from the ASF dual-hosted git repository.

nnag pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 2249d60  GEODE-4184: Handled concurrent access of HashSet
2249d60 is described below

commit 2249d609a985620436dabb49ecfb4767ca50987a
Author: nabarun <nn...@pivotal.io>
AuthorDate: Wed Jan 3 11:51:07 2018 -0800

    GEODE-4184: Handled concurrent access of HashSet
    
    	* mapIndexKeys was a HashSet and concurrent access to it resulted in inconsistent data to be present.
    	* Changed to a set with a concurrent hash map as a backing store.
---
 .../query/internal/index/PartitionedIndex.java     |  3 +-
 .../internal/index/PartitionedIndexJUnitTest.java  | 69 ++++++++++++++++++++++
 2 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/PartitionedIndex.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/PartitionedIndex.java
index ab0ec14..25765ff 100755
--- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/PartitionedIndex.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/index/PartitionedIndex.java
@@ -22,6 +22,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.query.Index;
@@ -77,7 +78,7 @@ public class PartitionedIndex extends AbstractIndex {
    */
   private String imports;
 
-  private HashSet mapIndexKeys = new HashSet();
+  protected Set mapIndexKeys = Collections.newSetFromMap(new ConcurrentHashMap());
 
   // Flag indicating that the populationg of this index is in progress
   private volatile boolean populateInProgress;
diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/PartitionedIndexJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/PartitionedIndexJUnitTest.java
new file mode 100644
index 0000000..58b4ec2
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/cache/query/internal/index/PartitionedIndexJUnitTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.geode.cache.query.internal.index;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.query.IndexType;
+import org.apache.geode.distributed.DistributedSystem;
+import org.apache.geode.test.junit.categories.IntegrationTest;
+
+@Category(IntegrationTest.class)
+public class PartitionedIndexJUnitTest {
+
+  @Test
+  public void mapIndexKeysMustContainTheCorrectNumberOfKeysWhenThereIsConcurrentAccess() {
+
+    final int DATA_SIZE_TO_BE_POPULATED = 10000;
+    final int THREAD_POOL_SIZE = 20;
+
+    Region region = mock(Region.class);
+    Cache cache = mock(Cache.class);
+    when(region.getCache()).thenReturn(cache);
+    DistributedSystem distributedSystem = mock(DistributedSystem.class);
+    when(cache.getDistributedSystem()).thenReturn(distributedSystem);
+    PartitionedIndex partitionedIndex = new PartitionedIndex(IndexType.FUNCTIONAL, "dummyString",
+        region, "dummyString", "dummyString", "dummyString");
+    Runnable populateSetTask = () -> {
+      for (int i = 0; i < DATA_SIZE_TO_BE_POPULATED; i++) {
+        partitionedIndex.mapIndexKeys.add("" + i);
+      }
+    };
+    Thread[] threads = new Thread[THREAD_POOL_SIZE];
+    for (int i = 0; i < threads.length; i++) {
+      threads[i] = new Thread(populateSetTask);
+      threads[i].start();
+    }
+    try {
+      for (int i = 0; i < threads.length; i++) {
+        threads[i].join();
+      }
+    } catch (InterruptedException e) {
+      e.printStackTrace();
+      fail();
+    }
+
+    assertEquals(DATA_SIZE_TO_BE_POPULATED, partitionedIndex.mapIndexKeys.size());
+
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].