diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 315659a..7a79085 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -1853,6 +1853,17 @@ public class HRegionServer extends HasThread implements } @Override + public void releaseWAL(HRegionInfo regionInfo, WAL wal) throws IOException { + if (regionInfo != null && regionInfo.isMetaTable() && + regionInfo.getReplicaId() == HRegionInfo.DEFAULT_REPLICA_ID) { + + walFactory.closeMetaWAL(regionInfo.getEncodedNameAsBytes()); + + // TODO: meta WAL Roller ? + } + } + + @Override public ClusterConnection getConnection() { return this.clusterConnection; } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java index cd4816c..29e6a95 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java @@ -55,6 +55,12 @@ public interface RegionServerServices extends OnlineRegions, FavoredNodesForRegi WAL getWAL(HRegionInfo regionInfo) throws IOException; /** + * Releases the dependency of this region to the WAL previously obtained from + * {@link #getWAL(HRegionInfo)}. + */ + void releaseWAL(HRegionInfo regionInfo, WAL wal) throws IOException; + + /** * @return Implementation of {@link CompactionRequestor} or null. */ CompactionRequestor getCompactionRequester(); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java index 70e5283..237eb5a 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseMetaHandler.java @@ -19,6 +19,9 @@ package org.apache.hadoop.hbase.regionserver.handler; import org.apache.hadoop.hbase.classification.InterfaceAudience; + +import java.io.IOException; + import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.Server; import org.apache.hadoop.hbase.executor.EventType; @@ -37,4 +40,9 @@ public class CloseMetaHandler extends CloseRegionHandler { final boolean abort) { super(server, rsServices, regionInfo, abort, EventType.M_RS_CLOSE_META, null); } + + @Override + protected void releaseWALIfNeeded() throws IOException { + rsServices.releaseWAL(regionInfo, region.getWAL()); + } } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java index 26e824d..639e8fd 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java @@ -44,8 +44,9 @@ public class CloseRegionHandler extends EventHandler { // have a running queue of user regions to close? private static final Log LOG = LogFactory.getLog(CloseRegionHandler.class); - private final RegionServerServices rsServices; - private final HRegionInfo regionInfo; + protected final RegionServerServices rsServices; + protected final HRegionInfo regionInfo; + protected HRegion region; // If true, the hosting server is aborting. Region close process is different // when we are aborting. @@ -90,7 +91,7 @@ public class CloseRegionHandler extends EventHandler { LOG.debug("Processing close of " + name); String encodedRegionName = regionInfo.getEncodedName(); // Check that this region is being served here - HRegion region = (HRegion)rsServices.getFromOnlineRegions(encodedRegionName); + region = (HRegion)rsServices.getFromOnlineRegions(encodedRegionName); if (region == null) { LOG.warn("Received CLOSE for region " + name + " but currently not serving - ignoring"); // TODO: do better than a simple warning @@ -106,6 +107,10 @@ public class CloseRegionHandler extends EventHandler { regionInfo.getRegionNameAsString()); return; } + + if (!abort) { + releaseWALIfNeeded(); + } } catch (IOException ioe) { // An IOException here indicates that we couldn't successfully flush the // memstore before closing. So, we need to abort the server and allow @@ -116,6 +121,7 @@ public class CloseRegionHandler extends EventHandler { } this.rsServices.removeFromOnlineRegions(region, destination); + rsServices.reportRegionStateTransition(TransitionCode.CLOSED, regionInfo); // Done! Region is closed on this RS @@ -125,4 +131,8 @@ public class CloseRegionHandler extends EventHandler { remove(this.regionInfo.getEncodedNameAsBytes(), Boolean.FALSE); } } + + protected void releaseWALIfNeeded() throws IOException { + // release the WAL if needed. Only meta does this for now. + } } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java index c19f8c9..50ec995 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java @@ -249,6 +249,23 @@ public class WALFactory { return metaProvider.getWAL(identifier); } + /** + * Closes the meta WAL and meta WALProvider + * @param identifier + * @throws IOException + */ + public void closeMetaWAL(final byte[] identifier) throws IOException { + // NOTE: this assumes single META region. The close of WAL does not do ref-counting for the + // number of regions depending on the meta WAL + WALProvider metaProvider = this.metaProvider.get(); + if (metaProvider != null) { + if (this.metaProvider.compareAndSet(metaProvider, null)) { + // close the metaProvider + metaProvider.close(); + } + } + } + public Reader createReader(final FileSystem fs, final Path path) throws IOException { return createReader(fs, path, (CancelableProgressable)null); } @@ -371,7 +388,7 @@ public class WALFactory { // For now, first Configuration object wins. Practically this just impacts the reader/writer class private static final AtomicReference singleton = new AtomicReference(); private static final String SINGLETON_ID = WALFactory.class.getName(); - + // public only for FSHLog public static WALFactory getInstance(Configuration configuration) { WALFactory factory = singleton.get();