Support generate toString() method for the proto messages
- Dominant language
- Java
- Stars
- 2.1k
- Forks
- 625
- Avg merge
- 3d 14h
- Merged PRs (30d)
- 97
Description
### Search before asking
- [x] I searched in the [issues](https://github.com/apache/fluss/issues) and found nothing similar.
### Description
Currently, the proto messages is not readable in fluss. Here is an example: the error logs in `ReplicaFetcherThread#processFetchLogRequest` are not ideal, as `FetchLogRequest` is an unreadable object. As a result, we may see logs like the following:
```
2025-08-26 10:51:10,512 WARN com.alibaba.fluss.server.replica.fetcher.ReplicaFetcherThread [] - Error in response for fetch log request com.alibaba.fluss.rpc.messages.FetchLogRequest@5325dadb
java.util.concurrent.ExecutionException: com.alibaba.fluss.exception.NetworkException: Disconnected from node 33.196.247.176:34077 (id: ts-24, rack: 33.196.237.221)
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396) ~[?:?]
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096) ~[?:?]
at com.alibaba.fluss.server.replica.fetcher.ReplicaFetcherThread.processFetchLogRequest(ReplicaFetcherThread.java:227) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at java.util.Optional.ifPresent(Optional.java:178) [?:?]
at com.alibaba.fluss.server.replica.fetcher.ReplicaFetcherThread.maybeFetch(ReplicaFetcherThread.java:153) [fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.server.replica.fetcher.ReplicaFetcherThread.doWork(ReplicaFetcherThread.java:124) [fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.utils.concurrent.ShutdownableThread.run(ShutdownableThread.java:96) [fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
Caused by: com.alibaba.fluss.exception.NetworkException: Disconnected from node 33.196.247.176:34077 (id: ts-24, rack: 33.196.237.221)
Caused by: java.nio.channels.ClosedChannelException
at com.alibaba.fluss.rpc.netty.client.NettyClientHandler.channelInactive(NettyClientHandler.java:180) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:305) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:81) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.handler.timeout.IdleStateHandler.channelInactive(IdleStateHandler.java:277) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:303) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:411) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:376) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:305) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1405) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:301) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:901) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:813) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:566) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at com.alibaba.fluss.shaded.netty4.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[fluss-server-0.8-SNAPSHOT.jar:0.8-SNAPSHOT]
at java.lang.Thread.run(Thread.java:833) ~[?:?]
```
### Willingness to contribute
- [x] I'm willing to submit a PR!
Contributor guide
No contributing guide indexed for this repository
Research direction
Start at ReplicaFetcherThread#processFetchLogRequest and inspect how the proto messages used there are generated and represented. Make the generated message objects readable through toString(), then verify that the FetchLogRequest in the reported error log contains useful fields; no test file is named in the issue.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend-api-design
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100