You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2013/05/17 17:54:32 UTC

svn commit: r1483883 - in /hbase/trunk: hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java

Author: mbertozzi
Date: Fri May 17 15:54:31 2013
New Revision: 1483883

URL: http://svn.apache.org/r1483883
Log:
HBASE-7726 Family Dir is not removed using modifyTable()

Modified:
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java?rev=1483883&r1=1483882&r2=1483883&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java Fri May 17 15:54:31 2013
@@ -1813,6 +1813,11 @@ public class HBaseAdmin implements Abort
    */
   public void modifyTable(final byte [] tableName, final HTableDescriptor htd)
   throws IOException {
+    if (!Bytes.equals(tableName, htd.getName())) {
+      throw new IllegalArgumentException("the specified table name '" + Bytes.toString(tableName) +
+        "' doesn't match with the HTD one: " + htd.getNameAsString());
+    }
+
     execute(new MasterAdminCallable<Void>() {
       @Override
       public Void call() throws ServiceException {

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java?rev=1483883&r1=1483882&r2=1483883&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java Fri May 17 15:54:31 2013
@@ -20,7 +20,10 @@ package org.apache.hadoop.hbase.master.h
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
@@ -28,10 +31,14 @@ import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.executor.EventType;
 import org.apache.hadoop.hbase.master.HMaster;
 import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
+import org.apache.hadoop.hbase.master.MasterFileSystem;
 import org.apache.hadoop.hbase.master.MasterServices;
+import org.apache.hadoop.hbase.util.Bytes;
 
 @InterfaceAudience.Private
 public class ModifyTableHandler extends TableEventHandler {
+  private static final Log LOG = LogFactory.getLog(ModifyTableHandler.class);
+
   private final HTableDescriptor htd;
 
   public ModifyTableHandler(final byte [] tableName,
@@ -52,18 +59,41 @@ public class ModifyTableHandler extends 
   @Override
   protected void handleTableOperation(List<HRegionInfo> hris)
   throws IOException {
-    MasterCoprocessorHost cpHost = ((HMaster) this.server)
-        .getCoprocessorHost();
+    MasterCoprocessorHost cpHost = ((HMaster) this.server).getCoprocessorHost();
     if (cpHost != null) {
       cpHost.preModifyTableHandler(this.tableName, this.htd);
     }
     // Update descriptor
+    HTableDescriptor oldHtd = getTableDescriptor();
     this.masterServices.getTableDescriptors().add(this.htd);
+    deleteFamilyFromFS(hris, oldHtd.getFamiliesKeys());
     if (cpHost != null) {
       cpHost.postModifyTableHandler(this.tableName, this.htd);
     }
   }
 
+  /**
+   * Removes from hdfs the families that are not longer present in the new table descriptor.
+   */
+  private void deleteFamilyFromFS(final List<HRegionInfo> hris, final Set<byte[]> oldFamilies) {
+    try {
+      Set<byte[]> newFamilies = this.htd.getFamiliesKeys();
+      MasterFileSystem mfs = this.masterServices.getMasterFileSystem();
+      for (byte[] familyName: oldFamilies) {
+        if (!newFamilies.contains(familyName)) {
+          LOG.debug("Removing family=" + Bytes.toString(familyName) +
+                    " from table=" + this.tableName);
+          for (HRegionInfo hri: hris) {
+            // Delete the family directory in FS for all the regions one by one
+            mfs.deleteFamilyFromFS(hri, familyName);
+          }
+        }
+      }
+    } catch (IOException e) {
+      LOG.warn("Unable to remove on-disk directories for the removed families", e);
+    }
+  }
+
   @Override
   public String toString() {
     String name = "UnknownServerName";