ACCUMULO-802 Added global shell completion for table namespaces with -tn (just like -t for tables). Fixed problem with RenameTable to a new namespace copying over the old namespace configuration to the new table. Many other minor fixes. A few tests fail due to CloneTable not working until ACCUMULO-1565 is fixed
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/fd5f11df Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/fd5f11df Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/fd5f11df Branch: refs/heads/ACCUMULO-802 Commit: fd5f11df840873205c33afb31c899fb11ad99a81 Parents: 77a3aa4 Author: Sean Hickey <[email protected]> Authored: Fri Jul 12 13:44:29 2013 -0400 Committer: Christopher Tubbs <[email protected]> Committed: Thu Oct 31 21:24:10 2013 -0400 ---------------------------------------------------------------------- .../core/client/admin/TableOperationsImpl.java | 28 ++++---- .../core/util/shell/ShellCompletor.java | 17 +++-- .../accumulo/core/util/shell/ShellOptions.java | 1 + .../util/shell/commands/CreateTableCommand.java | 75 ++++++++++++-------- .../util/shell/commands/DeleteTableCommand.java | 10 ++- .../util/shell/commands/RenameTableCommand.java | 16 +++-- .../server/conf/ServerConfiguration.java | 21 +++++- .../conf/TableNamespaceConfiguration.java | 19 ++++- .../apache/accumulo/server/init/Initialize.java | 8 +++ .../java/org/apache/accumulo/master/Master.java | 8 +++ .../test/randomwalk/concurrent/Setup.java | 4 +- .../org/apache/accumulo/test/ShellServerIT.java | 18 +++++ 12 files changed, 168 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsImpl.java b/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsImpl.java index 6fa4174..ab8ec7a 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsImpl.java @@ -217,12 +217,16 @@ public class TableOperationsImpl extends TableOperationsHelper { List<ByteBuffer> args = Arrays.asList(ByteBuffer.wrap(tableName.getBytes()), ByteBuffer.wrap(timeType.name().getBytes())); - Map<String,String> opts = IteratorUtil.generateInitialTableProperties(limitVersion); + // Map<String,String> opts = IteratorUtil.generateInitialTableProperties(limitVersion); + Map<String,String> opts = new HashMap<String,String>(); String namespace = Tables.extractNamespace(tableName); if (!namespaceExists(namespace)) { String info = "Table namespace not found while trying to create table"; - throw new RuntimeException(new TableNamespaceNotFoundException(null, namespace, info)); + throw new IllegalArgumentException(new TableNamespaceNotFoundException(null, namespace, info)); + } else if (namespace.equals(Constants.SYSTEM_TABLE_NAMESPACE)) { + String info = "Can't create tables in the system namespace"; + throw new IllegalArgumentException(info); } try { @@ -693,18 +697,17 @@ public class TableOperationsImpl extends TableOperationsHelper { _flush(srcTableId, null, null, true); if (propertiesToExclude == null) - propertiesToExclude = new HashSet<String>(); + propertiesToExclude = Collections.emptySet(); if (propertiesToSet == null) propertiesToSet = Collections.emptyMap(); - - Set<String> nProps = getUniqueNamespaceProperties(namespace, srcTableName); - for (String p : nProps) { - propertiesToExclude.add(p); + HashSet<String> excludeProps = getUniqueNamespaceProperties(namespace, srcTableName); + for (String p : propertiesToExclude) { + excludeProps.add(p); } - if (!Collections.disjoint(propertiesToExclude, propertiesToSet.keySet())) + if (!Collections.disjoint(excludeProps, propertiesToSet.keySet())) throw new IllegalArgumentException("propertiesToSet and propertiesToExclude not disjoint"); List<ByteBuffer> args = Arrays.asList(ByteBuffer.wrap(srcTableId.getBytes()), ByteBuffer.wrap(newTableName.getBytes())); @@ -722,9 +725,10 @@ public class TableOperationsImpl extends TableOperationsHelper { doTableOperation(TableOperation.CLONE, args, opts); } - private Set<String> getUniqueNamespaceProperties(String namespace, String table) throws TableNotFoundException, AccumuloException { - Set<String> props = new HashSet<String>(); - /*try { + // get the properties that are only in the table namespace so that we can exclude them when copying table properties + private HashSet<String> getUniqueNamespaceProperties(String namespace, String table) throws TableNotFoundException, AccumuloException { + HashSet<String> props = new HashSet<String>(); + try { Iterable<Entry<String,String>> n = new TableNamespaceOperationsImpl(instance, credentials).getProperties(namespace); Iterable<Entry<String,String>> t = getProperties(table); Map<String,String> tmap = new HashMap<String,String>(); @@ -739,7 +743,7 @@ public class TableOperationsImpl extends TableOperationsHelper { } } catch (TableNamespaceNotFoundException e) { throw new IllegalStateException(new TableNamespaceNotFoundException(null, namespace, null)); - }*/ + } return props; } http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/core/src/main/java/org/apache/accumulo/core/util/shell/ShellCompletor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/ShellCompletor.java b/core/src/main/java/org/apache/accumulo/core/util/shell/ShellCompletor.java index 85f68ef..4046714 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/ShellCompletor.java +++ b/core/src/main/java/org/apache/accumulo/core/util/shell/ShellCompletor.java @@ -57,7 +57,7 @@ public class ShellCompletor implements Completer { } private int _complete(String fullBuffer, int cursor, List<String> candidates) { - boolean inTableFlag = false, inUserFlag = false; + boolean inTableFlag = false, inUserFlag = false, inNamespaceFlag = false; // Only want to grab the buffer up to the cursor because // the user could be trying to tab complete in the middle // of the line @@ -98,7 +98,10 @@ public class ShellCompletor implements Completer { } else if (current_string_token.trim().equals("-" + Shell.userOption)) { candidates.addAll(options.get(Shell.Command.CompletionSet.USERNAMES)); prefix += "-" + Shell.userOption + " "; - } else if (current_command_token != null) { + } else if (current_string_token.trim().equals("-" + Shell.tableNamespaceOption)) { + candidates.addAll(options.get(Shell.Command.CompletionSet.TABLENAMESPACES)); + prefix += "-" + Shell.tableNamespaceOption + " "; + }else if (current_command_token != null) { Token next = current_command_token.getSubcommand(current_string_token); if (next != null) { current_command_token = next; @@ -115,7 +118,7 @@ public class ShellCompletor implements Completer { return (prefix.length()); } // need to match current command - // if we're in -t <table> or -u <user> complete those + // if we're in -t <table>, -u <user>, or -tn <tableNamespace> complete those if (inTableFlag) { for (String a : options.get(Shell.Command.CompletionSet.TABLENAMES)) if (a.startsWith(current_string_token)) @@ -124,6 +127,10 @@ public class ShellCompletor implements Completer { for (String a : options.get(Shell.Command.CompletionSet.USERNAMES)) if (a.startsWith(current_string_token)) candidates.add(a); + } else if (inNamespaceFlag) { + for (String a : options.get(Shell.Command.CompletionSet.TABLENAMESPACES)) + if (a.startsWith(current_string_token)) + candidates.add(a); } else if (current_command_token != null) candidates.addAll(current_command_token.getSubcommandNames(current_string_token)); @@ -135,8 +142,10 @@ public class ShellCompletor implements Completer { inTableFlag = true; else if (current_string_token.trim().equals("-" + Shell.userOption)) inUserFlag = true; + else if (current_string_token.trim().equals("-" + Shell.tableNamespaceOption)) + inNamespaceFlag = true; else - inUserFlag = inTableFlag = false; + inUserFlag = inTableFlag = inNamespaceFlag = false; if (current_command_token != null && current_command_token.getCaseSensitive()) prefix += current_string_token + " "; http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptions.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptions.java b/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptions.java index 3152973..af55d8d 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptions.java +++ b/core/src/main/java/org/apache/accumulo/core/util/shell/ShellOptions.java @@ -25,6 +25,7 @@ public abstract class ShellOptions { // Global options flags public static final String userOption = "u"; public static final String tableOption = "t"; + public static final String tableNamespaceOption = "tn"; public static final String helpOption = "?"; public static final String helpLongOption = "help"; http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateTableCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateTableCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateTableCommand.java index 0ad787d..8081d92 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateTableCommand.java +++ b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/CreateTableCommand.java @@ -18,8 +18,10 @@ package org.apache.accumulo.core.util.shell.commands; import java.io.File; import java.io.IOException; +import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -29,11 +31,13 @@ import org.apache.accumulo.core.client.AccumuloSecurityException; import org.apache.accumulo.core.client.TableExistsException; import org.apache.accumulo.core.client.TableNotFoundException; import org.apache.accumulo.core.client.admin.TimeType; +import org.apache.accumulo.core.client.impl.Tables; import org.apache.accumulo.core.conf.Property; import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.security.VisibilityConstraint; import org.apache.accumulo.core.util.shell.Shell; import org.apache.accumulo.core.util.shell.Shell.Command; +import org.apache.accumulo.core.util.shell.Token; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionGroup; @@ -52,27 +56,28 @@ public class CreateTableCommand extends Command { private Option base64Opt; private Option createTableOptFormatter; public static String testTable; - - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, TableExistsException, - TableNotFoundException, IOException, ClassNotFoundException { - + + @Override + public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, + TableExistsException, TableNotFoundException, IOException, ClassNotFoundException { + final String testTableName = cl.getArgs()[0]; - + if (!testTableName.matches(Constants.VALID_TABLE_NAME_REGEX)) { shellState.getReader().println("Only letters, numbers and underscores are allowed for use in table names."); throw new IllegalArgumentException(); } - + final String tableName = cl.getArgs()[0]; if (shellState.getConnector().tableOperations().exists(tableName)) { throw new TableExistsException(null, tableName, null); } final SortedSet<Text> partitions = new TreeSet<Text>(); final boolean decode = cl.hasOption(base64Opt.getOpt()); - + if (cl.hasOption(createTableOptSplit.getOpt())) { final String f = cl.getOptionValue(createTableOptSplit.getOpt()); - + String line; Scanner file = new Scanner(new File(f)); while (file.hasNextLine()) { @@ -88,33 +93,38 @@ public class CreateTableCommand extends Command { } partitions.addAll(shellState.getConnector().tableOperations().listSplits(oldTable)); } - + if (cl.hasOption(createTableOptCopyConfig.getOpt())) { final String oldTable = cl.getOptionValue(createTableOptCopyConfig.getOpt()); if (!shellState.getConnector().tableOperations().exists(oldTable)) { throw new TableNotFoundException(null, oldTable, null); } } - + TimeType timeType = TimeType.MILLIS; if (cl.hasOption(createTableOptTimeLogical.getOpt())) { timeType = TimeType.LOGICAL; } - + // create table shellState.getConnector().tableOperations().create(tableName, true, timeType); if (partitions.size() > 0) { shellState.getConnector().tableOperations().addSplits(tableName, partitions); } - shellState.setTableName(tableName); // switch shell to new table - // context - + + String n = Tables.extractNamespace(tableName); + String table = tableName; + if (n.equals(Constants.DEFAULT_TABLE_NAMESPACE) || n.equals(Constants.SYSTEM_TABLE_NAMESPACE)) { + table = Tables.extractTableName(tableName); + } + shellState.setTableName(table); // switch shell to new table context + if (cl.hasOption(createTableNoDefaultIters.getOpt())) { for (String key : IteratorUtil.generateInitialTableProperties(true).keySet()) { shellState.getConnector().tableOperations().removeProperty(tableName, key); } } - + // Copy options if flag was set if (cl.hasOption(createTableOptCopyConfig.getOpt())) { if (shellState.getConnector().tableOperations().exists(tableName)) { @@ -127,7 +137,7 @@ public class CreateTableCommand extends Command { } } } - + if (cl.hasOption(createTableOptEVC.getOpt())) { try { shellState.getConnector().tableOperations().addConstraint(tableName, VisibilityConstraint.class.getName()); @@ -135,31 +145,31 @@ public class CreateTableCommand extends Command { Shell.log.warn(e.getMessage() + " while setting visibility constraint, but table was created"); } } - + // Load custom formatter if set if (cl.hasOption(createTableOptFormatter.getOpt())) { final String formatterClass = cl.getOptionValue(createTableOptFormatter.getOpt()); - + shellState.getConnector().tableOperations().setProperty(tableName, Property.TABLE_FORMATTER_CLASS.toString(), formatterClass); } - + return 0; } - + @Override public String description() { return "creates a new table, with optional aggregators and optionally pre-split"; } - + @Override public String usage() { return getName() + " <tableName>"; } - + @Override public Options getOptions() { final Options o = new Options(); - + createTableOptCopyConfig = new Option("cc", "copy-config", true, "table to copy configuration from"); createTableOptCopySplits = new Option("cs", "copy-splits", true, "table to copy current splits from"); createTableOptSplit = new Option("sf", "splits-file", true, "file with a newline-separated list of rows to split the table with"); @@ -169,25 +179,25 @@ public class CreateTableCommand extends Command { createTableOptEVC = new Option("evc", "enable-visibility-constraint", false, "prevent users from writing data they cannot read. When enabling this, consider disabling bulk import and alter table."); createTableOptFormatter = new Option("f", "formatter", true, "default formatter to set"); - + createTableOptCopyConfig.setArgName("table"); createTableOptCopySplits.setArgName("table"); createTableOptSplit.setArgName("filename"); createTableOptFormatter.setArgName("className"); - + // Splits and CopySplits are put in an optionsgroup to make them // mutually exclusive final OptionGroup splitOrCopySplit = new OptionGroup(); splitOrCopySplit.addOption(createTableOptSplit); splitOrCopySplit.addOption(createTableOptCopySplits); - + final OptionGroup timeGroup = new OptionGroup(); timeGroup.addOption(createTableOptTimeLogical); timeGroup.addOption(createTableOptTimeMillis); - + base64Opt = new Option("b64", "base64encoded", false, "decode encoded split points"); o.addOption(base64Opt); - + o.addOptionGroup(splitOrCopySplit); o.addOptionGroup(timeGroup); o.addOption(createTableOptSplit); @@ -195,12 +205,17 @@ public class CreateTableCommand extends Command { o.addOption(createTableNoDefaultIters); o.addOption(createTableOptEVC); o.addOption(createTableOptFormatter); - + return o; } - + @Override public int numArgs() { return 1; } + + @Override + public void registerCompletion(final Token root, final Map<Command.CompletionSet,Set<String>> special) { + registerCompletionForTableNamespaces(root, special); + } } http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteTableCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteTableCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteTableCommand.java index 35c534d..74d3f36 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteTableCommand.java +++ b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteTableCommand.java @@ -16,6 +16,8 @@ */ package org.apache.accumulo.core.util.shell.commands; +import org.apache.accumulo.core.Constants; +import org.apache.accumulo.core.client.impl.Tables; import org.apache.accumulo.core.util.shell.Shell; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; @@ -42,7 +44,13 @@ public class DeleteTableCommand extends TableOperation { protected void doTableOp(final Shell shellState, final String tableName) throws Exception { shellState.getConnector().tableOperations().delete(tableName); shellState.getReader().println("Table: [" + tableName + "] has been deleted."); - if (shellState.getTableName().equals(tableName)) { + + String n = Tables.extractNamespace(tableName); + String checkTable = tableName; + if (n.equals(Constants.DEFAULT_TABLE_NAMESPACE) || n.equals(Constants.SYSTEM_TABLE_NAMESPACE)) { + checkTable = Tables.extractTableName(tableName); + } + if (shellState.getTableName().equals(checkTable)) { shellState.setTableName(""); } } http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/core/src/main/java/org/apache/accumulo/core/util/shell/commands/RenameTableCommand.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/RenameTableCommand.java b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/RenameTableCommand.java index 057f2b4..4ba039d 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/shell/commands/RenameTableCommand.java +++ b/core/src/main/java/org/apache/accumulo/core/util/shell/commands/RenameTableCommand.java @@ -19,10 +19,12 @@ package org.apache.accumulo.core.util.shell.commands; import java.util.Map; import java.util.Set; +import org.apache.accumulo.core.Constants; import org.apache.accumulo.core.client.AccumuloException; import org.apache.accumulo.core.client.AccumuloSecurityException; import org.apache.accumulo.core.client.TableExistsException; import org.apache.accumulo.core.client.TableNotFoundException; +import org.apache.accumulo.core.client.impl.Tables; import org.apache.accumulo.core.util.shell.Shell; import org.apache.accumulo.core.util.shell.Shell.Command; import org.apache.accumulo.core.util.shell.Token; @@ -30,11 +32,17 @@ import org.apache.commons.cli.CommandLine; public class RenameTableCommand extends Command { @Override - public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, TableNotFoundException, - TableExistsException { + public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) throws AccumuloException, AccumuloSecurityException, + TableNotFoundException, TableExistsException { shellState.getConnector().tableOperations().rename(cl.getArgs()[0], cl.getArgs()[1]); - if (shellState.getTableName().equals(cl.getArgs()[0])) - shellState.setTableName(cl.getArgs()[1]); + if (shellState.getTableName().equals(cl.getArgs()[0])) { + String tableName = cl.getArgs()[1]; + String n = Tables.extractNamespace(tableName); + if (n.equals(Constants.DEFAULT_TABLE_NAMESPACE) || n.equals(Constants.SYSTEM_TABLE_NAMESPACE)) { + tableName = Tables.extractTableName(tableName); + } + shellState.setTableName(tableName); + } return 0; } http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/server/base/src/main/java/org/apache/accumulo/server/conf/ServerConfiguration.java ---------------------------------------------------------------------- diff --git a/server/base/src/main/java/org/apache/accumulo/server/conf/ServerConfiguration.java b/server/base/src/main/java/org/apache/accumulo/server/conf/ServerConfiguration.java index f1bd8e7..f3421cc 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/conf/ServerConfiguration.java +++ b/server/base/src/main/java/org/apache/accumulo/server/conf/ServerConfiguration.java @@ -61,7 +61,7 @@ public class ServerConfiguration { return getZooConfiguration(instance); } - public static TableNamespaceConfiguration getTableNamespaceConfiguration(Instance instance, String tableId) { + public static TableNamespaceConfiguration getTableNamespaceConfigurationForTable(Instance instance, String tableId) { checkPermissions(); synchronized (tableNamespaceInstances) { TableNamespaceConfiguration conf = tableNamespaceInstances.get(tableId); @@ -74,12 +74,25 @@ public class ServerConfiguration { } } + public static TableNamespaceConfiguration getTableNamespaceConfiguration(Instance instance, String namespaceId) { + checkPermissions(); + synchronized (tableNamespaceInstances) { + TableNamespaceConfiguration conf = tableNamespaceInstances.get(namespaceId); + if (conf == null) { + conf = new TableNamespaceConfiguration(namespaceId, getSystemConfiguration(instance), true); + ConfigSanityCheck.validate(conf); + tableNamespaceInstances.put(namespaceId, conf); + } + return conf; + } + } + public static TableConfiguration getTableConfiguration(Instance instance, String tableId) { checkPermissions(); synchronized (tableInstances) { TableConfiguration conf = tableInstances.get(tableId); if (conf == null && Tables.exists(instance, tableId)) { - conf = new TableConfiguration(instance.getInstanceID(), tableId, getTableNamespaceConfiguration(instance, tableId)); + conf = new TableConfiguration(instance.getInstanceID(), tableId, getTableNamespaceConfigurationForTable(instance, tableId)); ConfigSanityCheck.validate(conf); tableInstances.put(tableId, conf); } @@ -115,6 +128,10 @@ public class ServerConfiguration { return getTableConfiguration(extent.getTableId().toString()); } + public TableNamespaceConfiguration getTableNamespaceConfiguration(String namespaceId) { + return getTableNamespaceConfiguration(instance, namespaceId); + } + public synchronized AccumuloConfiguration getConfiguration() { return getZooConfiguration(instance); } http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/server/base/src/main/java/org/apache/accumulo/server/conf/TableNamespaceConfiguration.java ---------------------------------------------------------------------- diff --git a/server/base/src/main/java/org/apache/accumulo/server/conf/TableNamespaceConfiguration.java b/server/base/src/main/java/org/apache/accumulo/server/conf/TableNamespaceConfiguration.java index c8498a1..0454c29 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/conf/TableNamespaceConfiguration.java +++ b/server/base/src/main/java/org/apache/accumulo/server/conf/TableNamespaceConfiguration.java @@ -37,6 +37,7 @@ public class TableNamespaceConfiguration extends AccumuloConfiguration { private final AccumuloConfiguration parent; private static ZooCache propCache = null; private String tableId = null; + private String namespaceId = null; private Instance inst = null; public TableNamespaceConfiguration(String tableId, AccumuloConfiguration parent) { @@ -46,6 +47,13 @@ public class TableNamespaceConfiguration extends AccumuloConfiguration { this.tableId = tableId; } + public TableNamespaceConfiguration(String namespaceId, AccumuloConfiguration parent, boolean notForSpecificTable) { + inst = HdfsZooInstance.getInstance(); + propCache = new ZooCache(inst.getZooKeepers(), inst.getZooKeepersSessionTimeOut()); + this.parent = parent; + this.namespaceId = namespaceId; + } + @Override public void invalidateCache() { if (propCache != null) @@ -66,7 +74,7 @@ public class TableNamespaceConfiguration extends AccumuloConfiguration { } private String get(String key) { - String zPath = ZooUtil.getRoot(inst.getInstanceID()) + Constants.ZNAMESPACES + "/" + Tables.getNamespace(inst, tableId) + Constants.ZNAMESPACE_CONF + "/" + String zPath = ZooUtil.getRoot(inst.getInstanceID()) + Constants.ZNAMESPACES + "/" + getNamespaceId() + Constants.ZNAMESPACE_CONF + "/" + key; byte[] v = getPropCache().get(zPath); String value = null; @@ -93,7 +101,7 @@ public class TableNamespaceConfiguration extends AccumuloConfiguration { entries.put(parentEntry.getKey(), parentEntry.getValue()); List<String> children = getPropCache().getChildren( - ZooUtil.getRoot(inst.getInstanceID()) + Constants.ZNAMESPACES + "/" + Tables.getNamespace(inst, tableId) + Constants.ZNAMESPACE_CONF); + ZooUtil.getRoot(inst.getInstanceID()) + Constants.ZNAMESPACES + "/" + getNamespaceId() + Constants.ZNAMESPACE_CONF); if (children != null) { for (String child : children) { String value = get(child); @@ -104,4 +112,11 @@ public class TableNamespaceConfiguration extends AccumuloConfiguration { return entries.entrySet().iterator(); } + + private String getNamespaceId() { + if (tableId != null) { + return Tables.getNamespace(inst, tableId); + } + return namespaceId; + } } http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java ---------------------------------------------------------------------- diff --git a/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java b/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java index 47179fc..06568cd 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java +++ b/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Locale; +import java.util.Map; import java.util.Map.Entry; import java.util.UUID; @@ -38,6 +39,7 @@ import org.apache.accumulo.core.data.KeyExtent; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.file.FileOperations; import org.apache.accumulo.core.file.FileSKVWriter; +import org.apache.accumulo.core.iterators.IteratorUtil; import org.apache.accumulo.core.iterators.user.VersioningIterator; import org.apache.accumulo.core.master.state.tables.TableState; import org.apache.accumulo.core.master.thrift.MasterGoalState; @@ -392,6 +394,12 @@ public class Initialize { zoo.putPersistentData(zPath, new byte[0], NodeExistsPolicy.FAIL); zoo.putPersistentData(zPath + Constants.ZNAMESPACE_NAME, namespace.getBytes(Constants.UTF8), NodeExistsPolicy.FAIL); zoo.putPersistentData(zPath + Constants.ZNAMESPACE_CONF, new byte[0], NodeExistsPolicy.FAIL); + + Map<String,String> opts = IteratorUtil.generateInitialTableProperties(true); + for (Entry<String,String> e : opts.entrySet()) { + zoo.putPersistentData(zPath + Constants.ZNAMESPACE_CONF + "/" + e.getKey(), e.getValue().getBytes(Constants.UTF8), + NodeExistsPolicy.SKIP); + } } private static String getInstanceNamePath(Opts opts) throws IOException, KeeperException, InterruptedException { http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/server/master/src/main/java/org/apache/accumulo/master/Master.java ---------------------------------------------------------------------- diff --git a/server/master/src/main/java/org/apache/accumulo/master/Master.java b/server/master/src/main/java/org/apache/accumulo/master/Master.java index 3325778..e4c078f 100644 --- a/server/master/src/main/java/org/apache/accumulo/master/Master.java +++ b/server/master/src/main/java/org/apache/accumulo/master/Master.java @@ -346,6 +346,14 @@ public class Master implements LiveTServerSet.Listener, TableObserver, CurrentSt zoo.putPersistentData(systemTableNamespace + Constants.ZNAMESPACE_NAME, Constants.SYSTEM_TABLE_NAMESPACE.getBytes(Constants.UTF8), NodeExistsPolicy.SKIP); + Map<String,String> opts = IteratorUtil.generateInitialTableProperties(true); + for (Entry<String,String> e : opts.entrySet()) { + zoo.putPersistentData(defaultTableNamespace + Constants.ZNAMESPACE_CONF + "/" + e.getKey(), e.getValue().getBytes(Constants.UTF8), + NodeExistsPolicy.SKIP); + zoo.putPersistentData(systemTableNamespace + Constants.ZNAMESPACE_CONF + "/" + e.getKey(), e.getValue().getBytes(Constants.UTF8), + NodeExistsPolicy.SKIP); + } + for (Entry<String,String> table : Tables.getIdToNameMap(instance).entrySet()) { if (table.getValue().equals(MetadataTable.NAME) || table.getValue().equals(RootTable.NAME)) { zoo.putPersistentData(tables + "/" + table.getKey() + Constants.ZTABLE_NAMESPACE, Constants.SYSTEM_TABLE_NAMESPACE_ID.getBytes(Constants.UTF8), http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/test/src/main/java/org/apache/accumulo/test/randomwalk/concurrent/Setup.java ---------------------------------------------------------------------- diff --git a/test/src/main/java/org/apache/accumulo/test/randomwalk/concurrent/Setup.java b/test/src/main/java/org/apache/accumulo/test/randomwalk/concurrent/Setup.java index 5a9edca..d1b6d17 100644 --- a/test/src/main/java/org/apache/accumulo/test/randomwalk/concurrent/Setup.java +++ b/test/src/main/java/org/apache/accumulo/test/randomwalk/concurrent/Setup.java @@ -35,9 +35,9 @@ public class Setup extends Test { log.debug("numTables = " + numTables); List<String> tables = new ArrayList<String>(); for (int i = 0; i < numTables - 1; i++) { - tables.add(String.format("nspace_%03d.ctt_%03d", i, i)); + tables.add(String.format("ctt_%03d", i, i)); } - tables.add(String.format("ctt_%03d", numTables - 1)); + tables.add(String.format("nspace.ctt_%03d", numTables - 1)); state.set("tables", tables); http://git-wip-us.apache.org/repos/asf/accumulo/blob/fd5f11df/test/src/test/java/org/apache/accumulo/test/ShellServerIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/ShellServerIT.java b/test/src/test/java/org/apache/accumulo/test/ShellServerIT.java index cc46d72..79230a5 100644 --- a/test/src/test/java/org/apache/accumulo/test/ShellServerIT.java +++ b/test/src/test/java/org/apache/accumulo/test/ShellServerIT.java @@ -838,22 +838,40 @@ public class ShellServerIT extends SimpleMacIT { assertTrue(namespaces.contains("thing2")); assertTrue(!namespaces.contains("thing1")); + // can't delete a namespace that still contains tables, unless you do -f exec("createtable thing2.thingy", true); exec("deletenamespace thing2"); exec("y"); exec("namespaces", true, "thing2", true); + /* doesn't work yet, waiting on ACCUMULO-1565 + exec("clonenamespace thing2 testers -e table.file.max", true); + exec("namespaces", true, "testers", true); + exec("tables", true, "testers.thingy", true); + exec("clonenamespace thing2 testers2 -s table.file.max=42", true);*/ + exec("du -tn thing2", true, "thing2.thingy", true); + // all "TableOperation" commands can take a table namespace exec("offline -tn thing2", true); exec("online -tn thing2", true); + exec("flush -tn thing2", true); + exec("compact -tn thing2", true); + exec("createtable testers.1", true); + exec("createtable testers.2", true); + exec("deletetable -tn testers -f", true); + exec("tables", true, "testers.1", false); + exec("namespaces", true, "testers", true); + exec("deletenamespace testers -f", true); + // properties override and such exec("config -tn thing2 -s table.file.max=44444", true); exec("config -tn thing2", true, "44444", true); exec("config -t thing2.thingy", true, "44444", true); exec("config -t thing2.thingy -s table.file.max=55555", true); exec("config -t thing2.thingy", true, "55555", true); + // can copy properties when creating exec("createnamespace thing3 -cc thing2", true); exec("config -tn thing3", true, "44444", true); exec("createnamespace thing4 -ctc thing2.thingy", true);
