Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Silent port conflict goes undetected

Aperta
#798 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
28/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
docker, postgresql

Direzione di ricerca

Start by reproducing the Docker and Postgres.app setup in the issue, then inspect the source references to SO_REUSEPORT and SO_REUSEADDR and compare the context from #676. Done means a conflicting listener is detected and reported reliably without allowing traffic to reach different clusters unexpectedly.

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

Descrizione

I ran into a confusing scenario where I think Postgres.app should have reported "Port in use" and failed to start, but instead managed to bind and steal traffic from a process that was already listening on that port.

I have a Docker container running PostGIS and exposing container port 5432 on host port 5432. I was able to open a psql shell on port 5432, but was confused because the database didn't have the right data. Eventually I figured out that Postgres.app was also listening on port 5432:

$ sudo lsof -i :5432
COMMAND     PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke  1029 wchargin  128u  IPv6 0x97e222976b6cf6c5      0t0  TCP *:postgresql (LISTEN)
postgres  45709 wchargin    7u  IPv6 0x91b1855dc1c99cac      0t0  TCP localhost:postgresql (LISTEN)
postgres  45709 wchargin    8u  IPv4 0xa012493f18604ea9      0t0  TCP localhost:postgresql (LISTEN)

$ ps -p 45709 -o comm
COMM
/Applications/Postgres.app/Contents/Versions/16/bin/postgres

I searched the source for SO_REUSEPORT / SO_REUSEADDR and found the comment leading to #676. I'm glad that that issue is resolved, but it seems like this issue is an unfortunate consequence of the fix.

I do think that it may be somewhat confusing to use this socket option, since it subverts the application that if an application is listening on a port then it will be able to receive packets sent to that port. Notably, this confusion only occurs because my Docker container is listening on all interfaces. If I expose 127.0.0.1:5432:5432 instead of just 5432:5432, then Postgres.app properly reports "Port in use" or the Docker container fails with "Ports are not available". So it feels a bit clumsy and unpredictable that Postgres.app behaves this way.

Might there be a different way of solving the original issue that doesn't cause this side-effect?

Steps to reproduce
  1. Make sure that Postgres.app is stopped.
  2. Run docker run --rm -e POSTGRES_PASSWORD=password -p 5432:5432 -it postgres, and leave that running in its own terminal.
  3. Run psql -h localhost -p 5432 -U postgres, and execute (say) CREATE TABLE tab(), SELECT count(1) FROM tab.
  4. Start Postgres.app. Note that it moves to the "Running" state without any error.
  5. Run psql -h localhost -p 5432 -U postgres again. Note that SELECT count(1) FROM tab now fails: no such relation.

If you have the psql shells from (3) and (5) open at the same time, you can note that their \conninfos report identical results:

You are connected to database "postgres" as user "postgres" on host "localhost" (address "::1") at port "5432".

…yet they are actually talking to different clusters!

(Then you can Ctrl-C in the terminal from step 2, which will destroy the container.)

Lingua principale
Makefile
Stelle
7.8k
Fork
404
Merge medio
6h 55m
PR unite (30g)
6

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di PostgresApp/PostgresApp

Tutte le issue di PostgresApp/PostgresApp

Issue simili

Altre issue su Databases

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.