You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ct...@apache.org on 2013/11/01 03:00:32 UTC

[31/54] git commit: ACCUMULO-802 added the proper namespace locks during table fate operations

ACCUMULO-802 added the proper namespace locks during table fate operations


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

Branch: refs/heads/ACCUMULO-802
Commit: dabf6b41b265d2f25a31556a7944529f3c6d6b51
Parents: 1665c84
Author: Sean Hickey <ta...@gmail.com>
Authored: Tue Aug 6 14:15:39 2013 -0400
Committer: Christopher Tubbs <ct...@apache.org>
Committed: Thu Oct 31 21:30:39 2013 -0400

----------------------------------------------------------------------
 .../client/admin/TableNamespaceOperations.java  |  9 +++++--
 .../admin/TableNamespaceOperationsImpl.java     | 15 ++++++------
 .../mock/MockTableNamespaceOperations.java      | 10 +++-----
 .../accumulo/master/tableOps/CloneTable.java    | 25 +++++++++++++++-----
 .../accumulo/master/tableOps/CreateTable.java   | 13 +++++-----
 .../accumulo/master/tableOps/DeleteTable.java   | 15 ++++++++----
 .../accumulo/master/tableOps/RenameTable.java   | 11 +++++++--
 7 files changed, 63 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/dabf6b41/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperations.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperations.java b/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperations.java
index 314d007..33f9dc0 100644
--- a/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperations.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperations.java
@@ -29,6 +29,7 @@ import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.client.TableNamespaceExistsException;
 import org.apache.accumulo.core.client.TableNamespaceNotEmptyException;
 import org.apache.accumulo.core.client.TableNamespaceNotFoundException;
+import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
 
 /**
@@ -112,8 +113,10 @@ public interface TableNamespaceOperations {
    *           if the table namespace does not exist
    * @throws TableNamespaceNotEmptyException
    *           if the table namespaces still contains tables
+   * @throws TableNotFoundException 
+   *           if table not found while deleting
    */
-  public void delete(String namespace) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException, TableNamespaceNotEmptyException;
+  public void delete(String namespace) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException, TableNamespaceNotEmptyException, TableNotFoundException;
   
   /**
    * Delete a table namespace
@@ -130,9 +133,11 @@ public interface TableNamespaceOperations {
    *           if the table namespace does not exist
    * @throws TableNamespaceNotEmptyException
    *           if the table namespaces still contains tables
+   * @throws TableNotFoundException 
+   *           if table not found while deleting
    */
   public void delete(String namespace, boolean deleteTables) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException,
-      TableNamespaceNotEmptyException;
+      TableNamespaceNotEmptyException, TableNotFoundException;
   
   /**
    * Rename a table namespace

http://git-wip-us.apache.org/repos/asf/accumulo/blob/dabf6b41/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperationsImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperationsImpl.java b/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperationsImpl.java
index 90d59af..d4a1d1c 100644
--- a/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperationsImpl.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/admin/TableNamespaceOperationsImpl.java
@@ -297,9 +297,11 @@ public class TableNamespaceOperationsImpl extends TableNamespaceOperationsHelper
    *           if the table namespace does not exist
    * @throws TableNamespaceNotEmptyException
    *           if the table namespaces still contains tables
+   * @throws TableNotFoundException 
+   *           if table not found while deleting
    */
   @Override
-  public void delete(String namespace) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException, TableNamespaceNotEmptyException {
+  public void delete(String namespace) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException, TableNamespaceNotEmptyException, TableNotFoundException {
     delete(namespace, false);
   }
 
@@ -317,10 +319,13 @@ public class TableNamespaceOperationsImpl extends TableNamespaceOperationsHelper
    * @throws TableNamespaceNotFoundException
    *           if the table namespace does not exist
    * @throws TableNamespaceNotEmptyException
+   *           if the table namespaces still contains tables
+   * @throws TableNotFoundException 
+   *           if table not found while deleting
    */
   @Override
   public void delete(String namespace, boolean deleteTables) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException,
-      TableNamespaceNotEmptyException {
+      TableNamespaceNotEmptyException, TableNotFoundException {
     ArgumentChecker.notNull(namespace);
     String namespaceId = TableNamespaces.getNamespaceId(instance, namespace);
 
@@ -334,11 +339,7 @@ public class TableNamespaceOperationsImpl extends TableNamespaceOperationsHelper
         throw new TableNamespaceNotEmptyException(namespaceId, namespace, null);
       }
       for (String table : TableNamespaces.getTableNames(instance, namespaceId)) {
-        try {
-          getTableOperations().delete(table);
-        } catch (TableNotFoundException e) {
-          throw new RuntimeException("Table (" + table + ") was found in ZooKeeper, but now doesn't exist. (while deleting namespace)");
-        }
+        getTableOperations().delete(table);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/accumulo/blob/dabf6b41/core/src/main/java/org/apache/accumulo/core/client/mock/MockTableNamespaceOperations.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/client/mock/MockTableNamespaceOperations.java b/core/src/main/java/org/apache/accumulo/core/client/mock/MockTableNamespaceOperations.java
index 28f2edc..5b53fbd 100644
--- a/core/src/main/java/org/apache/accumulo/core/client/mock/MockTableNamespaceOperations.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/mock/MockTableNamespaceOperations.java
@@ -88,13 +88,13 @@ public class MockTableNamespaceOperations extends TableNamespaceOperationsHelper
   }
 
   @Override
-  public void delete(String namespace) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException, TableNamespaceNotEmptyException {
+  public void delete(String namespace) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException, TableNamespaceNotEmptyException, TableNotFoundException {
     delete(namespace, false);
   }
 
   @Override
   public void delete(String namespace, boolean deleteTables) throws AccumuloException, AccumuloSecurityException, TableNamespaceNotFoundException,
-      TableNamespaceNotEmptyException {
+      TableNamespaceNotEmptyException, TableNotFoundException {
     if (!exists(namespace))
       throw new TableNamespaceNotFoundException(namespace, namespace, "");
 
@@ -105,11 +105,7 @@ public class MockTableNamespaceOperations extends TableNamespaceOperationsHelper
       }
     } else {
       for (String t : n.getTables(acu)) {
-        try {
-          new MockTableOperations(acu, username).delete(t);
-        } catch (TableNotFoundException e) {
-          System.err.println("Table (" + e.getTableName() + ") not found while deleting namespace (" + namespace + ")");
-        }
+        new MockTableOperations(acu, username).delete(t);
       }
     }
     acu.namespaces.remove(namespace);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/dabf6b41/server/master/src/main/java/org/apache/accumulo/master/tableOps/CloneTable.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CloneTable.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CloneTable.java
index 3841463..31e5e3e 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CloneTable.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CloneTable.java
@@ -44,6 +44,8 @@ class CloneInfo implements Serializable {
   String srcTableId;
   String tableName;
   String tableId;
+  String namespaceId;
+  String srcNamespaceId;
   Map<String,String> propertiesToSet;
   Set<String> propertiesToExclude;
   
@@ -75,6 +77,9 @@ class FinishCloneTable extends MasterRepo {
     
     Utils.unreserveTable(cloneInfo.srcTableId, tid, false);
     Utils.unreserveTable(cloneInfo.tableId, tid, true);
+    Utils.unreserveTableNamespace(cloneInfo.srcNamespaceId, tid, false);
+    if (!cloneInfo.namespaceId.equals(cloneInfo.srcNamespaceId))
+      Utils.unreserveTableNamespace(cloneInfo.namespaceId, tid, false);
     
     environment.getEventCoordinator().event("Cloned table %s from %s", cloneInfo.tableName, cloneInfo.srcTableId);
     
@@ -133,7 +138,11 @@ class CloneZookeeper extends MasterRepo {
   
   @Override
   public long isReady(long tid, Master environment) throws Exception {
-    return Utils.reserveTable(cloneInfo.tableId, tid, true, false, TableOperation.CLONE);
+    cloneInfo.namespaceId = TableNamespaces.getNamespaceId(environment.getInstance(), Tables.extractNamespace(cloneInfo.tableName));
+    long val = Utils.reserveTable(cloneInfo.tableId, tid, true, false, TableOperation.CLONE);
+    if (!cloneInfo.srcNamespaceId.equals(cloneInfo.namespaceId)) 
+      val += Utils.reserveTableNamespace(cloneInfo.namespaceId, tid, false, true, TableOperation.CLONE);
+    return val;
   }
   
   @Override
@@ -148,10 +157,8 @@ class CloneZookeeper extends MasterRepo {
       TableManager.getInstance().cloneTable(cloneInfo.srcTableId, cloneInfo.tableId, cloneInfo.tableName, cloneInfo.propertiesToSet,
           cloneInfo.propertiesToExclude, NodeExistsPolicy.OVERWRITE);
       Tables.clearCache(instance);
-      
-      String namespace = Tables.extractNamespace(cloneInfo.tableName);
-      String namespaceId = TableNamespaces.getNamespaceId(instance, namespace);
-      TableManager.getInstance().addNamespaceToTable(cloneInfo.tableId, namespaceId);
+
+      TableManager.getInstance().addNamespaceToTable(cloneInfo.tableId, cloneInfo.namespaceId);
       
       return new CloneMetadata(cloneInfo);
     } finally {
@@ -164,6 +171,8 @@ class CloneZookeeper extends MasterRepo {
     Instance instance = HdfsZooInstance.getInstance();
     TableManager.getInstance().removeTable(cloneInfo.tableId);
     Utils.unreserveTable(cloneInfo.tableId, tid, true);
+    if (!cloneInfo.namespaceId.equals(cloneInfo.srcNamespaceId)) 
+      Utils.unreserveTableNamespace(cloneInfo.namespaceId, tid, false);
     Tables.clearCache(instance);
   }
   
@@ -225,7 +234,10 @@ public class CloneTable extends MasterRepo {
   
   @Override
   public long isReady(long tid, Master environment) throws Exception {
-    return Utils.reserveTable(cloneInfo.srcTableId, tid, false, true, TableOperation.CLONE);
+    cloneInfo.srcNamespaceId = Tables.getNamespace(environment.getInstance(), cloneInfo.srcTableId);
+    long val = Utils.reserveTable(cloneInfo.srcTableId, tid, false, true, TableOperation.CLONE);
+    val += Utils.reserveTableNamespace(cloneInfo.srcNamespaceId, tid, false, true, TableOperation.CLONE);
+    return val;
   }
   
   @Override
@@ -244,6 +256,7 @@ public class CloneTable extends MasterRepo {
   @Override
   public void undo(long tid, Master environment) throws Exception {
     Utils.unreserveTable(cloneInfo.srcTableId, tid, false);
+    Utils.unreserveTableNamespace(cloneInfo.srcNamespaceId, tid, false);
   }
   
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/dabf6b41/server/master/src/main/java/org/apache/accumulo/master/tableOps/CreateTable.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CreateTable.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CreateTable.java
index d425fe8..a2c0344 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/CreateTable.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/CreateTable.java
@@ -52,6 +52,7 @@ class TableInfo implements Serializable {
   
   String tableName;
   String tableId;
+  String namespaceId;
   char timeType;
   String user;
   
@@ -80,6 +81,7 @@ class FinishCreateTable extends MasterRepo {
     TableManager.getInstance().transitionTableState(tableInfo.tableId, TableState.ONLINE);
     
     Utils.unreserveTable(tableInfo.tableId, tid, true);
+    Utils.unreserveTableNamespace(tableInfo.namespaceId, tid, false);
     
     env.getEventCoordinator().event("Created table %s ", tableInfo.tableName);
     
@@ -213,10 +215,7 @@ class PopulateZookeeper extends MasterRepo {
       
       TableManager.getInstance().addTable(tableInfo.tableId, tableInfo.tableName, NodeExistsPolicy.OVERWRITE);
       
-      String namespace = Tables.extractNamespace(tableInfo.tableName);
-      String namespaceId = TableNamespaces.getNamespaceId(instance, namespace);
-      
-      TableManager.getInstance().addNamespaceToTable(tableInfo.tableId, namespaceId);
+      TableManager.getInstance().addNamespaceToTable(tableInfo.tableId, tableInfo.namespaceId);
       
       for (Entry<String,String> entry : tableInfo.props.entrySet())
         TablePropUtil.setTableProperty(tableInfo.tableId, entry.getKey(), entry.getValue());
@@ -290,7 +289,9 @@ public class CreateTable extends MasterRepo {
   
   @Override
   public long isReady(long tid, Master environment) throws Exception {
-    return 0;
+    // reserve the table's namespace to make sure it doesn't change while the table is created
+    tableInfo.namespaceId = TableNamespaces.getNamespaceId(environment.getInstance(), Tables.extractNamespace(tableInfo.tableName));
+    return Utils.reserveTableNamespace(tableInfo.namespaceId, tid, false, false, TableOperation.CREATE);
   }
   
   @Override
@@ -313,7 +314,7 @@ public class CreateTable extends MasterRepo {
   
   @Override
   public void undo(long tid, Master env) throws Exception {
-    // nothing to do, the table id was allocated!
+    Utils.unreserveTableNamespace(tableInfo.namespaceId, tid, false);
   }
   
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/dabf6b41/server/master/src/main/java/org/apache/accumulo/master/tableOps/DeleteTable.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/DeleteTable.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/DeleteTable.java
index 4271257..439d0c2 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/DeleteTable.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/DeleteTable.java
@@ -59,7 +59,7 @@ class CleanUp extends MasterRepo {
   
   private static final long serialVersionUID = 1L;
   
-  private String tableId;
+  private String tableId, namespaceId;
   
   private long creationTime;
   
@@ -77,8 +77,9 @@ class CleanUp extends MasterRepo {
     
   }
   
-  public CleanUp(String tableId) {
+  public CleanUp(String tableId, String namespaceId) {
     this.tableId = tableId;
+    this.namespaceId = namespaceId;
     creationTime = System.currentTimeMillis();
   }
   
@@ -199,6 +200,7 @@ class CleanUp extends MasterRepo {
     }
     
     Utils.unreserveTable(tableId, tid, true);
+    Utils.unreserveTableNamespace(namespaceId, tid, false);
     
     Logger.getLogger(CleanUp.class).debug("Deleted table " + tableId);
     
@@ -216,7 +218,7 @@ public class DeleteTable extends MasterRepo {
   
   private static final long serialVersionUID = 1L;
   
-  private String tableId;
+  private String tableId, namespaceId;
   
   public DeleteTable(String tableId) {
     this.tableId = tableId;
@@ -224,19 +226,22 @@ public class DeleteTable extends MasterRepo {
   
   @Override
   public long isReady(long tid, Master environment) throws Exception {
-    return Utils.reserveTable(tableId, tid, true, true, TableOperation.DELETE);
+    this.namespaceId = Tables.getNamespace(environment.getInstance(), tableId);
+    return Utils.reserveTable(tableId, tid, true, true, TableOperation.DELETE)
+        + Utils.reserveTableNamespace(namespaceId, tid, false, false, TableOperation.CREATE);
   }
   
   @Override
   public Repo<Master> call(long tid, Master environment) throws Exception {
     TableManager.getInstance().transitionTableState(tableId, TableState.DELETING);
     environment.getEventCoordinator().event("deleting table %s ", tableId);
-    return new CleanUp(tableId);
+    return new CleanUp(tableId, namespaceId);
   }
   
   @Override
   public void undo(long tid, Master environment) throws Exception {
     Utils.unreserveTable(tableId, tid, true);
+    Utils.unreserveTableNamespace(namespaceId, tid, false);
   }
   
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/dabf6b41/server/master/src/main/java/org/apache/accumulo/master/tableOps/RenameTable.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/tableOps/RenameTable.java b/server/master/src/main/java/org/apache/accumulo/master/tableOps/RenameTable.java
index aa0886b..a58b847 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/tableOps/RenameTable.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/tableOps/RenameTable.java
@@ -38,10 +38,13 @@ public class RenameTable extends MasterRepo {
   private String tableId;
   private String oldTableName;
   private String newTableName;
+  private String namespaceId;
 
   @Override
   public long isReady(long tid, Master environment) throws Exception {
-    return Utils.reserveTable(tableId, tid, true, true, TableOperation.RENAME);
+    this.namespaceId = Tables.getNamespace(environment.getInstance(), tableId);
+    return Utils.reserveTable(tableId, tid, true, true, TableOperation.RENAME)
+        + Utils.reserveTableNamespace(namespaceId, tid, false, true, TableOperation.RENAME);
   }
 
   public RenameTable(String tableId, String oldTableName, String newTableName) {
@@ -63,12 +66,14 @@ public class RenameTable extends MasterRepo {
     if (!namespaceId.equals(oldNamespaceId)) {
       TableManager tm = TableManager.getInstance();
       tm.addNamespaceToTable(tableId, namespaceId);
-      // TODO change parent of table's configuration to new namespace...somehow...
     }
 
     newTableName = Tables.extractTableName(newTableName);
     oldTableName = Tables.extractTableName(oldTableName);
 
+    // TODO ACCUMULO-802 renaming a table to a new namespace does not change it's parent configuration to be the new namespace
+    // ...it should...somehow...
+
     IZooReaderWriter zoo = ZooReaderWriter.getRetryingInstance();
 
     Utils.tableNameLock.lock();
@@ -94,6 +99,7 @@ public class RenameTable extends MasterRepo {
     } finally {
       Utils.tableNameLock.unlock();
       Utils.unreserveTable(tableId, tid, true);
+      Utils.unreserveTableNamespace(namespaceId, tid, false);
     }
 
     Logger.getLogger(RenameTable.class).debug("Renamed table " + tableId + " " + oldTableName + " " + newTableName);
@@ -104,6 +110,7 @@ public class RenameTable extends MasterRepo {
   @Override
   public void undo(long tid, Master env) throws Exception {
     Utils.unreserveTable(tableId, tid, true);
+    Utils.unreserveTableNamespace(namespaceId, tid, false);
   }
 
 }