reorg / pg_repack

Reorganize tables in PostgreSQL databases with minimal locks

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Overriding `idle_in_transaction_session_timeout` doesn't seem to work properly

franciscoreinolds opened this issue · comments

Possibly related to #222

Today, I was trying to repack a table and I got the following warning: ERROR: query failed: FATAL: terminating connection due to idle-in-transaction timeout.

As I had an idle_in_transaction_session_timeout of "just" 2h, I thought I'd retry (since it could very well have been 2h since it had begun), this time setting it to 0, and the same behaviour was observed:

Details

$ sudo -u postgres PGOPTIONS="-c idle_in_transaction_session_timeout=0" PGOPTIONS="-c statement_timeout=0" pg_repack --no-kill-backend --wait-timeout=180 --table=<table> <database>
INFO: repacking table "public.<table>"
ERROR: query failed: FATAL:  terminating connection due to idle-in-transaction timeout
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
DETAIL: query was: SAVEPOINT repack_sp1

To check that it does indeed work, I tried running it again, but setting it to 5s so that it's obvious if PGOPTIONS is actually overriding the timeouts or not, and it worked as expected:

Details

$ time sudo -u postgres PGOPTIONS="-c idle_in_transaction_session_timeout=5s" PGOPTIONS="-c statement_timeout=5s" pg_repack --no-kill-backend --wait-timeout=180 --table=<table> <database>
INFO: repacking table "public.<table>"
ERROR: query failed: ERROR:  canceling statement due to statement timeout
DETAIL: query was: INSERT INTO repack.table_16480 SELECT <...> FROM ONLY public.<table>

real    0m5.169s
user    0m0.024s
sys     0m0.008s

So this seems to indicate that there's some kind of problem with the timeouts.

Looking forward to hear your perspective on this,

Francisco

pg_repack doesn't override idle_in_transaction_session_timeout. Maybe you have enabled idle_in_transaction_session_timeout globally for a user or a database?

pg_repack doesn't override idle_in_transaction_session_timeout.

Wasn't aware of that, thanks for clearing that up.

Maybe you have enabled idle_in_transaction_session_timeout globally for a user or a database?

I do, yes, but I'd like to avoid having to disable such timeouts during an operation like this.

Would now perhaps be a good occasion to rekindle the discussion regarding the overriding of this timeout in pg_repack itself, such as been suggested here? It appears that someone at a given point also opened a PR for this (#198).

Personally, I think this would be a great addition, but perhaps I'm missing some insight as to why not.

I'd say that pg_repack shouldn't disable idle_in_transaction_session_timeout by default. Although it is possible to add a new option which is 0 by default and we will think about it.

But on the other hand the issue is an environment related issue, because idle_in_transaction_session_timeout is disabled by default. If you set it on your database instance you have couple of options:

  • during running pg_repack disable it using PGOPTIONS environment variable
  • run pg_repack using a dedicated user for which you can disable idle_in_transaction_session_timeout by ALTER USER/ROLE

I'd say that pg_repack shouldn't disable idle_in_transaction_session_timeout by default. Although it is possible to add a new option which is 0 by default and we will think about it.

I'd say that's also a suitable solution, thanks for being open to it.

But on the other hand the issue is an environment related issue, because idle_in_transaction_session_timeout is disabled by default. If you set it on your database instance you have couple of options:

* during running pg_repack disable it using `PGOPTIONS` environment variable

But I think I did this correctly, didn't I? If you check the Details popups above, it did successfully override statement_timeout, so I don't see why the same wouldn't be true for the idle_in_transaction.

Potentially could be the case that it did not react on your ENV because you wrote it twice. So the latest one re-wrote the first (exactly with idle_in_transaction_session_timeout)

PGOPTIONS="-c idle_in_transaction_session_timeout=0 -c statement_timeout=0" sudo -u postgres pg_repack --no-kill-backend --wait-timeout=180 --table=<table> <database>