apache / apache/iotdb

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

Aperta
#9,734 9 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Java
Stelle
6.4k
Fork
1.2k
Merge medio
1g 23h
PR unite (30g)
115

Descrizione

### 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!

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia da IoTDBContainer._connect e dall’esempio dell’API nativa Python, quindi esegui su Windows la riproduzione fornita di IoTDBContainer(). Verifica che la porta passata a Session sia numerica, che l’host non sia localnpipe e che il TypeError non correlato non nasconda più i fallimenti di connessione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
databases
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.