BUG #6602: concurrent psql session clobbers history
The following bug has been logged on the website:
Bug reference: 6602
Logged by: Adrian Dries
Email address: i+pgbugs@avdd.tk
PostgreSQL version: 9.1.3
Operating system: Ubuntu ppa:pitti/postgresql
Description:
A concurrent psql session will overwrite the history of the first. This
does not look good: a database tool causing me to lose my data!
# session 1
$ psql -q
postgres=# \echo first session exits first
first session exits first
postgres=# \q
$ cat .psql_history
\echo first session exits first
\q
$ psql -q
postgres=#
$ cat .psql_history
\echo second session exits second
\q
$ psql -q
postgres=# \echo first session exits second
first session exits second
postgres=# \q
$ cat .psql_history
\echo second session exits second
\q
\echo first session exits second
\q
# session 2
$ psql -q
postgres=# \echo second session exits second
second session exits second
postgres=# \q
$ cat .psql_history
\echo second session exits second
\q
$ psql -q
postgres=# \echo second session exits first
second session exits first
postgres=# \q
$ cat .psql_history
\echo second session exits second
\q
\echo second session exits first
\q
i+pgbugs@avdd.tk writes:
A concurrent psql session will overwrite the history of the first. This
does not look good: a database tool causing me to lose my data!
Works okay for me. I suspect you need to take this up with whoever
packages libreadline for Ubuntu, because it's going to be libreadline's
problem not ours.
regards, tom lane
On tor, 2012-04-19 at 15:00 -0400, Tom Lane wrote:
i+pgbugs@avdd.tk writes:
A concurrent psql session will overwrite the history of the first. This
does not look good: a database tool causing me to lose my data!Works okay for me. I suspect you need to take this up with whoever
packages libreadline for Ubuntu, because it's going to be libreadline's
problem not ours.
It's probably actually using libedit for the history part.
Peter Eisentraut <peter_e@gmx.net> writes:
On tor, 2012-04-19 at 15:00 -0400, Tom Lane wrote:
i+pgbugs@avdd.tk writes:
A concurrent psql session will overwrite the history of the first. This
does not look good: a database tool causing me to lose my data!
Works okay for me. I suspect you need to take this up with whoever
packages libreadline for Ubuntu, because it's going to be libreadline's
problem not ours.
It's probably actually using libedit for the history part.
[ after further research... ] Mmm, maybe. I can reproduce the
misbehavior on a Mac build using libedit. There is a relevant-looking
comment in psql's saveHistory function:
* On newer versions of libreadline, truncate the history file as
* needed and then append what we've added. This avoids overwriting
* history from other concurrent sessions (although there are still
* race conditions when two sessions exit at about the same time). If
* we don't have those functions, fall back to write_history().
A check of the configure output shows that Apple's libedit lacks
append_history(), so that the fallback code path is used. The phrasing
of this comment suggests that older versions of libreadline might be
lacking as well.
There's not a lot we can do about this issue when using a libreadline
or libedit that lacks the necessary support functions, I think.
regards, tom lane