Index: src/main/java/org/apache/hadoop/hbase/HConstants.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/HConstants.java (revision 1049674) +++ src/main/java/org/apache/hadoop/hbase/HConstants.java (working copy) @@ -361,6 +361,9 @@ /** HBCK special code name used as server name when manipulating ZK nodes */ public static final String HBCK_CODE_NAME = "HBCKServerName"; + public static final String HBASE_MASTER_LOGCLEANER_PLUGINS = + "hbase.master.logcleaner.plugins"; + private HConstants() { // Can't be instantiated with this ctor. } Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1049674) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -73,6 +73,7 @@ import org.apache.hadoop.hbase.master.handler.TableModifyFamilyHandler; import org.apache.hadoop.hbase.master.metrics.MasterMetrics; import org.apache.hadoop.hbase.regionserver.HRegion; +import org.apache.hadoop.hbase.replication.regionserver.Replication; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.InfoServer; import org.apache.hadoop.hbase.util.Pair; @@ -202,6 +203,8 @@ // set the thread name now we have an address setName(MASTER + "-" + this.address); + Replication.decorateMasterConfiguration(this.conf); + this.rpcServer.startThreads(); // Hack! Maps DFSClient => Master for logs. HDFS made this Index: src/main/java/org/apache/hadoop/hbase/master/LogCleaner.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/LogCleaner.java (revision 1049674) +++ src/main/java/org/apache/hadoop/hbase/master/LogCleaner.java (working copy) @@ -34,6 +34,8 @@ import org.apache.hadoop.hbase.Stoppable; import org.apache.hadoop.hbase.regionserver.wal.HLog; +import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; + /** * This Chore, everytime it runs, will clear the wal logs in the old logs folder * that are deletable for each log cleaner in the chain, in order to limit the @@ -79,7 +81,7 @@ * ReplicationLogCleaner and SnapshotLogCleaner. */ private void initLogCleanersChain() { - String[] logCleaners = conf.getStrings("hbase.master.logcleaner.plugins"); + String[] logCleaners = conf.getStrings(HBASE_MASTER_LOGCLEANER_PLUGINS); if (logCleaners != null) { for (String className : logCleaners) { LogCleanerDelegate logCleaner = newLogCleaner(className, conf); Index: src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java (revision 1049674) +++ src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java (working copy) @@ -27,7 +27,6 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; -import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.Server; @@ -36,9 +35,14 @@ import org.apache.hadoop.hbase.regionserver.wal.WALEdit; import org.apache.hadoop.hbase.regionserver.wal.WALObserver; import org.apache.hadoop.hbase.replication.ReplicationZookeeper; +import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner; import org.apache.hadoop.hbase.util.Bytes; import org.apache.zookeeper.KeeperException; +import static org.apache.hadoop.hbase.HConstants.HBASE_MASTER_LOGCLEANER_PLUGINS; +import static org.apache.hadoop.hbase.HConstants.REPLICATION_ENABLE_KEY; +import static org.apache.hadoop.hbase.HConstants.REPLICATION_SCOPE_LOCAL; + /** * Gateway to Replication. Used by {@link org.apache.hadoop.hbase.regionserver.HRegionServer}. */ @@ -82,7 +86,7 @@ * @return True if replication is enabled. */ public static boolean isReplication(final Configuration c) { - return c.getBoolean(HConstants.REPLICATION_ENABLE_KEY, false); + return c.getBoolean(REPLICATION_ENABLE_KEY, false); } /** @@ -134,7 +138,7 @@ for (KeyValue kv : logEdit.getKeyValues()) { family = kv.getFamily(); int scope = info.getTableDesc().getFamily(family).getScope(); - if (scope != HConstants.REPLICATION_SCOPE_LOCAL && + if (scope != REPLICATION_SCOPE_LOCAL && !scopes.containsKey(family)) { scopes.put(family, scope); } @@ -149,6 +153,22 @@ getReplicationManager().logRolled(p); } + /** + * This method modifies the master's configuration in order to inject + * replication-related features + * @param conf + */ + public static void decorateMasterConfiguration(Configuration conf) { + if (!isReplication(conf)) { + return; + } + String plugins = conf.get(HBASE_MASTER_LOGCLEANER_PLUGINS); + if (!plugins.contains(ReplicationLogCleaner.class.toString())) { + conf.set(HBASE_MASTER_LOGCLEANER_PLUGINS, + plugins + "," + ReplicationLogCleaner.class.getCanonicalName()); + } + } + @Override public void logRollRequested() { // Not interested Index: src/main/resources/hbase-default.xml =================================================================== --- src/main/resources/hbase-default.xml (revision 1049674) +++ src/main/resources/hbase-default.xml (working copy) @@ -290,7 +290,7 @@ hbase.master.logcleaner.plugins - org.apache.hadoop.hbase.master.TimeToLiveLogCleaner,org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner + org.apache.hadoop.hbase.master.TimeToLiveLogCleaner A comma-separated list of LogCleanerDelegate invoked by the LogsCleaner service. These WAL/HLog cleaners are called in order, so put the HLog cleaner that prunes the most HLog files in front. To