@@ -460,17 +460,27 @@ private void dequeueCurrentLog() {
460
460
* Returns whether the file is opened for writing.
461
461
*/
462
462
private Pair <WALTailingReader .State , Boolean > readNextEntryAndRecordReaderPosition () {
463
- // we must call this before actually reading from the reader, as this method will acquire the
464
- // rollWriteLock. This is very important, as we will enqueue the new WAL file in postLogRoll,
465
- // and before this happens, we could have already finished closing the previous WAL file. If we
466
- // do not acquire the rollWriteLock and return whether the current file is being written to, we
467
- // may finish reading the previous WAL file and start to read the next one, before it is
468
- // enqueued into the logQueue, thus lead to an empty logQueue and make the shipper think the
469
- // queue is already ended and quit. See HBASE-28114 and related issues for more details.
470
- // in the future, if we want to optimize the logic here, for example, do not call this method
471
- // every time, or do not acquire rollWriteLock in the implementation of this method, we need to
472
- // carefully review the optimized implementation
473
- OptionalLong fileLength = walFileLengthProvider .getLogFileSizeIfBeingWritten (currentPath );
463
+ OptionalLong fileLength ;
464
+ if (logQueue .getQueueSize (walGroupId ) > 1 ) {
465
+ // if there are more than one files in queue, although it is possible that we are
466
+ // still trying to write the trailer of the file and it is not closed yet, we can
467
+ // make sure that we will not write any WAL entries to it any more, so it is safe
468
+ // to just let the upper layer try to read the whole file without limit
469
+ fileLength = OptionalLong .empty ();
470
+ } else {
471
+ // if there is only one file in queue, check whether it is still being written to
472
+ // we must call this before actually reading from the reader, as this method will acquire the
473
+ // rollWriteLock. This is very important, as we will enqueue the new WAL file in postLogRoll,
474
+ // and before this happens, we could have already finished closing the previous WAL file. If
475
+ // we do not acquire the rollWriteLock and return whether the current file is being written
476
+ // to, we may finish reading the previous WAL file and start to read the next one, before it
477
+ // is enqueued into the logQueue, thus lead to an empty logQueue and make the shipper think
478
+ // the queue is already ended and quit. See HBASE-28114 and related issues for more details.
479
+ // in the future, if we want to optimize the logic here, for example, do not call this method
480
+ // every time, or do not acquire rollWriteLock in the implementation of this method, we need
481
+ // to carefully review the optimized implementation
482
+ fileLength = walFileLengthProvider .getLogFileSizeIfBeingWritten (currentPath );
483
+ }
474
484
WALTailingReader .Result readResult = reader .next (fileLength .orElse (-1 ));
475
485
long readerPos = readResult .getEntryEndPos ();
476
486
Entry readEntry = readResult .getEntry ();
0 commit comments