Before Creating the Bug Report
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。
Before Creating the Bug Report
I found a bug, not just asking a question, which should be created in GitHub Discussions.
I have searched the GitHub Issues and GitHub Discussions of this repository and believe that this is not a duplicate.
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。