Обсуждение: Commit with wait event on advisory lock!

Поиск
Список
Период
Сортировка

Commit with wait event on advisory lock!

От
Дата:

Hi all,

 

I have long commits on a production database. To know why this happens I organized a snapshot system on table pg_stat_activity.

When I check the result I have this row in it:

 

postgres=# select * from public.fdj_ms_slow_stmts where pid = 2285947 \gx

-[ RECORD 1 ]----+-----------------------------------------------------------------------------------------------------------------------

datname          | some_db

pid              | 2285947

leader_pid       |

usename          | some_user

application_name | PostgreSQL JDBC Driver

backend_start    | 2025-01-21 04:25:17.254477+01

xact_start       | 2025-01-21 05:55:19.426945+01

query_start      | 2025-01-21 05:55:19.428651+01

stmt_duration    | 00:00:02.140691

tx_idle_duration | 00:00:00

ts_now           | 2025-01-21 05:55:21.569342+01

state            | active

wait_event_type  | Lock

wait_event       | advisory

query_id         |

query            | COMMIT

 

Is this possible ?

I am really surprised !

 

Michel SALAIS

Re: Commit with wait event on advisory lock!

От
Rajesh Kumar
Дата:

Advisory locks are used by developers

On Tue, 21 Jan 2025, 20:18 , <msalais@msym.fr> wrote:

Hi all,

 

I have long commits on a production database. To know why this happens I organized a snapshot system on table pg_stat_activity.

When I check the result I have this row in it:

 

postgres=# select * from public.fdj_ms_slow_stmts where pid = 2285947 \gx

-[ RECORD 1 ]----+-----------------------------------------------------------------------------------------------------------------------

datname          | some_db

pid              | 2285947

leader_pid       |

usename          | some_user

application_name | PostgreSQL JDBC Driver

backend_start    | 2025-01-21 04:25:17.254477+01

xact_start       | 2025-01-21 05:55:19.426945+01

query_start      | 2025-01-21 05:55:19.428651+01

stmt_duration    | 00:00:02.140691

tx_idle_duration | 00:00:00

ts_now           | 2025-01-21 05:55:21.569342+01

state            | active

wait_event_type  | Lock

wait_event       | advisory

query_id         |

query            | COMMIT

 

Is this possible ?

I am really surprised !

 

Michel SALAIS

RE: Commit with wait event on advisory lock!

От
Дата:

Hi

 

I know very well advisory locks. The question is:

 

How a COMMIT statement could be blocked by a lock whatever the kind of the lock could be. COMMIT releases locks. How could it be blocked by a lock?!

 

Regards

 

Michel SALAIS

 

De : Rajesh Kumar <rajeshkumar.dba09@gmail.com>
Envoyé : mardi 21 janvier 2025 15:57
À : msalais@msym.fr
Cc : pgsql-admin@lists.postgresql.org
Objet : Re: Commit with wait event on advisory lock!

 

Advisory locks are used by developers

 

On Tue, 21 Jan 2025, 20:18 , <msalais@msym.fr> wrote:

Hi all,

 

I have long commits on a production database. To know why this happens I organized a snapshot system on table pg_stat_activity.

When I check the result I have this row in it:

 

postgres=# select * from public.fdj_ms_slow_stmts where pid = 2285947 \gx

-[ RECORD 1 ]----+-----------------------------------------------------------------------------------------------------------------------

datname          | some_db

pid              | 2285947

leader_pid       |

usename          | some_user

application_name | PostgreSQL JDBC Driver

backend_start    | 2025-01-21 04:25:17.254477+01

xact_start       | 2025-01-21 05:55:19.426945+01

query_start      | 2025-01-21 05:55:19.428651+01

stmt_duration    | 00:00:02.140691

tx_idle_duration | 00:00:00

ts_now           | 2025-01-21 05:55:21.569342+01

state            | active

wait_event_type  | Lock

wait_event       | advisory

query_id         |

query            | COMMIT

 

Is this possible ?

I am really surprised !

 

Michel SALAIS

Re: Commit with wait event on advisory lock!

От
Tom Lane
Дата:
<msalais@msym.fr> writes:
> How a COMMIT statement could be blocked by a lock whatever the kind of the lock could be. COMMIT releases locks. How
couldit be blocked by a lock?! 

There could be pre-commit actions (for example, firing deferred
triggers) that need to take locks the transaction didn't already
hold.  You've provided no details that would let anyone diagnose
the exact cause, though.

            regards, tom lane



Re: Commit with wait event on advisory lock!

От
Jeff Janes
Дата:
On Tue, Jan 21, 2025 at 9:48 AM <msalais@msym.fr> wrote:

Hi all,

 

I have long commits on a production database. To know why this happens I organized a snapshot system on table pg_stat_activity.

When I check the result I have this row in it:

 

postgres=# select * from public.fdj_ms_slow_stmts where pid = 2285947 \gx


What is the full version()?  What is the query used to populate this snapshot table?  Are the advisory locks being used as session-level locks or transaction-level locks?

Cheers,

Jeff

RE: Commit with wait event on advisory lock!

От
Дата:
Hi Tom,

Sorry,
- It is PG 14.4
- Replication is used (2 standby, one sync and the other potential) but no
application connection to replica.
- No deferrable constraints:
some_db=# select count(*) from pg_constraint where condeferrable ;
count
-------
     0
(1 row)

- No triggers:
some_db=# select count(*) from pg_trigger ;
count
-------
     0
(1 row)

I only capture statements executed within database some_db.

And finally, this is how I take snaps (this is launched by crontab every
hour). I also tried to capture 'idle in transaction' ...

do
$$
declare
  debut timestamptz := current_timestamp;
begin
  set synchronous_commit = local; -- I don't care about replication for my
table
  <<main>>
  loop
    insert into public.ms_slow_stmts(datname, pid, leader_pid, usename,
application_name, backend_start, xact_start, query_start, stmt_duration,
tx_idle_duration, ts_now, state, wait_event_type, wait_event, query_id,
query)
    select
      datname,
      pid,
      leader_pid,
      usename,
      application_name,
      backend_start,
      xact_start,
      query_start,
      case
        when state = 'idle in transaction' then state_change - query_start
        else clock_timestamp - query_start
      end stmt_duration,
      case
        when state = 'idle in transaction' then clock_timestamp -
state_change
        else interval '0s'
      end tx_idle_duration,
      clock_timestamp ts_now,
      state,
      wait_event_type,
      wait_event,
      query_id,
      query
    from pg_stat_activity
    where
      backend_type = 'client backend'
      and
      datname = 'some_db'
      and
      state != 'idle'
      and
      (
        case
          when state = 'idle in transaction' then state_change - query_start
-- last query execution time if in 'idle in transaction' state
          else clock_timestamp - query_start -- time from query start for
current query
        end >= interval'2s'
        or
        case
          when state = 'idle in transaction' then clock_timestamp -
state_change
          else interval'0s'
        end >= interval'1s' -- in state 'idle in transaction' for more than
1 s
      );
      commit;
    exit when clock_timestamp - debut >= interval'00:59:55';
    perform pg_sleep(1);
  end loop main;
end;
$$;

Best regards

---
Michel SALAIS

-----Message d'origine-----
De : Tom Lane <tgl@sss.pgh.pa.us>
Envoyé : mercredi 22 janvier 2025 01:49
À : msalais@msym.fr
Cc : 'Rajesh Kumar' <rajeshkumar.dba09@gmail.com>;
pgsql-admin@lists.postgresql.org
Objet : Re: Commit with wait event on advisory lock!

<msalais@msym.fr> writes:
> How a COMMIT statement could be blocked by a lock whatever the kind of the
lock could be. COMMIT releases locks. How could it be blocked by a lock?!

There could be pre-commit actions (for example, firing deferred
triggers) that need to take locks the transaction didn't already hold.
You've provided no details that would let anyone diagnose the exact cause,
though.

            regards, tom lane




Re: Commit with wait event on advisory lock!

От
Tom Lane
Дата:
<msalais@msym.fr> writes:
> - Replication is used (2 standby, one sync and the other potential) but no
> application connection to replica.

Maybe you have synchronous_commit set to enforce waiting for the
standby to receive/apply the transaction?  If so I'd look for
possible delays there.

            regards, tom lane



RE: Commit with wait event on advisory lock!

От
Дата:
Hello Tom

I do have delays sometimes because of synchronous_commit (We use actually
the default value and synchronous_standby_names is not empty). I have
sometimes commit execution time more than 10 sec but the problem is more
general than commit/synchronization.

But my concern here is really to understand in which situations, a COMMIT
statement can wait on a lock especially that I have no triggers, and no
deferrable constraints...

What could it be? This can point something to look about...

By the way I also have commits which are waiting on ClientRead...

--
Michel SALAIS

-----Message d'origine-----
De : Tom Lane <tgl@sss.pgh.pa.us>
Envoyé : mercredi 22 janvier 2025 18:24
À : msalais@msym.fr
Cc : 'Rajesh Kumar' <rajeshkumar.dba09@gmail.com>;
pgsql-admin@lists.postgresql.org
Objet : Re: Commit with wait event on advisory lock!

<msalais@msym.fr> writes:
> - Replication is used (2 standby, one sync and the other potential)
> but no application connection to replica.

Maybe you have synchronous_commit set to enforce waiting for the standby to
receive/apply the transaction?  If so I'd look for possible delays there.

            regards, tom lane




Re: Commit with wait event on advisory lock!

От
Tom Lane
Дата:
<msalais@msym.fr> writes:
> But my concern here is really to understand in which situations, a COMMIT
> statement can wait on a lock especially that I have no triggers, and no
> deferrable constraints...

The core code does nothing with advisory locks.  If COMMIT is blocking
on one of those, it must be a consequence of user-defined code that
is running at pre-commit time.  You've given us nothing to go on about
what that could be.

> By the way I also have commits which are waiting on ClientRead...

That, on the other hand, is surely impossible.  I think maybe you
are misreading the stats display.  Typically I'd expect that such a
case indicates that the session is idle (awaiting a new command)
and the COMMIT is the last thing it did before that.

            regards, tom lane



RE: Commit with wait event on advisory lock!

От
Дата:
Hello,

The session is marked ***active***. It is not in idle state and the query is
'commit' and the event is ***ClientRead***! There is no doubt...
This one and the wait on advisory lock by a commit statement let me think
about Oracle saying that it doesn't guarantee consistence for dynamic tables
data, and it could be the same thing here for pg_stat_activity. Could it be?
It could depend on protocol and when exactly this dynamic table is
updated...

Best regards

---
Michel SALAIS

-----Message d'origine-----
De : Tom Lane <tgl@sss.pgh.pa.us>
Envoyé : mercredi 22 janvier 2025 23:18
À : msalais@msym.fr
Cc : 'Rajesh Kumar' <rajeshkumar.dba09@gmail.com>;
pgsql-admin@lists.postgresql.org
Objet : Re: Commit with wait event on advisory lock!

<msalais@msym.fr> writes:
> But my concern here is really to understand in which situations, a
> COMMIT statement can wait on a lock especially that I have no
> triggers, and no deferrable constraints...

The core code does nothing with advisory locks.  If COMMIT is blocking on
one of those, it must be a consequence of user-defined code that is running
at pre-commit time.  You've given us nothing to go on about what that could
be.

> By the way I also have commits which are waiting on ClientRead...

That, on the other hand, is surely impossible.  I think maybe you are
misreading the stats display.  Typically I'd expect that such a case
indicates that the session is idle (awaiting a new command) and the COMMIT
is the last thing it did before that.

            regards, tom lane





RE: Commit with wait event on advisory lock!

От
Дата:
Hi,
Just an example of my result today:
<code>
postgres=# select pid,  xact_start, query_start, ts_now, stmt_duration,
state, wait_event_type, wait_event, query from public.ms_slow_stmts where
query ilike 'commit' and wait_event_type in ('Client', 'Lock');
   pid   |          xact_start           |          query_start          |
ts_now             |  stmt_duration  | state  | wait_event_type | wait_event
| query
---------+-------------------------------+-------------------------------+--
-----------------------------+-----------------+--------+-----------------+-
-----------+--------
  529392 | 2025-01-21 05:55:19.427214+01 | 2025-01-21 05:55:19.429889+01 |
2025-01-21 05:55:21.569339+01 | 00:00:02.13945  | active | Client          |
ClientRead | COMMIT
2285947 | 2025-01-21 05:55:19.426945+01 | 2025-01-21 05:55:19.428651+01 |
2025-01-21 05:55:21.569342+01 | 00:00:02.140691 | active | Lock            |
advisory   | COMMIT
4106658 | 2025-01-22 13:04:29.551289+01 | 2025-01-22 13:04:29.726165+01 |
2025-01-22 13:04:33.191303+01 | 00:00:03.465138 | active | Client          |
ClientRead | COMMIT
4106652 | 2025-01-22 13:04:30.068406+01 | 2025-01-22 13:04:30.073688+01 |
2025-01-22 13:04:33.191322+01 | 00:00:03.117634 | active | Client          |
ClientRead | COMMIT
4106625 | 2025-01-22 13:04:30.064757+01 | 2025-01-22 13:04:30.070484+01 |
2025-01-22 13:04:33.191402+01 | 00:00:03.120918 | active | Client          |
ClientRead | COMMIT
  119472 | 2025-01-22 19:19:43.156342+01 | 2025-01-22 19:19:43.159275+01 |
2025-01-22 19:19:45.208617+01 | 00:00:02.049342 | active | Client          |
ClientRead | COMMIT
</code>

Michel SALAIS

-----Message d'origine-----
De : msalais@msym.fr <msalais@msym.fr>
Envoyé : jeudi 23 janvier 2025 19:36
À : 'Tom Lane' <tgl@sss.pgh.pa.us>
Cc : 'Rajesh Kumar' <rajeshkumar.dba09@gmail.com>;
pgsql-admin@lists.postgresql.org
Objet : RE: Commit with wait event on advisory lock!

Hello,

The session is marked ***active***. It is not in idle state and the query is
'commit' and the event is ***ClientRead***! There is no doubt...
This one and the wait on advisory lock by a commit statement let me think
about Oracle saying that it doesn't guarantee consistence for dynamic tables
data, and it could be the same thing here for pg_stat_activity. Could it be?
It could depend on protocol and when exactly this dynamic table is
updated...

Best regards

---
Michel SALAIS

-----Message d'origine-----
De : Tom Lane <tgl@sss.pgh.pa.us>
Envoyé : mercredi 22 janvier 2025 23:18
À : msalais@msym.fr
Cc : 'Rajesh Kumar' <rajeshkumar.dba09@gmail.com>;
pgsql-admin@lists.postgresql.org Objet : Re: Commit with wait event on
advisory lock!

<msalais@msym.fr> writes:
> But my concern here is really to understand in which situations, a
> COMMIT statement can wait on a lock especially that I have no
> triggers, and no deferrable constraints...

The core code does nothing with advisory locks.  If COMMIT is blocking on
one of those, it must be a consequence of user-defined code that is running
at pre-commit time.  You've given us nothing to go on about what that could
be.

> By the way I also have commits which are waiting on ClientRead...

That, on the other hand, is surely impossible.  I think maybe you are
misreading the stats display.  Typically I'd expect that such a case
indicates that the session is idle (awaiting a new command) and the COMMIT
is the last thing it did before that.

            regards, tom lane