(hbase) branch branch-3 updated: HBASE-28260: Add NO_WRITE_LOCAL flag to WAL file creation (#5733)

2024-03-11 Thread bbeaudreault
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)

2024-03-11 Thread bbeaudreault
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)

2024-03-11 Thread zhangduo
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)

2024-03-11 Thread zhangduo
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)

2024-03-11 Thread zhangduo
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,