(hbase) branch branch-3 updated: HBASE-28260: Add NO_WRITE_LOCAL flag to WAL file creation (#5733)
This is an automated email from the ASF dual-hosted git repository. bbeaudreault pushed a commit to branch branch-3 in repository https://gitbox.apache.org/repos/asf/hbase.git The following commit(s) were added to refs/heads/branch-3 by this push: new 7f5e054c6f7 HBASE-28260: Add NO_WRITE_LOCAL flag to WAL file creation (#5733) 7f5e054c6f7 is described below commit 7f5e054c6f72d612a8e2727fec0320fabe38c4b8 Author: Charles Connell AuthorDate: Mon Mar 11 09:11:01 2024 -0400 HBASE-28260: Add NO_WRITE_LOCAL flag to WAL file creation (#5733) Signed-off-by: Bryan Beaudreault Signed-off-by: Duo Zhang Signed-off-by: Wei-Chiu Chuang --- .../hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java| 5 +++-- .../io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java | 16 ++-- .../io/asyncfs/TestFanOutOneBlockAsyncDFSOutput.java| 17 + .../asyncfs/TestFanOutOneBlockAsyncDFSOutputHang.java | 2 +- .../hadoop/hbase/io/asyncfs/TestLocalAsyncOutput.java | 2 +- .../asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.java | 2 +- .../hadoop/hbase/regionserver/wal/AbstractFSWAL.java| 4 .../regionserver/wal/AbstractProtobufLogWriter.java | 8 ++-- .../hbase/regionserver/wal/AsyncProtobufLogWriter.java | 4 ++-- .../hbase/regionserver/wal/ProtobufLogWriter.java | 11 --- 10 files changed, 45 insertions(+), 26 deletions(-) diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java index a530ca4a2a0..cbb0648f3af 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java @@ -48,11 +48,12 @@ public final class AsyncFSOutputHelper { */ public static AsyncFSOutput createOutput(FileSystem fs, Path f, boolean overwrite, boolean createParent, short replication, long blockSize, EventLoopGroup eventLoopGroup, -Class channelClass, StreamSlowMonitor monitor) +Class channelClass, StreamSlowMonitor monitor, boolean noLocalWrite) throws IOException, CommonFSUtils.StreamLacksCapabilityException { if (fs instanceof DistributedFileSystem) { return FanOutOneBlockAsyncDFSOutputHelper.createOutput((DistributedFileSystem) fs, f, -overwrite, createParent, replication, blockSize, eventLoopGroup, channelClass, monitor); +overwrite, createParent, replication, blockSize, eventLoopGroup, channelClass, monitor, +noLocalWrite); } final FSDataOutputStream out; int bufferSize = fs.getConf().getInt(CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_KEY, diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java index 98590173ed2..d4a71a77a79 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java @@ -445,20 +445,24 @@ public final class FanOutOneBlockAsyncDFSOutputHelper { } } - private static EnumSetWritable getCreateFlags(boolean overwrite) { + private static EnumSetWritable getCreateFlags(boolean overwrite, +boolean noLocalWrite) { List flags = new ArrayList<>(); flags.add(CreateFlag.CREATE); if (overwrite) { flags.add(CreateFlag.OVERWRITE); } +if (noLocalWrite) { + flags.add(CreateFlag.NO_LOCAL_WRITE); +} flags.add(CreateFlag.SHOULD_REPLICATE); return new EnumSetWritable<>(EnumSet.copyOf(flags)); } private static FanOutOneBlockAsyncDFSOutput createOutput(DistributedFileSystem dfs, String src, boolean overwrite, boolean createParent, short replication, long blockSize, -EventLoopGroup eventLoopGroup, Class channelClass, StreamSlowMonitor monitor) -throws IOException { +EventLoopGroup eventLoopGroup, Class channelClass, StreamSlowMonitor monitor, +boolean noLocalWrite) throws IOException { Configuration conf = dfs.getConf(); DFSClient client = dfs.getClient(); String clientName = client.getClientName(); @@ -475,7 +479,7 @@ public final class FanOutOneBlockAsyncDFSOutputHelper { try { stat = FILE_CREATOR.create(namenode, src, FsPermission.getFileDefault().applyUMask(FsPermission.getUMask(conf)), clientName, - getCreateFlags(overwrite), createParent, replication, blockSize, + getCreateFlags(overwrite, noLocalWrite), createParent, replication, blockSize, CryptoProtocolVersion.supported()); } catch (Exception e) { if (e instanceof RemoteException) { @@ -561,14 +565,14 @@ public final class
(hbase) branch master updated: HBASE-28260: Add NO_WRITE_LOCAL flag to WAL file creation (#5733)
This is an automated email from the ASF dual-hosted git repository. bbeaudreault pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hbase.git The following commit(s) were added to refs/heads/master by this push: new 34b738d2ac0 HBASE-28260: Add NO_WRITE_LOCAL flag to WAL file creation (#5733) 34b738d2ac0 is described below commit 34b738d2ac04f7a9acead98b90ee1e2f220afff5 Author: Charles Connell AuthorDate: Mon Mar 11 09:11:01 2024 -0400 HBASE-28260: Add NO_WRITE_LOCAL flag to WAL file creation (#5733) Signed-off-by: Bryan Beaudreault Signed-off-by: Duo Zhang Signed-off-by: Wei-Chiu Chuang --- .../hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java| 5 +++-- .../io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java | 16 ++-- .../io/asyncfs/TestFanOutOneBlockAsyncDFSOutput.java| 17 + .../asyncfs/TestFanOutOneBlockAsyncDFSOutputHang.java | 2 +- .../hadoop/hbase/io/asyncfs/TestLocalAsyncOutput.java | 2 +- .../asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.java | 2 +- .../hadoop/hbase/regionserver/wal/AbstractFSWAL.java| 4 .../regionserver/wal/AbstractProtobufLogWriter.java | 8 ++-- .../hbase/regionserver/wal/AsyncProtobufLogWriter.java | 4 ++-- .../hbase/regionserver/wal/ProtobufLogWriter.java | 11 --- 10 files changed, 45 insertions(+), 26 deletions(-) diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java index a530ca4a2a0..cbb0648f3af 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/AsyncFSOutputHelper.java @@ -48,11 +48,12 @@ public final class AsyncFSOutputHelper { */ public static AsyncFSOutput createOutput(FileSystem fs, Path f, boolean overwrite, boolean createParent, short replication, long blockSize, EventLoopGroup eventLoopGroup, -Class channelClass, StreamSlowMonitor monitor) +Class channelClass, StreamSlowMonitor monitor, boolean noLocalWrite) throws IOException, CommonFSUtils.StreamLacksCapabilityException { if (fs instanceof DistributedFileSystem) { return FanOutOneBlockAsyncDFSOutputHelper.createOutput((DistributedFileSystem) fs, f, -overwrite, createParent, replication, blockSize, eventLoopGroup, channelClass, monitor); +overwrite, createParent, replication, blockSize, eventLoopGroup, channelClass, monitor, +noLocalWrite); } final FSDataOutputStream out; int bufferSize = fs.getConf().getInt(CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_KEY, diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java index 98590173ed2..d4a71a77a79 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java @@ -445,20 +445,24 @@ public final class FanOutOneBlockAsyncDFSOutputHelper { } } - private static EnumSetWritable getCreateFlags(boolean overwrite) { + private static EnumSetWritable getCreateFlags(boolean overwrite, +boolean noLocalWrite) { List flags = new ArrayList<>(); flags.add(CreateFlag.CREATE); if (overwrite) { flags.add(CreateFlag.OVERWRITE); } +if (noLocalWrite) { + flags.add(CreateFlag.NO_LOCAL_WRITE); +} flags.add(CreateFlag.SHOULD_REPLICATE); return new EnumSetWritable<>(EnumSet.copyOf(flags)); } private static FanOutOneBlockAsyncDFSOutput createOutput(DistributedFileSystem dfs, String src, boolean overwrite, boolean createParent, short replication, long blockSize, -EventLoopGroup eventLoopGroup, Class channelClass, StreamSlowMonitor monitor) -throws IOException { +EventLoopGroup eventLoopGroup, Class channelClass, StreamSlowMonitor monitor, +boolean noLocalWrite) throws IOException { Configuration conf = dfs.getConf(); DFSClient client = dfs.getClient(); String clientName = client.getClientName(); @@ -475,7 +479,7 @@ public final class FanOutOneBlockAsyncDFSOutputHelper { try { stat = FILE_CREATOR.create(namenode, src, FsPermission.getFileDefault().applyUMask(FsPermission.getUMask(conf)), clientName, - getCreateFlags(overwrite), createParent, replication, blockSize, + getCreateFlags(overwrite, noLocalWrite), createParent, replication, blockSize, CryptoProtocolVersion.supported()); } catch (Exception e) { if (e instanceof RemoteException) { @@ -561,14 +565,14 @@ public final class
(hbase) branch branch-2.6 updated: HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761)
This is an automated email from the ASF dual-hosted git repository. zhangduo pushed a commit to branch branch-2.6 in repository https://gitbox.apache.org/repos/asf/hbase.git The following commit(s) were added to refs/heads/branch-2.6 by this push: new b61281b9bff HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761) b61281b9bff is described below commit b61281b9bffbf190b8fab925a7c2939dd6fc3847 Author: Duo Zhang AuthorDate: Mon Mar 11 18:04:35 2024 +0800 HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761) Signed-off-by: Bryan Beaudreault (cherry picked from commit 3b00db0e2c026e9bfaa42f652fe5d78364710910) --- .../hbase/regionserver/AbstractMemStore.java | 9 ++ .../apache/hadoop/hbase/regionserver/HStore.java | 1 + .../apache/hadoop/hbase/regionserver/MemStore.java | 14 ++- .../apache/hadoop/hbase/HBaseTestingUtility.java | 4 + .../coprocessor/TestCoreRegionCoprocessor.java | 4 + .../regionserver/TestCacheOnWriteInSchema.java | 17 +--- .../hadoop/hbase/regionserver/TestHRegion.java | 102 ++--- .../regionserver/TestHRegionWithInMemoryFlush.java | 49 -- .../regionserver/TestMemStoreSegmentsIterator.java | 42 +++-- .../hadoop/hbase/wal/WALPerformanceEvaluation.java | 4 + 10 files changed, 120 insertions(+), 126 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java index 62ff6f9a92f..9a88cab450a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java @@ -376,6 +376,15 @@ public abstract class AbstractMemStore implements MemStore { return snapshot; } + @Override + public void close() { +// active should never be null +active.close(); +// for snapshot, either it is empty, where we do not reference any real segment which contains a +// memstore lab, or it is during snapshot, where we will clear it when calling clearSnapshot, so +// we do not need to close it here + } + /** Returns an ordered list of segments from most recent to oldest in memstore */ protected abstract List getSegments() throws IOException; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index 5f947993035..39117f45457 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -726,6 +726,7 @@ public class HStore } private ImmutableCollection closeWithoutLock() throws IOException { +memstore.close(); // Clear so metrics doesn't find them. ImmutableCollection result = storeEngine.getStoreFileManager().clearFiles(); Collection compactedfiles = storeEngine.getStoreFileManager().clearCompactedFiles(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java index 947944baf91..cd8eecd5430 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.regionserver; +import java.io.Closeable; import java.io.IOException; import java.util.List; import org.apache.hadoop.hbase.Cell; @@ -31,7 +32,7 @@ import org.apache.yetus.audience.InterfaceAudience; * */ @InterfaceAudience.Private -public interface MemStore { +public interface MemStore extends Closeable { /** * Creates a snapshot of the current memstore. Snapshot must be cleared by call to @@ -131,4 +132,15 @@ public interface MemStore { default void stopReplayingFromWAL() { return; } + + /** + * Close the memstore. + * + * Usually this should only be called when there is nothing in the memstore, unless we are going + * to abort ourselves. + * + * For normal cases, this method is only used to fix the reference counting, see HBASE-27941. + */ + @Override + void close(); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java index a56433576d9..01a9c4f06fb 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java @@ -2043,6 +2043,8 @@ public class HBaseTestingUtility extends HBaseZKTestingUtility { */ public HRegion createLocalHRegion(RegionInfo info, Configuration conf,
(hbase) branch branch-2.5 updated: HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761)
This is an automated email from the ASF dual-hosted git repository. zhangduo pushed a commit to branch branch-2.5 in repository https://gitbox.apache.org/repos/asf/hbase.git The following commit(s) were added to refs/heads/branch-2.5 by this push: new d8953b454d6 HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761) d8953b454d6 is described below commit d8953b454d654a1d5e1413d9aeec6543c16f22aa Author: Duo Zhang AuthorDate: Mon Mar 11 18:04:35 2024 +0800 HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761) Signed-off-by: Bryan Beaudreault (cherry picked from commit 3b00db0e2c026e9bfaa42f652fe5d78364710910) --- .../hbase/regionserver/AbstractMemStore.java | 9 ++ .../apache/hadoop/hbase/regionserver/HStore.java | 1 + .../apache/hadoop/hbase/regionserver/MemStore.java | 14 ++- .../apache/hadoop/hbase/HBaseTestingUtility.java | 4 + .../coprocessor/TestCoreRegionCoprocessor.java | 4 + .../regionserver/TestCacheOnWriteInSchema.java | 17 +--- .../hadoop/hbase/regionserver/TestHRegion.java | 102 ++--- .../regionserver/TestHRegionWithInMemoryFlush.java | 49 -- .../regionserver/TestMemStoreSegmentsIterator.java | 42 +++-- .../hadoop/hbase/wal/WALPerformanceEvaluation.java | 4 + 10 files changed, 120 insertions(+), 126 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java index 5d62f786ed0..e94ad631f27 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java @@ -375,6 +375,15 @@ public abstract class AbstractMemStore implements MemStore { return snapshot; } + @Override + public void close() { +// active should never be null +active.close(); +// for snapshot, either it is empty, where we do not reference any real segment which contains a +// memstore lab, or it is during snapshot, where we will clear it when calling clearSnapshot, so +// we do not need to close it here + } + /** Returns an ordered list of segments from most recent to oldest in memstore */ protected abstract List getSegments() throws IOException; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index 63e0ac50b92..888b684e9f5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -720,6 +720,7 @@ public class HStore } private ImmutableCollection closeWithoutLock() throws IOException { +memstore.close(); // Clear so metrics doesn't find them. ImmutableCollection result = storeEngine.getStoreFileManager().clearFiles(); Collection compactedfiles = storeEngine.getStoreFileManager().clearCompactedFiles(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java index 947944baf91..cd8eecd5430 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.regionserver; +import java.io.Closeable; import java.io.IOException; import java.util.List; import org.apache.hadoop.hbase.Cell; @@ -31,7 +32,7 @@ import org.apache.yetus.audience.InterfaceAudience; * */ @InterfaceAudience.Private -public interface MemStore { +public interface MemStore extends Closeable { /** * Creates a snapshot of the current memstore. Snapshot must be cleared by call to @@ -131,4 +132,15 @@ public interface MemStore { default void stopReplayingFromWAL() { return; } + + /** + * Close the memstore. + * + * Usually this should only be called when there is nothing in the memstore, unless we are going + * to abort ourselves. + * + * For normal cases, this method is only used to fix the reference counting, see HBASE-27941. + */ + @Override + void close(); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java index a56433576d9..01a9c4f06fb 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java @@ -2043,6 +2043,8 @@ public class HBaseTestingUtility extends HBaseZKTestingUtility { */ public HRegion createLocalHRegion(RegionInfo info, Configuration conf,
(hbase) branch branch-2 updated: HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761)
This is an automated email from the ASF dual-hosted git repository. zhangduo pushed a commit to branch branch-2 in repository https://gitbox.apache.org/repos/asf/hbase.git The following commit(s) were added to refs/heads/branch-2 by this push: new af94d17d771 HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761) af94d17d771 is described below commit af94d17d7711a5ea999eafd9a2c5af369c746afd Author: Duo Zhang AuthorDate: Mon Mar 11 18:04:35 2024 +0800 HBASE-28401 Introduce a close method for memstore for release active segment (#5705) (#5761) Signed-off-by: Bryan Beaudreault (cherry picked from commit 3b00db0e2c026e9bfaa42f652fe5d78364710910) --- .../hbase/regionserver/AbstractMemStore.java | 9 ++ .../apache/hadoop/hbase/regionserver/HStore.java | 1 + .../apache/hadoop/hbase/regionserver/MemStore.java | 14 ++- .../apache/hadoop/hbase/HBaseTestingUtility.java | 4 + .../coprocessor/TestCoreRegionCoprocessor.java | 4 + .../regionserver/TestCacheOnWriteInSchema.java | 17 +--- .../hadoop/hbase/regionserver/TestHRegion.java | 102 ++--- .../regionserver/TestHRegionWithInMemoryFlush.java | 49 -- .../regionserver/TestMemStoreSegmentsIterator.java | 42 +++-- .../hadoop/hbase/wal/WALPerformanceEvaluation.java | 4 + 10 files changed, 120 insertions(+), 126 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java index 62ff6f9a92f..9a88cab450a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java @@ -376,6 +376,15 @@ public abstract class AbstractMemStore implements MemStore { return snapshot; } + @Override + public void close() { +// active should never be null +active.close(); +// for snapshot, either it is empty, where we do not reference any real segment which contains a +// memstore lab, or it is during snapshot, where we will clear it when calling clearSnapshot, so +// we do not need to close it here + } + /** Returns an ordered list of segments from most recent to oldest in memstore */ protected abstract List getSegments() throws IOException; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index 5f947993035..39117f45457 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -726,6 +726,7 @@ public class HStore } private ImmutableCollection closeWithoutLock() throws IOException { +memstore.close(); // Clear so metrics doesn't find them. ImmutableCollection result = storeEngine.getStoreFileManager().clearFiles(); Collection compactedfiles = storeEngine.getStoreFileManager().clearCompactedFiles(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java index 947944baf91..cd8eecd5430 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.regionserver; +import java.io.Closeable; import java.io.IOException; import java.util.List; import org.apache.hadoop.hbase.Cell; @@ -31,7 +32,7 @@ import org.apache.yetus.audience.InterfaceAudience; * */ @InterfaceAudience.Private -public interface MemStore { +public interface MemStore extends Closeable { /** * Creates a snapshot of the current memstore. Snapshot must be cleared by call to @@ -131,4 +132,15 @@ public interface MemStore { default void stopReplayingFromWAL() { return; } + + /** + * Close the memstore. + * + * Usually this should only be called when there is nothing in the memstore, unless we are going + * to abort ourselves. + * + * For normal cases, this method is only used to fix the reference counting, see HBASE-27941. + */ + @Override + void close(); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java index a56433576d9..01a9c4f06fb 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java @@ -2043,6 +2043,8 @@ public class HBaseTestingUtility extends HBaseZKTestingUtility { */ public HRegion createLocalHRegion(RegionInfo info, Configuration conf,