Skip to content

Fix NoSuchElementException that occurs when recovering log segments #2943

@pisceslj

Description

@pisceslj

Search before asking

  • I searched in the issues and found nothing similar.

Fluss version

0.9.0 (latest release)

Please describe the bug 🐞

When recovering log segments, invoke the readNextOffset function to calculate the offset that would be used for the next message to be appended to this segment. However, this function doesn‘t check for the scenario where batches is empty. Once batches is empty, invoking Iterables.getLast function will throw an exception.

2026-03-27 11:37:12,446 ERROR org.apache.fluss.server.ServerBase [] - Could not start TabletServer.
org.apache.fluss.exception.FlussException: Failed to start the TabletServer.
at org.apache.fluss.server.ServerBase.start(ServerBase.java:144) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.ServerBase.startServer(ServerBase.java:99) [fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.tablet.TabletServer.main(TabletServer.java:191) [fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
Caused by: org.apache.fluss.exception.FlussRuntimeException: Failed to recovery log
at org.apache.fluss.server.log.LogManager.loadLogs(LogManager.java:207) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.log.LogManager.startup(LogManager.java:139) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.tablet.TabletServer.startServices(TabletServer.java:228) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.ServerBase.start(ServerBase.java:131) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
... 2 more
Caused by: org.apache.fluss.exception.FlussRuntimeException: java.util.NoSuchElementException
at org.apache.fluss.server.log.LogManager$1.run(LogManager.java:518) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
at java.lang.Thread.run(Thread.java:842) ~[?:?]
Caused by: java.util.NoSuchElementException
at org.apache.fluss.utils.AbstractIterator.next(AbstractIterator.java:57) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.shaded.guava32.com.google.common.collect.Iterators.getLast(Iterators.java:907) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.shaded.guava32.com.google.common.collect.Iterables.getLast(Iterables.java:850) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.log.LogSegment.readNextOffset(LogSegment.java:414) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.log.LogLoader.recoverLog(LogLoader.java:198) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.log.LogLoader.load(LogLoader.java:93) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.log.LogTablet.create(LogTablet.java:324) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.log.LogManager.loadLog(LogManager.java:342) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at org.apache.fluss.server.log.LogManager$1.run(LogManager.java:487) ~[fluss-server-0.9-SNAPSHOT.jar:0.9-SNAPSHOT]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]

Solution

Use Iterables.isEmpty to check if batches is empty in the readNextOffset function. If batches is empty, directly return the baseOffset.

Are you willing to submit a PR?

  • I'm willing to submit a PR!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions