This is an automated email from the ASF dual-hosted git repository.

shahrs87 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 7af61794a8e HBASE-28184 Tailing the WAL is very slow if there are 
multiple peers (#5503)
7af61794a8e is described below

commit 7af61794a8eee25d9e48a2561dd0a6a321f48c0c
Author: Rushabh Shah <[email protected]>
AuthorDate: Tue Nov 7 09:58:58 2023 -0800

    HBASE-28184 Tailing the WAL is very slow if there are multiple peers (#5503)
---
 .../replication/regionserver/WALEntryStream.java   | 32 ++++++++++++++--------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.java
index d1f85774a63..186d5b7c4d1 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.java
@@ -460,17 +460,27 @@ class WALEntryStream implements Closeable {
    * Returns whether the file is opened for writing.
    */
   private Pair<WALTailingReader.State, Boolean> 
readNextEntryAndRecordReaderPosition() {
-    // we must call this before actually reading from the reader, as this 
method will acquire the
-    // rollWriteLock. This is very important, as we will enqueue the new WAL 
file in postLogRoll,
-    // and before this happens, we could have already finished closing the 
previous WAL file. If we
-    // do not acquire the rollWriteLock and return whether the current file is 
being written to, we
-    // may finish reading the previous WAL file and start to read the next 
one, before it is
-    // enqueued into the logQueue, thus lead to an empty logQueue and make the 
shipper think the
-    // queue is already ended and quit. See HBASE-28114 and related issues for 
more details.
-    // in the future, if we want to optimize the logic here, for example, do 
not call this method
-    // every time, or do not acquire rollWriteLock in the implementation of 
this method, we need to
-    // carefully review the optimized implementation
-    OptionalLong fileLength = 
walFileLengthProvider.getLogFileSizeIfBeingWritten(currentPath);
+    OptionalLong fileLength;
+    if (logQueue.getQueueSize(walGroupId) > 1) {
+      // if there are more than one files in queue, although it is possible 
that we are
+      // still trying to write the trailer of the file and it is not closed 
yet, we can
+      // make sure that we will not write any WAL entries to it any more, so 
it is safe
+      // to just let the upper layer try to read the whole file without limit
+      fileLength = OptionalLong.empty();
+    } else {
+      // if there is only one file in queue, check whether it is still being 
written to
+      // we must call this before actually reading from the reader, as this 
method will acquire the
+      // rollWriteLock. This is very important, as we will enqueue the new WAL 
file in postLogRoll,
+      // and before this happens, we could have already finished closing the 
previous WAL file. If
+      // we do not acquire the rollWriteLock and return whether the current 
file is being written
+      // to, we may finish reading the previous WAL file and start to read the 
next one, before it
+      // is enqueued into the logQueue, thus lead to an empty logQueue and 
make the shipper think
+      // the queue is already ended and quit. See HBASE-28114 and related 
issues for more details.
+      // in the future, if we want to optimize the logic here, for example, do 
not call this method
+      // every time, or do not acquire rollWriteLock in the implementation of 
this method, we need
+      // to carefully review the optimized implementation
+      fileLength = 
walFileLengthProvider.getLogFileSizeIfBeingWritten(currentPath);
+    }
     WALTailingReader.Result readResult = reader.next(fileLength.orElse(-1));
     long readerPos = readResult.getEntryEndPos();
     Entry readEntry = readResult.getEntry();

Reply via email to