apache / apache/iotdb-client-csharp

最新的2.0.8版本在linux中会出现Name or service not known错误

Aberta
#50 5 comentários 1 reação 0 responsáveis Ver no GitHub
Linguagem predominante
C#
Estrelas
24
Forks
6
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

升级2.0.8版本后linux系统上的连接出现问题,报错:Error occurs when opening session pool. Client pool size is not equal to the expected size. Client pool size: 0, expected size: 1, Please check the server status
但是windows上的连接没有问题。
通过日志发现如下错误:
warn: IoTDB[0]
Failed to create connection 1/1 to 192.168.1.10:6667
Thrift.Transport.TTransportException: Name or service not known
---> System.Net.Sockets.SocketException (00000005, 0xFFFDFFFF): Name or service not known
at System.Net.Dns.GetHostEntryOrAddressesCore(IPAddress address, Boolean justAddresses, AddressFamily addressFamily, Nullab>
at System.Net.Dns.GetHostEntry(String hostNameOrAddress, AddressFamily family)
at Thrift.Transport.Client.TSocketTransport..ctor(String host, Int32 port, TConfiguration config, Int32 timeout)
--- End of inner exception stack trace ---
at Thrift.Transport.Client.TSocketTransport..ctor(String host, Int32 port, TConfiguration config, Int32 timeout)
at Apache.IoTDB.SessionPool.CreateAndOpen(String host, Int32 port, Boolean enableRpcCompression, Int32 timeout, Boolean use>
at Apache.IoTDB.SessionPool.Open(CancellationToken cancellationToken)

检查发现Apache.IoTDB.SessionPool.CreateAndOpen调用了public TSocketTransport(string host, int port, TConfiguration config, int timeout = 0),这个构造函数直接调用了Dns.GetHostEntry去解析IP地址。
.NET 的 Dns.GetHostAddresses/GetHostEntry 最终依赖底层操作系统的名称解析 API;不同平台的行为并不完全一致。
在linux中 Dns.GetHostEntry(string) 遇到 IP 字符串时,不是简单返回这个 IP,而是会:
先把字符串解析成 IP;
对这个 IP 做一次反向解析拿主机名;
再用这个主机名做一次正向解析拿地址列表。
这个过程中任一步失败,都可能抛 SocketException。
在windows中则会宽松很多。
我现在把我的ip地址写道了/etc/hosts中,定义了一个主机名,现在可以正常连接。
但是这在linux中还是很不友好的,建议不要调用public TSocketTransport(string host, int port, TConfiguration config, int timeout = 0),而是使用public TSocketTransport(string hostNameOrIpAddress, int port, bool connectClient, TConfiguration config, int timeout = 0)代替,这个构造函数先判断hostNameOrIpAddress是不是IP地址,是的话直接使用,不是的话再调用Dns.GetHostEntry,这样linux系统就不用定义主机名了。

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Direção de pesquisa

Comece em Apache.IoTDB.SessionPool.CreateAndOpen e inspecione qual construtor de TSocketTransport ele usa; em seguida, compare as sobrecargas descritas na issue. Reproduza a conexão com um endereço IP no Linux e verifique se o pool de sessões é aberto sem exigir um nome de host em /etc/hosts, preservando as conexões por nome de host.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
csharp
Domínio
networking
Tipo de issue
Bug
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Pouca atividade
Clareza
Razoavelmente clara
Facilidade para iniciantes
64/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.