Feature thought: idle in transaction timeout

Started by Joshua D. Drakealmost 19 years ago16 messages
#1Joshua D. Drake
jd@commandprompt.com

Hello,

I ran into an interesting problem with a customer today. They are
running Jabber XCP (not the one we use). Unfortunately, the product has
a bug that causes it to leave connections persistent in a transaction
state. This is what it does:

BEGIN; SELECT 1;

Basically it is verifying that the connection is live. However, it never
calls commit. So what happens? We can't vacuum ;).

Anyway, my thought is, we know when a transaction is idle, why not have
an idle timeout where we will explicitly close the connection or
rollback or something? User configurable of course.

Sincerely,

Joshua D. Drake

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

#2Russell Smith
mr-russ@pws.com.au
In reply to: Joshua D. Drake (#1)
Re: Feature thought: idle in transaction timeout

Joshua D. Drake wrote:

Hello,

I ran into an interesting problem with a customer today. They are
running Jabber XCP (not the one we use). Unfortunately, the product
has a bug that causes it to leave connections persistent in a
transaction state. This is what it does:

BEGIN; SELECT 1;

Basically it is verifying that the connection is live. However, it
never calls commit. So what happens? We can't vacuum ;).

Anyway, my thought is, we know when a transaction is idle, why not
have an idle timeout where we will explicitly close the connection or
rollback or something? User configurable of course.

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

Show quoted text

Sincerely,

Joshua D. Drake

#3Joshua D. Drake
jd@commandprompt.com
In reply to: Russell Smith (#2)
Re: Feature thought: idle in transaction timeout

Russell Smith wrote:

Joshua D. Drake wrote:

Hello,

I ran into an interesting problem with a customer today. They are
running Jabber XCP (not the one we use). Unfortunately, the product
has a bug that causes it to leave connections persistent in a
transaction state. This is what it does:

BEGIN; SELECT 1;

Basically it is verifying that the connection is live. However, it
never calls commit. So what happens? We can't vacuum ;).

Anyway, my thought is, we know when a transaction is idle, why not
have an idle timeout where we will explicitly close the connection or
rollback or something? User configurable of course.

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

We would certainly need to be able to disable on the fly too just with
SET as well.

Joshua D. Drake

Sincerely,

Joshua D. Drake

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Joshua D. Drake (#3)
Re: Feature thought: idle in transaction timeout

"Joshua D. Drake" <jd@commandprompt.com> writes:

Russell Smith wrote:

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

We would certainly need to be able to disable on the fly too just with
SET as well.

AFAICS, a *transaction* timeout per se has no use whatever except as a
foot-gun. How will you feel when you start a 12-hour restore, go home
for the evening, and come back in the morning to find it aborted because
you forgot to disable your 4-hour timeout?

Furthermore, if you have to set transaction_timeout to multiple hours
in the (vain) hope of not killing something important, what use is it
really? If you want to keep VACUUM able to work in a busy database,
you need it to be a lot less than that.

An *idle* timeout seems less risky, as well as much easier to pick a
sane value for.

regards, tom lane

#5Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#4)
Re: Feature thought: idle in transaction timeout

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Russell Smith wrote:

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

We would certainly need to be able to disable on the fly too just with
SET as well.

AFAICS, a *transaction* timeout per se has no use whatever except as a
foot-gun. How will you feel when you start a 12-hour restore, go home
for the evening, and come back in the morning to find it aborted because
you forgot to disable your 4-hour timeout?

Well of course that would be bad. That is why I said, idle in
transaction. If you are idle, you are doing nothing yes?

Joshua D. Drake

Furthermore, if you have to set transaction_timeout to multiple hours
in the (vain) hope of not killing something important, what use is it
really? If you want to keep VACUUM able to work in a busy database,
you need it to be a lot less than that.

An *idle* timeout seems less risky, as well as much easier to pick a
sane value for.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

#6Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#4)
Re: Feature thought: idle in transaction timeout

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Russell Smith wrote:

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

We would certainly need to be able to disable on the fly too just with
SET as well.

I should have read what you posted more thoroughly. I apologize. A
transaction timeout is surely a bad idea as Tom says below. Heck, not
just from what he says below, but what about the scenario that killing a
transaction could cause a massive rollback and thus increase the initial
problem that I posted about :)

An *idle* timeout seems less risky, as well as much easier to pick a
sane value for.

Yeah, it could as high as something like 60 minutes if we really wanted.

Sincerely,

Joshua D. Drake

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

#7Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#4)
Re: Feature thought: idle in transaction timeout

Added to TODO:

* Add idle_timeout GUC so locks are not held for log periods of time

---------------------------------------------------------------------------

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Russell Smith wrote:

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

We would certainly need to be able to disable on the fly too just with
SET as well.

AFAICS, a *transaction* timeout per se has no use whatever except as a
foot-gun. How will you feel when you start a 12-hour restore, go home
for the evening, and come back in the morning to find it aborted because
you forgot to disable your 4-hour timeout?

Furthermore, if you have to set transaction_timeout to multiple hours
in the (vain) hope of not killing something important, what use is it
really? If you want to keep VACUUM able to work in a busy database,
you need it to be a lot less than that.

An *idle* timeout seems less risky, as well as much easier to pick a
sane value for.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#8Joshua D. Drake
jd@commandprompt.com
In reply to: Bruce Momjian (#7)
Re: Feature thought: idle in transaction timeout

Bruce Momjian wrote:

Added to TODO:

* Add idle_timeout GUC so locks are not held for log periods of time

That should actually be transaction_idle_timeout. It is o.k. for us to
be IDLE... it is not o.k. for us to be IDLE in Transaction

Joshua D. Drake

---------------------------------------------------------------------------

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Russell Smith wrote:

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

We would certainly need to be able to disable on the fly too just with
SET as well.

AFAICS, a *transaction* timeout per se has no use whatever except as a
foot-gun. How will you feel when you start a 12-hour restore, go home
for the evening, and come back in the morning to find it aborted because
you forgot to disable your 4-hour timeout?

Furthermore, if you have to set transaction_timeout to multiple hours
in the (vain) hope of not killing something important, what use is it
really? If you want to keep VACUUM able to work in a busy database,
you need it to be a lot less than that.

An *idle* timeout seems less risky, as well as much easier to pick a
sane value for.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

#9Andrew Dunstan
andrew@dunslane.net
In reply to: Bruce Momjian (#7)
Re: Feature thought: idle in transaction timeout

Bruce Momjian wrote:

Added to TODO:

* Add idle_timeout GUC so locks are not held for log periods of time

ITYM long periods.

cheers

andrew

#10Bruce Momjian
bruce@momjian.us
In reply to: Andrew Dunstan (#9)
Re: Feature thought: idle in transaction timeout

Fixed.

---------------------------------------------------------------------------

Andrew Dunstan wrote:

Bruce Momjian wrote:

Added to TODO:

* Add idle_timeout GUC so locks are not held for log periods of time

ITYM long periods.

cheers

andrew

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#11Bruce Momjian
bruce@momjian.us
In reply to: Joshua D. Drake (#8)
Re: Feature thought: idle in transaction timeout

fixed.

---------------------------------------------------------------------------

Joshua D. Drake wrote:

Bruce Momjian wrote:

Added to TODO:

* Add idle_timeout GUC so locks are not held for log periods of time

That should actually be transaction_idle_timeout. It is o.k. for us to
be IDLE... it is not o.k. for us to be IDLE in Transaction

Joshua D. Drake

---------------------------------------------------------------------------

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Russell Smith wrote:

I agree with this, it reduces the long running transaction problem a
little where the user forgot to commit/rollback their session. I may be
worth having a transaction_timeout as well, and setting it to link a few
hours by default. That way you can't have really long running
transactions unless you specifically set that.

We would certainly need to be able to disable on the fly too just with
SET as well.

AFAICS, a *transaction* timeout per se has no use whatever except as a
foot-gun. How will you feel when you start a 12-hour restore, go home
for the evening, and come back in the morning to find it aborted because
you forgot to disable your 4-hour timeout?

Furthermore, if you have to set transaction_timeout to multiple hours
in the (vain) hope of not killing something important, what use is it
really? If you want to keep VACUUM able to work in a busy database,
you need it to be a lot less than that.

An *idle* timeout seems less risky, as well as much easier to pick a
sane value for.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#12Tom Lane
tgl@sss.pgh.pa.us
In reply to: Joshua D. Drake (#8)
Re: Feature thought: idle in transaction timeout

"Joshua D. Drake" <jd@commandprompt.com> writes:

Bruce Momjian wrote:

Added to TODO:
* Add idle_timeout GUC so locks are not held for log periods of time

That should actually be transaction_idle_timeout. It is o.k. for us to
be IDLE... it is not o.k. for us to be IDLE in Transaction

Or "idle_in_transaction_timeout"? Anyway I agree that using
"idle_timeout" for this is unwise. We've been asked often enough for a
flat-out idle timeout (ie kill session after X seconds of no client
interaction), and while I disagree with the concept, someday we might
cave and implement it. We should reserve the name for the behavior
that people would expect a parameter named like that to have.

regards, tom lane

#13Joshua D. Drake
jd@commandprompt.com
In reply to: Tom Lane (#12)
Re: Feature thought: idle in transaction timeout

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Bruce Momjian wrote:

Added to TODO:
* Add idle_timeout GUC so locks are not held for log periods of time

That should actually be transaction_idle_timeout. It is o.k. for us to
be IDLE... it is not o.k. for us to be IDLE in Transaction

Or "idle_in_transaction_timeout"?

Yeah that would work and it is what I originally typed before
backspacing. I was trying to avoid the _in_ but either way.

Anyway I agree that using
"idle_timeout" for this is unwise. We've been asked often enough for a
flat-out idle timeout (ie kill session after X seconds of no client
interaction), and while I disagree with the concept, someday we might

Well I agree that we shouldn't kill sessions just because they are idle,
I can imagine all the lovely... my pgpool sessions keep getting killed!
comments.

cave and implement it. We should reserve the name for the behavior
that people would expect a parameter named like that to have.

Agreed.

Sincerely,

Joshua D. Drake

regards, tom lane

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

#14Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#7)
Re: Feature thought: idle in transaction timeout

Bruce Momjian <bruce@momjian.us> writes:

Added to TODO:
* Add idle_timeout GUC so locks are not held for log periods of time

BTW, before I forget it: there's a non-obvious consideration here, which
is not breaking the query protocol. I suspect that we cannot send an
unsolicited ERROR message without getting out-of-sync with the client,
which will likely take the error as the response to its next command
and thenceforth be very confused. What we'll probably have to do to
make this work is abort the transaction upon timeout (so that VACUUM et
al can get on with things) but not report the error to the client until
its next command. And if said next command happens to be ROLLBACK then
there's nothing to complain of at all.

Doable, probably, but seems a bit messy.

regards, tom lane

PS: the only case where we currently send an unsolicited ERROR is during
SIGTERM or SIGQUIT shutdown; where it doesn't matter if we're out of
sync because we're killing the session anyway.

#15Bruce Momjian
bruce@momjian.us
In reply to: Joshua D. Drake (#13)
Re: Feature thought: idle in transaction timeout

TODO updated:

* Add idle_in_transaction_timeout GUC so locks are not held for long
periods of time

---------------------------------------------------------------------------

Joshua D. Drake wrote:

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Bruce Momjian wrote:

Added to TODO:
* Add idle_timeout GUC so locks are not held for log periods of time

That should actually be transaction_idle_timeout. It is o.k. for us to
be IDLE... it is not o.k. for us to be IDLE in Transaction

Or "idle_in_transaction_timeout"?

Yeah that would work and it is what I originally typed before
backspacing. I was trying to avoid the _in_ but either way.

Anyway I agree that using
"idle_timeout" for this is unwise. We've been asked often enough for a
flat-out idle timeout (ie kill session after X seconds of no client
interaction), and while I disagree with the concept, someday we might

Well I agree that we shouldn't kill sessions just because they are idle,
I can imagine all the lovely... my pgpool sessions keep getting killed!
comments.

cave and implement it. We should reserve the name for the behavior
that people would expect a parameter named like that to have.

Agreed.

Sincerely,

Joshua D. Drake

regards, tom lane

--

=== The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive PostgreSQL solutions since 1997
http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
PostgreSQL Replication: http://www.commandprompt.com/products/

---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#16Hannu Krosing
hannu@skype.net
In reply to: Joshua D. Drake (#13)
Re: Feature thought: idle in transaction timeout

Ühel kenal päeval, E, 2007-04-02 kell 19:36, kirjutas Joshua D. Drake:

Tom Lane wrote:

"Joshua D. Drake" <jd@commandprompt.com> writes:

Bruce Momjian wrote:

Added to TODO:
* Add idle_timeout GUC so locks are not held for log periods of time

That should actually be transaction_idle_timeout. It is o.k. for us to
be IDLE... it is not o.k. for us to be IDLE in Transaction

Or "idle_in_transaction_timeout"?

Yeah that would work and it is what I originally typed before
backspacing. I was trying to avoid the _in_ but either way.

Anyway I agree that using
"idle_timeout" for this is unwise. We've been asked often enough for a
flat-out idle timeout (ie kill session after X seconds of no client
interaction), and while I disagree with the concept, someday we might

Well I agree that we shouldn't kill sessions just because they are idle,

As the projects to have some out-of-band capabilities in pg wire
protocol which could be used to implement keepalives seem to be going
nowhere, having an idle_session_timeout to have a at least some
protection against server not noticing that client has left (due to
network problems for example) may still be a good thing.

At least it beats running

psql -c "select 'kill '||procpid from pg_stat_activity where
current_query = '<IDLE>' and current_timestamp - query_start >
'00:01:00';" | bash

from postgres users cron each minute to kill stale connections

idle_session_timeout is something that should be off by default and
would be used only in OLTP production environments where not noticing
stale connections can lead to exhausting connection pool by reconnecting
clients.

I can imagine all the lovely... my pgpool sessions keep getting killed!
comments.

pgpool could do 'select 1' often enough to keep timeout from happening;

cave and implement it. We should reserve the name for the behavior
that people would expect a parameter named like that to have.

Agreed.

Sincerely,

Joshua D. Drake

regards, tom lane

--
----------------
Hannu Krosing
Database Architect
Skype Technologies OÜ
Akadeemia tee 21 F, Tallinn, 12618, Estonia

Skype me: callto:hkrosing
Get Skype for free: http://www.skype.com