create_unix_server() removes listening unix socket, potentially from other process
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 77.2k
- Fork
- 35.9k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
Bug report
Bug description:
I made a mistake leading to reusing the same unix socket path for multiple Python processes, then as a surprise realized only the last process's unix socket listening, and none will be listening if the last process stopped.
I then realized this was implemented in https://github.com/python/asyncio/pull/441 for https://bugs.python.org/issue28399 which isn't clear on why deleting the original unix socket make sense. Assumingly it is for removing old unix socket files that's not in use, but apparently it can be removing listening sockets as well.
I don't think this should be intended behavior but open to any comment. Thanks.
To reproduce, with repro.py as below:
import os
import asyncio
class IdentityProtocol(asyncio.Protocol):
"""a protocol that politely replies server's pid then close connection"""
def connection_made(self, transport):
print('got new connection')
transport.write(b'hello from pid=%d\r\n' % os.getpid())
transport.close()
async def main():
server = await asyncio.get_running_loop().create_unix_server(
lambda: IdentityProtocol(), 'duplicatedpath.sock'
)
async with server:
await server.serve_forever()
asyncio.run(main())
run two of such instances in separate terminals for the same working directory, and after each process created, use nc -CU duplicatedpath.sock which should simply show the pid of the last python process and exit.
CPython versions tested on:
3.10
Operating systems tested on:
Linux
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo il comportamento con il repro.py fornito e i comandi nc su Linux, quindi segui asyncio.create_unix_server() ed esamina il PR 441 e l’issue 28399 collegati. Il lavoro è completato quando il comportamento di pulizia del socket non rimuove più il socket Unix in ascolto di un altro processo e lo scenario segnalato è coperto da un test di regressione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- networking
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100