[Bug] Bug title Proxy 模式下 gRPC Client 使用 IPv6 连接时发送消息触发 NullPointerException
- Dominant language
- Java
- Stars
- 22.6k
- Forks
- 12k
- Avg merge
- 3d 1h
- Merged PRs (30d)
- 27
Description
### Before Creating the Bug Report
- [x] I found a bug, not just asking a question, which should be created in [GitHub Discussions](https://github.com/apache/rocketmq/discussions).
- [x] I have searched the [GitHub Issues](https://github.com/apache/rocketmq/issues) and [GitHub Discussions](https://github.com/apache/rocketmq/discussions) of this repository and believe that this is not a duplicate.
- [x] I have confirmed that this bug belongs to the current repository, not other repositories of RocketMQ.
### Runtime platform environment
OS: Centos7.6
### RocketMQ version
5.3.2
### JDK Version
1.8
### Describe the Bug
RocketMQ 5.3.2 在 Proxy 模式下,如果 gRPC Client 使用 IPv6 地址连接 Proxy,发送消息时 Broker 会抛出 NullPointerException,导致消息发送失败。
经过排查发现,该问题仅在 IPv6 环境下出现,IPv4 环境一切正常。
### Steps to Reproduce
为了定位问题,我在 Proxy 中增加了一些日志。
gRPC Metadata 中记录的客户端地址如下:
REMOTE_ADDRESS = [240e:341:6246:c700:c4ad:e645:459e:2]:44880
LOCAL_ADDRESS = [240e:341:6246:c700:c4ad:e645:459e:2]:8081
随后 ProxyContext 中保存的地址也是:
ProxyContext remote = [240e:341:6246:c700:c4ad:e645:459e:2]:44880
发送消息时:
ctx.remoteAddress = [240e:341:6246:c700:c4ad:e645:459e:2]:44880
说明 gRPC Metadata 在整个 Proxy 内部传递过程中没有发生变化。
### What Did You Expect to See?
RocketMQ Version:5.3.2
部署方式:Proxy + Broker + NameServer
Client:rocketmq-clients-go
网络环境:IPv6
我期望发送消息返回正常信息
### What Did You See Instead?
发送消息后,有异常
java.lang.NullPointerException: Cannot invoke "java.net.InetSocketAddress.getAddress()" because "bornSocketAddress" is null
at org.apache.rocketmq.store.CommitLog.asyncPutMessage(CommitLog.java:945)
at org.apache.rocketmq.store.DefaultMessageStore.asyncPutMessage(DefaultMessageStore.java:602)
at org.apache.rocketmq.broker.processor.SendMessageProcessor.sendMessage(SendMessageProcessor.java:328)
...
### Additional Context
最终定位到:
org.apache.rocketmq.common.utils.NetworkUtil
public static SocketAddress string2SocketAddress(final String addr) {
int split = addr.lastIndexOf(":");
String host = addr.substring(0, split);
String port = addr.substring(split + 1);
return new InetSocketAddress(host, Integer.parseInt(port));
}
Proxy 将 gRPC Metadata 中的
[240e:341:6246:c700:c4ad:e645:459e:2]:44880
转换为:
new InetSocketAddress(
"[240e:341:6246:c700:c4ad:e645:459e:2]",
44880
)
随后:ctx.channel().remoteAddress()
最终成为:InetSocketAddress
但是其中:inetSocketAddress.getAddress()
返回为:null
最终在 CommitLog 中:bornSocketAddress.getAddress()
触发 NullPointerException。
Contributor guide
Research direction
Start with org.apache.rocketmq.common.utils.NetworkUtil.string2SocketAddress and trace the resulting address through ProxyContext to CommitLog.asyncPutMessage, where bornSocketAddress.getAddress() fails. Reproduce the Proxy plus IPv6 gRPC send case described in the issue, then verify that IPv6 message sending completes without the NullPointerException while IPv4 behavior remains unchanged.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- grpc, java
- Domain
- backend, networking
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100