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

kturner pushed a commit to branch 1.9
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/1.9 by this push:
     new 556c29e  fix #1326 Copy instead of clone metadata table in IT
556c29e is described below

commit 556c29ee60c80b1fa8464fa85f24be44d8e0608d
Author: Keith Turner <ktur...@apache.org>
AuthorDate: Thu Aug 15 13:25:12 2019 -0400

    fix #1326 Copy instead of clone metadata table in IT
    
    After the changes in #1309 cloning of metdata table is no longer
    allowed. TabletStateChangeIteratorIT relied on cloning and
    was changed to copy instead.
    
    Also the test was very sensitive to concurrent chnages in the metadata
    table.  Suspect that cloning used to introduce a delay that hid this.
    The change from cloning to copying caused the test to fail often
    because of these timing issues.  To avoid this, the test was refactored
    to tolerate concurrent changes to the metadata table.
---
 .../functional/TabletStateChangeIteratorIT.java    | 71 ++++++++++++++++------
 1 file changed, 52 insertions(+), 19 deletions(-)

diff --git 
a/test/src/main/java/org/apache/accumulo/test/functional/TabletStateChangeIteratorIT.java
 
b/test/src/main/java/org/apache/accumulo/test/functional/TabletStateChangeIteratorIT.java
index 6a30292..2fd8589 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/TabletStateChangeIteratorIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/TabletStateChangeIteratorIT.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.SortedSet;
@@ -34,7 +35,9 @@ import org.apache.accumulo.core.client.BatchDeleter;
 import org.apache.accumulo.core.client.BatchWriter;
 import org.apache.accumulo.core.client.BatchWriterConfig;
 import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.IsolatedScanner;
 import org.apache.accumulo.core.client.MutationsRejectedException;
+import org.apache.accumulo.core.client.RowIterator;
 import org.apache.accumulo.core.client.Scanner;
 import org.apache.accumulo.core.client.TableExistsException;
 import org.apache.accumulo.core.client.TableNotFoundException;
@@ -78,11 +81,13 @@ public class TabletStateChangeIteratorIT extends 
AccumuloClusterHarness {
   @Test
   public void test() throws AccumuloException, AccumuloSecurityException, 
TableExistsException,
       TableNotFoundException {
-    String[] tables = getUniqueNames(4);
+    String[] tables = getUniqueNames(6);
     final String t1 = tables[0];
     final String t2 = tables[1];
     final String t3 = tables[2];
-    final String cloned = tables[3];
+    final String metaCopy1 = tables[3];
+    final String metaCopy2 = tables[4];
+    final String metaCopy3 = tables[5];
 
     // create some metadata
     createTable(t1, true);
@@ -90,25 +95,30 @@ public class TabletStateChangeIteratorIT extends 
AccumuloClusterHarness {
     createTable(t3, true);
 
     // examine a clone of the metadata table, so we can manipulate it
-    cloneMetadataTable(cloned);
+    copyTable(MetadataTable.NAME, metaCopy1);
 
     State state = new State();
-    while (findTabletsNeedingAttention(cloned, state) > 0) {
+    while (findTabletsNeedingAttention(metaCopy1, state) > 0) {
       UtilWaitThread.sleep(500);
+      copyTable(MetadataTable.NAME, metaCopy1);
     }
-    assertEquals("No tables should need attention", 0, 
findTabletsNeedingAttention(cloned, state));
+    assertEquals("No tables should need attention", 0,
+        findTabletsNeedingAttention(metaCopy1, state));
+
+    // The metadata table stabilized and metaCopy1 contains a copy suitable 
for testing. Before
+    // metaCopy1 is modified, copy it for subsequent test.
+    copyTable(metaCopy1, metaCopy2);
+    copyTable(metaCopy1, metaCopy3);
 
     // test the assigned case (no location)
-    removeLocation(cloned, t3);
+    removeLocation(metaCopy1, t3);
     assertEquals("Should have two tablets without a loc", 2,
-        findTabletsNeedingAttention(cloned, state));
+        findTabletsNeedingAttention(metaCopy1, state));
 
     // test the cases where the assignment is to a dead tserver
-    getConnector().tableOperations().delete(cloned);
-    cloneMetadataTable(cloned);
-    reassignLocation(cloned, t3);
+    reassignLocation(metaCopy2, t3);
     assertEquals("Should have one tablet that needs to be unassigned", 1,
-        findTabletsNeedingAttention(cloned, state));
+        findTabletsNeedingAttention(metaCopy2, state));
 
     // test the cases where there is ongoing merges
     state = new State() {
@@ -120,17 +130,16 @@ public class TabletStateChangeIteratorIT extends 
AccumuloClusterHarness {
       }
     };
     assertEquals("Should have 2 tablets that need to be chopped or 
unassigned", 1,
-        findTabletsNeedingAttention(cloned, state));
+        findTabletsNeedingAttention(metaCopy2, state));
 
     // test the bad tablet location state case (inconsistent metadata)
     state = new State();
-    cloneMetadataTable(cloned);
-    addDuplicateLocation(cloned, t3);
+    addDuplicateLocation(metaCopy3, t3);
     assertEquals("Should have 1 tablet that needs a metadata repair", 1,
-        findTabletsNeedingAttention(cloned, state));
+        findTabletsNeedingAttention(metaCopy3, state));
 
     // clean up
-    dropTables(t1, t2, t3, cloned);
+    dropTables(t1, t2, t3, metaCopy1, metaCopy2, metaCopy3);
   }
 
   private void addDuplicateLocation(String table, String tableNameToModify)
@@ -183,6 +192,7 @@ public class TabletStateChangeIteratorIT extends 
AccumuloClusterHarness {
       if (e != null)
         results++;
     }
+
     return results;
   }
 
@@ -199,14 +209,37 @@ public class TabletStateChangeIteratorIT extends 
AccumuloClusterHarness {
     }
   }
 
-  private void cloneMetadataTable(String cloned) throws AccumuloException,
+  private void copyTable(String source, String copy) throws AccumuloException,
       AccumuloSecurityException, TableNotFoundException, TableExistsException {
     try {
-      dropTables(cloned);
+      dropTables(copy);
     } catch (TableNotFoundException ex) {
       // ignored
     }
-    getConnector().tableOperations().clone(MetadataTable.NAME, cloned, true, 
null, null);
+
+    getConnector().tableOperations().create(copy);
+
+    try (Scanner scanner = getConnector().createScanner(source, 
Authorizations.EMPTY);
+        BatchWriter writer = getConnector().createBatchWriter(copy, new 
BatchWriterConfig())) {
+      RowIterator rows = new RowIterator(new IsolatedScanner(scanner));
+
+      while (rows.hasNext()) {
+        Iterator<Entry<Key,Value>> row = rows.next();
+        Mutation m = null;
+
+        while (row.hasNext()) {
+          Entry<Key,Value> entry = row.next();
+          Key k = entry.getKey();
+          if (m == null)
+            m = new Mutation(k.getRow());
+
+          m.put(k.getColumnFamily(), k.getColumnQualifier(), 
k.getColumnVisibilityParsed(),
+              k.getTimestamp(), entry.getValue());
+        }
+
+        writer.addMutation(m);
+      }
+    }
   }
 
   private void dropTables(String... tables)

Reply via email to