apache / apache/iotdb

[Bug] Python Client IoTDBContainer and Example is not well behaved and IoTDBContainer will fail on Windows

Abierto
#9,734 9 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Java
Estrellas
6.4k
Forks
1.2k
Merge medio
1 d 23 h
PR fusionados (30 d)
115

Descripción

### Search before asking

- [X] I searched in the [issues](https://github.com/apache/iotdb/issues) and found nothing similar.

### Version

Windows 11 22H2
IoTDB 1.1.0

### Describe the bug and provide the minimal reproduce step

In class `IoTDBContainer`:
```python
@wait_container_is_ready()
def _connect(self):
session = Session(
self.get_container_host_ip(), self.get_exposed_port(6667), "root", "root"
)
session.open(False)
session.close()
```
`get_exposed_port` return a `str`.

[Exampe](https://iotdb.apache.org/UserGuide/Master/API/Programming-Python-Native-API.html#how-to-use-example) use `str` port as well.

However, `TSocket` in `thrift` actually expect an `int` for `port`:
```python
class TSocket(TSocketBase):
"""Socket implementation of TTransport base."""

def __init__(self, host='localhost', port=9090, unix_socket=None,
socket_family=socket.AF_UNSPEC,
socket_keepalive=False):
"""Initialize a TSocket

@param host(str) The host to connect to.
@param port(int) The (TCP) port to connect to.
@param unix_socket(str) The filename of a unix socket to connect to.
(host and port will be ignored.)
@param socket_family(int) The socket family to use with this socket.
@param socket_keepalive(bool) enable TCP keepalive, default off.
"""
```
```python
@property
def _address(self):
return self._unix_socket if self._unix_socket else '%s:%d' % (self.host, self.port)
def open(self):
if self.handle:
raise TTransportException(type=TTransportException.ALREADY_OPEN, message="already open")
try:
addrs = self._resolveAddr()
except socket.gaierror as gai:
msg = 'failed to resolve sockaddr for ' + str(self._address)
...
```
Note the `%d` here. if the `self.port` is a `str`, when resolve address fail, an unrelated error will be raised:
```
socket.gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:
... LONG stack trace
TypeError: %d format: a real number is required, not str
```
I omit stack trace here, but in fact the terminal filled with stack trace and the plausible TypeError distracted me from discover the real bug: `self.get_container_host_ip()` return `'localnpipe'`.

How to reproduce:
(on Windows)
```python
from iotdb.IoTDBContainer import IoTDBContainer
IoTDBContainer()
```

### What did you expect to see?

1. no `TypeError: %d format: a real number is required, not str` raised.
2. host should be `localhost` instead of `localnpipe`
this seems an upstream bug.
there is a workaround: set environment variable `TC_HOST='localhost'`

### What did you see instead?

`TypeError: %d format: a real number is required, not str` is raised.
IoTDBContainer use `localnpipe` instead of `localhost`.

### Anything else?

_No response_

### Are you willing to submit a PR?

- [ ] I'm willing to submit a PR!

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza con IoTDBContainer._connect y el ejemplo de la API nativa de Python, y luego ejecuta en Windows la reproducción proporcionada de IoTDBContainer(). Verifica que el puerto pasado a Session sea numérico, que el host no sea localnpipe y que el TypeError no relacionado ya no oculte los fallos de conexión.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
databases
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.