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 fa1d893 fix #1309 prevent cloning accumulo.metadata (#1311) fa1d893 is described below commit fa1d893f26f1f5e7974e02fc5757c5e2ff0a29df Author: Keith Turner <ktur...@apache.org> AuthorDate: Wed Aug 14 16:06:26 2019 -0400 fix #1309 prevent cloning accumulo.metadata (#1311) --- .../apache/accumulo/master/FateServiceHandler.java | 3 ++- .../accumulo/master/util/TableValidators.java | 22 ++++++++++++++++++++++ .../accumulo/test/functional/CloneTestIT.java | 13 +++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java index c9b20cf..7949ac2 100644 --- a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java +++ b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java @@ -16,6 +16,7 @@ */ package org.apache.accumulo.master; +import static org.apache.accumulo.master.util.TableValidators.CAN_CLONE; import static org.apache.accumulo.master.util.TableValidators.NOT_METADATA; import static org.apache.accumulo.master.util.TableValidators.NOT_ROOT_ID; import static org.apache.accumulo.master.util.TableValidators.NOT_SYSTEM; @@ -224,7 +225,7 @@ class FateServiceHandler implements FateService.Iface { case TABLE_CLONE: { TableOperation tableOp = TableOperation.CLONE; validateArgumentCount(arguments, tableOp, 2); - String srcTableId = validateTableIdArgument(arguments.get(0), tableOp, NOT_ROOT_ID); + String srcTableId = validateTableIdArgument(arguments.get(0), tableOp, CAN_CLONE); String tableName = validateTableNameArgument(arguments.get(1), tableOp, NOT_SYSTEM); String namespaceId; try { diff --git a/server/master/src/main/java/org/apache/accumulo/master/util/TableValidators.java b/server/master/src/main/java/org/apache/accumulo/master/util/TableValidators.java index c6ef8c5..a9d3edb 100644 --- a/server/master/src/main/java/org/apache/accumulo/master/util/TableValidators.java +++ b/server/master/src/main/java/org/apache/accumulo/master/util/TableValidators.java @@ -79,6 +79,28 @@ public class TableValidators { } }; + public static final Validator<String> CAN_CLONE = new Validator<String>() { + + private List<String> metaIDs = Arrays.asList(RootTable.ID, MetadataTable.ID); + + @Override + public boolean apply(String tableId) { + return !metaIDs.contains(tableId); + } + + @Override + public String invalidMessage(String tableId) { + String msg; + if (tableId.equals(MetadataTable.ID)) { + msg = " Cloning " + MetadataTable.NAME + + " is dangerous and no longer supported, see https://github.com/apache/accumulo/issues/1309."; + } else { + msg = "Can not clone " + RootTable.NAME; + } + return msg; + } + }; + public static final Validator<String> NOT_SYSTEM = new Validator<String>() { @Override diff --git a/test/src/main/java/org/apache/accumulo/test/functional/CloneTestIT.java b/test/src/main/java/org/apache/accumulo/test/functional/CloneTestIT.java index 74c6885..d76a28a 100644 --- a/test/src/main/java/org/apache/accumulo/test/functional/CloneTestIT.java +++ b/test/src/main/java/org/apache/accumulo/test/functional/CloneTestIT.java @@ -33,6 +33,7 @@ import java.util.Set; import java.util.TreeSet; import org.apache.accumulo.cluster.AccumuloCluster; +import org.apache.accumulo.core.client.AccumuloException; import org.apache.accumulo.core.client.BatchWriter; import org.apache.accumulo.core.client.BatchWriterConfig; import org.apache.accumulo.core.client.Connector; @@ -46,6 +47,7 @@ import org.apache.accumulo.core.data.Mutation; import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.metadata.MetadataTable; +import org.apache.accumulo.core.metadata.RootTable; import org.apache.accumulo.core.metadata.schema.MetadataSchema; import org.apache.accumulo.core.security.Authorizations; import org.apache.accumulo.harness.AccumuloClusterHarness; @@ -301,4 +303,15 @@ public class CloneTestIT extends AccumuloClusterHarness { assertEquals(rows, actualRows); } + @Test(expected = AccumuloException.class) + public void testCloneRootTable() throws Exception { + Connector conn = getConnector(); + conn.tableOperations().clone(RootTable.NAME, "rc1", true, null, null); + } + + @Test(expected = AccumuloException.class) + public void testCloneMetadataTable() throws Exception { + Connector conn = getConnector(); + conn.tableOperations().clone(MetadataTable.NAME, "mc1", true, null, null); + } }