ACCUMULO-626 Test scenario of deepCopy in the middle of an iteration.

Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/822bc5ad
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/822bc5ad
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/822bc5ad

Branch: refs/heads/master
Commit: 822bc5ad30c9c6dfa91ac587aa1082ce0b74ffbe
Parents: b332873
Author: Dylan Hutchison <[email protected]>
Authored: Thu Dec 10 10:20:40 2015 -0800
Committer: Josh Elser <[email protected]>
Committed: Mon Dec 14 00:29:34 2015 -0500

----------------------------------------------------------------------
 .../testcases/IsolatedDeepCopiesTestCase.java   | 38 +++++++++++++++++---
 1 file changed, 33 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/822bc5ad/iterator-test-harness/src/main/java/org/apache/accumulo/iteratortest/testcases/IsolatedDeepCopiesTestCase.java
----------------------------------------------------------------------
diff --git 
a/iterator-test-harness/src/main/java/org/apache/accumulo/iteratortest/testcases/IsolatedDeepCopiesTestCase.java
 
b/iterator-test-harness/src/main/java/org/apache/accumulo/iteratortest/testcases/IsolatedDeepCopiesTestCase.java
index b874962..2bc1e63 100644
--- 
a/iterator-test-harness/src/main/java/org/apache/accumulo/iteratortest/testcases/IsolatedDeepCopiesTestCase.java
+++ 
b/iterator-test-harness/src/main/java/org/apache/accumulo/iteratortest/testcases/IsolatedDeepCopiesTestCase.java
@@ -20,10 +20,13 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Random;
+import java.util.Set;
 import java.util.TreeMap;
 
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.iteratortest.IteratorTestInput;
@@ -36,6 +39,8 @@ import 
org.apache.accumulo.iteratortest.environments.SimpleIteratorEnvironment;
  */
 public class IsolatedDeepCopiesTestCase extends OutputVerifyingTestCase {
 
+  private final Random random = new Random();
+
   @Override
   public IteratorTestOutput test(IteratorTestInput testInput) {
     final SortedKeyValueIterator<Key,Value> skvi = 
IteratorTestUtil.instantiateIterator(testInput);
@@ -47,11 +52,15 @@ public class IsolatedDeepCopiesTestCase extends 
OutputVerifyingTestCase {
       SortedKeyValueIterator<Key,Value> copy1 = skvi.deepCopy(new 
SimpleIteratorEnvironment());
       SortedKeyValueIterator<Key,Value> copy2 = copy1.deepCopy(new 
SimpleIteratorEnvironment());
 
-      skvi.seek(testInput.getRange(), Collections.<ByteSequence> emptySet(), 
false);
-      copy1.seek(testInput.getRange(), Collections.<ByteSequence> emptySet(), 
false);
-      copy2.seek(testInput.getRange(), Collections.<ByteSequence> emptySet(), 
false);
+      Range seekRange = testInput.getRange();
+      Set<ByteSequence> seekColumnFamilies = Collections.<ByteSequence> 
emptySet();
+      boolean seekInclusive = false;
+
+      skvi.seek(testInput.getRange(), seekColumnFamilies, seekInclusive);
+      copy1.seek(testInput.getRange(), seekColumnFamilies, seekInclusive);
+      copy2.seek(testInput.getRange(), seekColumnFamilies, seekInclusive);
 
-      TreeMap<Key,Value> output = consumeMany(Arrays.asList(skvi, copy1, 
copy2));
+      TreeMap<Key,Value> output = consumeMany(Arrays.asList(skvi, copy1, 
copy2), seekRange, seekColumnFamilies, seekInclusive);
 
       return new IteratorTestOutput(output);
     } catch (IOException e) {
@@ -59,10 +68,18 @@ public class IsolatedDeepCopiesTestCase extends 
OutputVerifyingTestCase {
     }
   }
 
-  TreeMap<Key,Value> consumeMany(Collection<SortedKeyValueIterator<Key,Value>> 
iterators) throws IOException {
+  TreeMap<Key,Value> consumeMany(Collection<SortedKeyValueIterator<Key,Value>> 
iterators, Range range, Set<ByteSequence> seekColumnFamilies,
+      boolean seekInclusive) throws IOException {
     TreeMap<Key,Value> data = new TreeMap<>();
     // All of the copies should have consistent results from concurrent use
     while (allHasTop(iterators)) {
+      // occasionally deep copy one of the existing iterators
+      if (random.nextInt(3) == 0) {
+        SortedKeyValueIterator<Key,Value> newcopy = 
getRandomElement(iterators).deepCopy(new SimpleIteratorEnvironment());
+        newcopy.seek(new Range(getTopKey(iterators), true, range.getEndKey(), 
range.isEndKeyInclusive()), seekColumnFamilies, seekInclusive);
+        iterators.add(newcopy);
+      }
+
       data.put(getTopKey(iterators), getTopValue(iterators));
       next(iterators);
     }
@@ -77,6 +94,17 @@ public class IsolatedDeepCopiesTestCase extends 
OutputVerifyingTestCase {
     return data;
   }
 
+  private <E> E getRandomElement(Collection<E> iterators) {
+    if (iterators == null || iterators.size() == 0)
+      throw new IllegalArgumentException("should not pass an empty 
collection");
+    int num = random.nextInt(iterators.size());
+    for (E e : iterators) {
+      if (num-- == 0)
+        return e;
+    }
+    throw new AssertionError();
+  }
+
   boolean allHasTop(Collection<SortedKeyValueIterator<Key,Value>> iterators) {
     for (SortedKeyValueIterator<Key,Value> iter : iterators) {
       if (!iter.hasTop()) {

Reply via email to