create_unix_server() removes listening unix socket, potentially from other process
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza reproduciendo el comportamiento con el repro.py proporcionado y los comandos nc en Linux; después, sigue el flujo de asyncio.create_unix_server() y revisa el PR 441 y el issue 28399 enlazados. La tarea está terminada cuando el comportamiento de limpieza del socket ya no elimina el socket Unix de escucha de otro proceso y el escenario informado está cubierto por una prueba de regresión.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- networking
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100