apache / apache/fluss

Support generate toString() method for the proto messages

Open
#1,591 2 comments 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.