diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java index 28d125d..761477b 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java @@ -127,6 +127,13 @@ public class HTableDescriptor implements Comparable { private static final Bytes MEMSTORE_FLUSHSIZE_KEY = new Bytes(Bytes.toBytes(MEMSTORE_FLUSHSIZE)); + /* + * This metadata attribute represents per table TTL for HFile cleaner + */ + public static final String HFILECLEANER_TTL = "HFILECLEANER_TTL"; + private static final Bytes HFILECLEANER_TTL_KEY = + new Bytes(Bytes.toBytes(HFILECLEANER_TTL)); + public static final String FLUSH_POLICY = "FLUSH_POLICY"; /** @@ -811,6 +818,25 @@ public class HTableDescriptor implements Comparable { return this; } + /* + * @return per table TTL for HFile cleaner + */ + public long getHFileCleanerTTL() { + byte [] value = getValue(HFILECLEANER_TTL_KEY); + if (value != null) { + return Long.parseLong(Bytes.toString(value)); + } + return -1; + } + + /* + * @param ttl per table TTL for HFile cleaner + */ + public HTableDescriptor setHFileCleanerTTL(long ttl) { + setValue(MEMSTORE_FLUSHSIZE_KEY, Long.toString(ttl)); + return this; + } + /** * This sets the class associated with the flush policy which determines determines the stores * need to be flushed when flushing a region. The class used by default is defined in diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java index 4b95fa8..5fcab78 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/DeleteTableProcedure.java @@ -297,7 +297,7 @@ public class DeleteTableProcedure protected static void deleteFromFs(final MasterProcedureEnv env, final TableName tableName, final List regions, - final boolean archive) throws IOException { + boolean archive) throws IOException { final MasterFileSystem mfs = env.getMasterServices().getMasterFileSystem(); final FileSystem fs = mfs.getFileSystem(); final Path tempdir = mfs.getTempDir(); @@ -334,6 +334,10 @@ public class DeleteTableProcedure throw new IOException("Unable to move '" + tableDir + "' to temp '" + tempTableDir + "'"); } } + HTableDescriptor htd = env.getMasterServices().getTableDescriptors().get(tableName); + if (htd.getHFileCleanerTTL() == 0) { + archive = false; + } // Archive regions from FS (temp directory) if (archive) { @@ -346,7 +350,6 @@ public class DeleteTableProcedure } // Archive the mob data if there is a mob-enabled column - HTableDescriptor htd = env.getMasterServices().getTableDescriptors().get(tableName); boolean hasMob = MobUtils.hasMobColumns(htd); Path mobTableDir = null; if (hasMob) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java index a2a0dcc..e30ba2f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java @@ -25,6 +25,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.ScheduledChore; import org.apache.hadoop.hbase.Stoppable; import org.apache.hadoop.hbase.classification.InterfaceAudience; @@ -109,7 +110,7 @@ public class StorefileRefresherChore extends ScheduledChore { + ", exception:" + StringUtils.stringifyException(ex)); // Store files have a TTL in the archive directory. If we fail to refresh for that long, we stop serving reads - if (isRegionStale(encodedName, time)) { + if (isRegionStale(r.getTableDesc(), encodedName, time)) { ((HRegion)r).setReadsEnabled(false); // stop serving reads } continue; @@ -128,8 +129,12 @@ public class StorefileRefresherChore extends ScheduledChore { } } - protected boolean isRegionStale(String encodedName, long time) { + protected boolean isRegionStale(HTableDescriptor desc, String encodedName, long time) { long lastRefreshTime = lastRefreshTimes.get(encodedName); - return time - lastRefreshTime > hfileTtl - period; + long perTableTtl = desc.getHFileCleanerTTL(); + if (perTableTtl < 0) { + return time - lastRefreshTime > hfileTtl - period; + } + return time - lastRefreshTime > perTableTtl - period; } }