python / python/cpython

create_unix_server() removes listening unix socket, potentially from other process

Abierto
#121,252 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

type-bug
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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. 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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.