gpt4 book ai didi

java - Apache 点燃: Node has not been connected to topology

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:45 27 4
gpt4 key购买 nike

在同一台计算机上有两个节点的本地(测试)设置中(使用端口范围 47500..47501 的静态 IP 配置),“第二个”节点将不会加入集群;它发出 TcpDiscoveryJoinRequestMessage这似乎是由“第一个”节点回答的,但在网络超时发生(20秒)后,它显示“节点尚未连接到拓扑”消息,并继续发送发现加入消息,该消息随后被第一个节点忽略(“忽略加入请求消息,因为节点已经在拓扑中”)。

这同样适用于(裸机和虚拟机)docker 机器上的(“真实”)集群设置。

这是一个已知问题吗?关于去哪里/寻找什么有什么建议吗? Ignite 发出大量日志( TcpDiscoverySpi ),但我看不到任何可能解释该行为的错误或警告。静态IP配置和自定义网络超时生效。

配置以 yml 形式给出,用于构建配置 bean(Spring Boot 应用程序),该配置 bean 又构建实际的 Ignite 配置。

grid:
discovery:
network-timeout: 20000
join-timeout: 20000
static:
enabled: true
addresses: 127.0.0.1:47500..47501

TcpDiscoveryVmIpFinder已生效(如日志中所示)。

另请参阅 node logs 中的相关部分(TcpDiscoverySpi)。

最佳答案

据我所知,您使用 Ignite messaging ,并且您的一些 remoteListener 包含 IgniteSemaphore作为它的字段,或者作为它的闭包的一部分。当所有节点连接时,有关此监听器的信息将通过发现消息发送到所有节点。

remoteListener被反序列化时,从DataStructuresProcessor请求一个信号量。但它尚未初始化,因为节点加入尚未完成。这是一个死锁,因为在 DataStructuresProcessor 初始化之前节点无法加入,反之亦然。

您可以通过延迟初始化信号量来避免此问题:

public static class ListenerHandler implements IgniteBiPredicate<UUID, Object> {
@IgniteInstanceResource
private Ignite ignite;

private transient IgniteSemaphore sem;

private IgniteSemaphore semaphore() {
if (sem != null)
return sem;

sem = ignite.semaphore("sem", 1, true, true);
return sem;
}

@Override public boolean apply(UUID uuid, Object o) {
// ...
}
}

错误跟踪器上的相关问题:IGNITE-3089

关于java - Apache 点燃: Node has not been connected to topology,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51986688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com