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

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


The following commit(s) were added to refs/heads/2.1 by this push:
     new 0f53ae04db Added import IT that uses same table name in a different 
namespace (#5333)
0f53ae04db is described below

commit 0f53ae04db71b20b939f8fcb67d47c85ef96c9c6
Author: Dave Marion <dlmar...@apache.org>
AuthorDate: Thu Feb 13 14:12:04 2025 -0500

    Added import IT that uses same table name in a different namespace (#5333)
    
    Closes #5326
---
 .../org/apache/accumulo/test/ImportExportIT.java   | 214 +++++++++++----------
 1 file changed, 115 insertions(+), 99 deletions(-)

diff --git a/test/src/main/java/org/apache/accumulo/test/ImportExportIT.java 
b/test/src/main/java/org/apache/accumulo/test/ImportExportIT.java
index 49f01c1b36..995474dcc1 100644
--- a/test/src/main/java/org/apache/accumulo/test/ImportExportIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/ImportExportIT.java
@@ -85,124 +85,140 @@ public class ImportExportIT extends 
AccumuloClusterHarness {
   @Test
   public void testExportImportThenScan() throws Exception {
     try (AccumuloClient client = 
Accumulo.newClient().from(getClientProps()).build()) {
-
       String[] tableNames = getUniqueNames(2);
-      String srcTable = tableNames[0], destTable = tableNames[1];
-      client.tableOperations().create(srcTable);
-
-      try (BatchWriter bw = client.createBatchWriter(srcTable)) {
-        for (int row = 0; row < 1000; row++) {
-          Mutation m = new Mutation(Integer.toString(row));
-          for (int col = 0; col < 100; col++) {
-            m.put(Integer.toString(col), "", Integer.toString(col * 2));
-          }
-          bw.addMutation(m);
-        }
-      }
-
-      client.tableOperations().compact(srcTable, null, null, true, true);
-
-      // Make a directory we can use to throw the export and import directories
-      // Must exist on the filesystem the cluster is running.
-      FileSystem fs = cluster.getFileSystem();
-      log.info("Using FileSystem: " + fs);
-      Path baseDir = new Path(cluster.getTemporaryPath(), 
getClass().getName());
-      fs.deleteOnExit(baseDir);
-      if (fs.exists(baseDir)) {
-        log.info("{} exists on filesystem, deleting", baseDir);
-        assertTrue(fs.delete(baseDir, true), "Failed to deleted " + baseDir);
-      }
-      log.info("Creating {}", baseDir);
-      assertTrue(fs.mkdirs(baseDir), "Failed to create " + baseDir);
-      Path exportDir = new Path(baseDir, "export");
-      fs.deleteOnExit(exportDir);
-      Path importDirA = new Path(baseDir, "import-a");
-      Path importDirB = new Path(baseDir, "import-b");
-      fs.deleteOnExit(importDirA);
-      fs.deleteOnExit(importDirB);
-      for (Path p : new Path[] {exportDir, importDirA, importDirB}) {
-        assertTrue(fs.mkdirs(p), "Failed to create " + p);
-      }
-
-      Set<String> importDirs = Set.of(importDirA.toString(), 
importDirB.toString());
+      doExportImportThenScan(client, tableNames[0], tableNames[1]);
+    }
+  }
 
-      Path[] importDirAry = new Path[] {importDirA, importDirB};
+  @Test
+  public void testExportImportSameTableNameThenScan() throws Exception {
+    try (AccumuloClient client = 
Accumulo.newClient().from(getClientProps()).build()) {
+      String ns1 = "namespace1";
+      client.namespaceOperations().create(ns1);
+      String ns2 = "namespace2";
+      client.namespaceOperations().create(ns2);
+      String tableName = getUniqueNames(1)[0];
+      doExportImportThenScan(client, ns1 + "." + tableName, ns2 + "." + 
tableName);
+    }
+  }
 
-      log.info("Exporting table to {}", exportDir);
-      log.info("Importing table from {}", importDirs);
+  public void doExportImportThenScan(AccumuloClient client, String srcTable, 
String destTable)
+      throws Exception {
 
-      // test fast fail offline check
-      assertThrows(IllegalStateException.class,
-          () -> client.tableOperations().exportTable(srcTable, 
exportDir.toString()));
+    client.tableOperations().create(srcTable);
 
-      // Offline the table
-      client.tableOperations().offline(srcTable, true);
-      // Then export it
-      client.tableOperations().exportTable(srcTable, exportDir.toString());
+    try (BatchWriter bw = client.createBatchWriter(srcTable)) {
+      for (int row = 0; row < 1000; row++) {
+        Mutation m = new Mutation(Integer.toString(row));
+        for (int col = 0; col < 100; col++) {
+          m.put(Integer.toString(col), "", Integer.toString(col * 2));
+        }
+        bw.addMutation(m);
+      }
+    }
 
-      // Make sure the distcp.txt file that exporttable creates is available
-      Path distcp = new Path(exportDir, "distcp.txt");
-      fs.deleteOnExit(distcp);
-      assertTrue(fs.exists(distcp), "Distcp file doesn't exist");
-      FSDataInputStream is = fs.open(distcp);
-      BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+    client.tableOperations().compact(srcTable, null, null, true, true);
+
+    // Make a directory we can use to throw the export and import directories
+    // Must exist on the filesystem the cluster is running.
+    FileSystem fs = cluster.getFileSystem();
+    log.info("Using FileSystem: " + fs);
+    Path baseDir = new Path(cluster.getTemporaryPath(), getClass().getName());
+    fs.deleteOnExit(baseDir);
+    if (fs.exists(baseDir)) {
+      log.info("{} exists on filesystem, deleting", baseDir);
+      assertTrue(fs.delete(baseDir, true), "Failed to deleted " + baseDir);
+    }
+    log.info("Creating {}", baseDir);
+    assertTrue(fs.mkdirs(baseDir), "Failed to create " + baseDir);
+    Path exportDir = new Path(baseDir, "export");
+    fs.deleteOnExit(exportDir);
+    Path importDirA = new Path(baseDir, "import-a");
+    Path importDirB = new Path(baseDir, "import-b");
+    fs.deleteOnExit(importDirA);
+    fs.deleteOnExit(importDirB);
+    for (Path p : new Path[] {exportDir, importDirA, importDirB}) {
+      assertTrue(fs.mkdirs(p), "Failed to create " + p);
+    }
 
-      // Copy each file that was exported to one of the imports directory
-      String line;
+    Set<String> importDirs = Set.of(importDirA.toString(), 
importDirB.toString());
 
-      while ((line = reader.readLine()) != null) {
-        Path p = new Path(line.substring(5));
-        assertTrue(fs.exists(p), "File doesn't exist: " + p);
-        Path importDir = importDirAry[random.nextInt(importDirAry.length)];
-        Path dest = new Path(importDir, p.getName());
-        assertFalse(fs.exists(dest), "Did not expect " + dest + " to exist");
-        FileUtil.copy(fs, p, fs, dest, false, fs.getConf());
-      }
+    Path[] importDirAry = new Path[] {importDirA, importDirB};
 
-      reader.close();
+    log.info("Exporting table to {}", exportDir);
+    log.info("Importing table from {}", importDirs);
 
-      log.info("Import dir A: {}", Arrays.toString(fs.listStatus(importDirA)));
-      log.info("Import dir B: {}", Arrays.toString(fs.listStatus(importDirB)));
+    // test fast fail offline check
+    assertThrows(IllegalStateException.class,
+        () -> client.tableOperations().exportTable(srcTable, 
exportDir.toString()));
 
-      // Import the exported data into a new table
-      client.tableOperations().importTable(destTable, importDirs, 
ImportConfiguration.empty());
+    // Offline the table
+    client.tableOperations().offline(srcTable, true);
+    // Then export it
+    client.tableOperations().exportTable(srcTable, exportDir.toString());
 
-      // Get the table ID for the table that the importtable command created
-      final String tableId = 
client.tableOperations().tableIdMap().get(destTable);
-      assertNotNull(tableId);
+    // Make sure the distcp.txt file that exporttable creates is available
+    Path distcp = new Path(exportDir, "distcp.txt");
+    fs.deleteOnExit(distcp);
+    assertTrue(fs.exists(distcp), "Distcp file doesn't exist");
+    FSDataInputStream is = fs.open(distcp);
+    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
 
-      // Get all `file` colfams from the metadata table for the new table
-      log.info("Imported into table with ID: {}", tableId);
+    // Copy each file that was exported to one of the imports directory
+    String line;
 
-      try (Scanner s = client.createScanner(MetadataTable.NAME, 
Authorizations.EMPTY)) {
-        s.setRange(TabletsSection.getRange(TableId.of(tableId)));
-        s.fetchColumnFamily(DataFileColumnFamily.NAME);
-        ServerColumnFamily.DIRECTORY_COLUMN.fetch(s);
+    while ((line = reader.readLine()) != null) {
+      Path p = new Path(line.substring(5));
+      assertTrue(fs.exists(p), "File doesn't exist: " + p);
+      Path importDir = importDirAry[random.nextInt(importDirAry.length)];
+      Path dest = new Path(importDir, p.getName());
+      assertFalse(fs.exists(dest), "Did not expect " + dest + " to exist");
+      FileUtil.copy(fs, p, fs, dest, false, fs.getConf());
+    }
 
-        // Should find a single entry
-        for (Entry<Key,Value> fileEntry : s) {
-          Key k = fileEntry.getKey();
-          String value = fileEntry.getValue().toString();
-          if (k.getColumnFamily().equals(DataFileColumnFamily.NAME)) {
-            // The file should be an absolute URI (file:///...), not a 
relative path
-            // (/b-000.../I000001.rf)
-            String fileUri = k.getColumnQualifier().toString();
-            assertFalse(looksLikeRelativePath(fileUri),
-                "Imported files should have absolute URIs, not relative: " + 
fileUri);
-          } else if (k.getColumnFamily().equals(ServerColumnFamily.NAME)) {
-            assertFalse(looksLikeRelativePath(value),
-                "Server directory should have absolute URI, not relative: " + 
value);
-          } else {
-            fail("Got expected pair: " + k + "=" + fileEntry.getValue());
-          }
+    reader.close();
+
+    log.info("Import dir A: {}", Arrays.toString(fs.listStatus(importDirA)));
+    log.info("Import dir B: {}", Arrays.toString(fs.listStatus(importDirB)));
+
+    // Import the exported data into a new table
+    client.tableOperations().importTable(destTable, importDirs, 
ImportConfiguration.empty());
+
+    // Get the table ID for the table that the importtable command created
+    final String tableId = 
client.tableOperations().tableIdMap().get(destTable);
+    assertNotNull(tableId);
+
+    // Get all `file` colfams from the metadata table for the new table
+    log.info("Imported into table with ID: {}", tableId);
+
+    try (Scanner s = client.createScanner(MetadataTable.NAME, 
Authorizations.EMPTY)) {
+      s.setRange(TabletsSection.getRange(TableId.of(tableId)));
+      s.fetchColumnFamily(DataFileColumnFamily.NAME);
+      ServerColumnFamily.DIRECTORY_COLUMN.fetch(s);
+
+      // Should find a single entry
+      for (Entry<Key,Value> fileEntry : s) {
+        Key k = fileEntry.getKey();
+        String value = fileEntry.getValue().toString();
+        if (k.getColumnFamily().equals(DataFileColumnFamily.NAME)) {
+          // The file should be an absolute URI (file:///...), not a relative 
path
+          // (/b-000.../I000001.rf)
+          String fileUri = k.getColumnQualifier().toString();
+          assertFalse(looksLikeRelativePath(fileUri),
+              "Imported files should have absolute URIs, not relative: " + 
fileUri);
+        } else if (k.getColumnFamily().equals(ServerColumnFamily.NAME)) {
+          assertFalse(looksLikeRelativePath(value),
+              "Server directory should have absolute URI, not relative: " + 
value);
+        } else {
+          fail("Got expected pair: " + k + "=" + fileEntry.getValue());
         }
-
       }
-      // Online the original table before we verify equivalence
-      client.tableOperations().online(srcTable, true);
 
-      verifyTableEquality(client, srcTable, destTable);
     }
+    // Online the original table before we verify equivalence
+    client.tableOperations().online(srcTable, true);
+
+    verifyTableEquality(client, srcTable, destTable);
   }
 
   @Test

Reply via email to