pg_isready bug

Lists: pgsql-bugs
From: "Hunosau, Aliaksei" <ahunosau(at)scnsoft(dot)com>
To: "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org>
Subject: pg_isready bug
Date: 2020-04-13 12:53:32
Message-ID: 1586782412339.75897@scnsoft.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-bugs

We are using Postgres in docker. And problem with pg_isready? was found.

Please, look:

root(at)29243fe45836:/# psql -U postgres
psql (11.6 (Debian 11.6-1.pgdg90+1))
Type "help" for help.

postgres=# \l+
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
-----------+----------+----------+------------+------------+-----------------------+---------+------------+--------------------------------------------
internal | postgres | UTF8 | en_US.utf8 | en_US.utf8 | | 12 MB | pg_default |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | | 7669 kB | pg_default | default administrative connection database
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +| 7529 kB | pg_default | unmodifiable empty database
| | | | | postgres=CTc/postgres | | |
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +| 7529 kB | pg_default | default template for new databases
| | | | | postgres=CTc/postgres | | |
(4 rows)

postgres=# exit
root(at)29243fe45836:/# pg_isready -d 123456 -h localhost -p 5432 -U postgres # the DB 123456 doesn't exist
localhost:5432 - accepting connections # but it shows all is good
root(at)29243fe45836:/# echo $?
0
root(at)29243fe45836:/# pg_isready -d internal -h localhost -p 5432 -U postgres # the DB internal doesn't exist
localhost:5432 - accepting connections # looks good
root(at)29243fe45836:/# echo $?
0

The exitcodes of pg_isready if the DB doesn't exist and if exists are the same.
It will be better to exit with non null exitcode if pg_isready can't connect to absent db or using incorrect user.

Best regards,

[https://www.scnsoft.com/website/var/assets/logos/logo-64x64.png]<http://www.scnsoft.com/>

Aliaksei Hunosau, DevOps engineer
ScienceSoft - Professional Software Development
2 Bedy Street, Minsk, Belarus, 220040
P +375 17 293 37 36 | F+375 17 293 37 39
ahunosau(at)scnsoft(dot)com<mailto:ahunosau(at)scnsoft(dot)com>
www.scnsoft.com<https://www.scnsoft.com/?utm_source=EmailSignature&utm_medium=email&utm_campaign=GeneralEmailSignature&utm_content=aliaksei.hunosau> | LinkedIn<https://www.linkedin.com/company/sciencesoft?trk=srch_hero_comp_name> | Facebook<https://www.facebook.com/sciencesoft.solutions> | Twitter<https://twitter.com/ScienceSoft>


From: Fabien COELHO <coelho(at)cri(dot)ensmp(dot)fr>
To: "Hunosau, Aliaksei" <ahunosau(at)scnsoft(dot)com>
Cc: "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: pg_isready bug
Date: 2020-04-13 14:17:21
Message-ID: alpine.DEB.2.21.2004131605150.27777@pseudo
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-bugs


Hello,

> root(at)29243fe45836:/# pg_isready -d 123456 -h localhost -p 5432 -U postgres # the DB 123456 doesn't exist
> localhost:5432 - accepting connections # but it shows all is good
> root(at)29243fe45836:/# echo $?
> 0

I can confirm, but I'm afraid it is a feature.

The server *is* indeed accepting connections… it does not say that the
connection with the parameters you supplied worked.

The feature relies on "PQpingParams" function which states the following
somehow strange sentence:

"It is not necessary to supply correct user name, password, or database
name values to obtain the server status; however, if incorrect values are
provided, the server will log a failed connection attempt."

The same occurs with a non existing user (-U).

Basically a connection is merely attempted, but it does not report success
of said connection. The sentence of "pg_isready --help" is somehow
ambiguous:

"pg_isready issues a connection check to a PostgreSQL database.", but no
one specified whaa a "connection check" is. I can understand that you
would expect to be an actual connection:-)

ISTM that the doc should be clarified about what is a "connection check",
and that it is not working a connection.

If you want to check that your parameters are ok, probably you want to
issue an actual psql run, eg:

psql <my param> -c "SELECT 'ok'"

--
Fabien.


From: Michael Paquier <michael(at)paquier(dot)xyz>
To: Fabien COELHO <coelho(at)cri(dot)ensmp(dot)fr>
Cc: "Hunosau, Aliaksei" <ahunosau(at)scnsoft(dot)com>, "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: pg_isready bug
Date: 2020-04-14 00:33:37
Message-ID: 20200414003337.GB1492@paquier.xyz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg토토 결과SQL : Postg토토 결과SQL 메일 링리스트 : 2020-04-14 00:33 이후 PGSQL-BUGS

On Mon, Apr 13, 2020 at 04:17:21PM +0200, Fabien COELHO wrote:
> Basically a connection is merely attempted, but it does not report success
> of said connection. The sentence of "pg_isready --help" is somehow
> ambiguous:
>
> "pg_isready issues a connection check to a PostgreSQL database.", but no one
> specified whaa a "connection check" is. I can understand that you would
> expect to be an actual connection:-)
>
> ISTM that the doc should be clarified about what is a "connection check",
> and that it is not working a connection.

Yeah, that matches my impression when reading this thread. Perhaps
the docs had better emphasize that --timeout is a simple mapping for
the connection parameter connect_timeout in this case? My point is
that the logic tells us that the timeout is in effect when a
connection has been started, but not completed yet. And the docs of
pg_isready tell us that:
"The maximum number of seconds to wait when attempting connection
before returning that the server is not responding."

So this does not really insist on the point that a timeout has no
effect on a connection immediately failing because of an incorrect
parameter set.
--
Michael