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";