Re: The same again with 16.9 : was Re: PostgreSQL 16.6 , query stuck with STAT Ssl, wait_event_type : IPC , wait_event : ParallelFinish

From: Achilleas Mantzios <a(dot)mantzios(at)cloud(dot)gatewaynet(dot)com>
To: Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>, pgsql-admin(at)lists(dot)postgresql(dot)org
Subject: Re: The same again with 16.9 : was Re: PostgreSQL 16.6 , query stuck with STAT Ssl, wait_event_type : IPC , wait_event : ParallelFinish
Date: 2025-08-22 08:54:51
Message-ID: cdd096ef-ccf1-4421-a2a9-059ec6795a2e@cloud.gatewaynet.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-admin


On 8/22/25 09:29, Laurenz Albe wrote:
> On Fri, 2025-08-22 at 09:16 +0100, Achilleas Mantzios wrote:
>> we had the same problem today again.
>>
>> postgres(at)[local]/dynacom=# select * from pg_stat_activity where application_name~*'dbmirr';
>>  -[ RECORD 1 ]----+-----------------------------------------------------------------------------------------------
>> [...]
>>  pid              | 1821681
>> [...]
>>  wait_event_type  | IPC
>>  wait_event       | ParallelFinish
>>  state            | active
>>
>> postgres(at)smadb:~$ ps -u -p 1821681
>>  USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
>>  postgres 1821681  0.5  4.8 37111844 3177260 ?    Ssl  03:58   2:25 postgres: postgres dynacom 10.9.0.10(45051) SELECT
> Did you check whether the Perl function you mentioned before starts threads,
> like Tom suggested? That would be the probable cause, and the solution is
> not to start any threads in a PostgreSQL function.

Hi not att all , here is the code :

Main();

sub Main() {
 my $batchTxMode = 0;

#run the configuration file.
 #if ($#ARGV != 0) {
 if ($#ARGV < 0) {
   die "usage: DBMirror.pl configFile\n";
 }
 elsif ($#ARGV == 1) {
   if ($ARGV[1] eq "batch") { ##run scp at the end of dbmirror.pl main
loop
     $batchTxMode = 1;
   }
   elsif ($ARGV[1] eq "batchall") { ##run scp at the end of dbmirror.sh
wrapper script
     $batchTxMode = 2;
   }
   else {
     die "usage: DBMirror.pl configFile [batch|batchall]\n";
   }
 }
 if( ! defined do $ARGV[0]) {
   logErrorMessage("Invalid Configuration file $ARGV[0]");
   die;
 }

 #my $connectString = "host=$::masterHost dbname=$::masterDb
user=$::masterUser password=$::masterPassword";
 my $connectString = "host=localhost port=6432 dbname=$::masterDb
user=$::masterUser password=$::masterPassword";

 $masterConn = Pg::connectdb($connectString);

 unless($masterConn->status == PGRES_CONNECTION_OK) {
   logErrorMessage("Can't connect to master database\n" .
                   $masterConn->errorMessage);
   die;
 }

 my $setQuery;
 $setQuery = "SET search_path = public; SET application_name =
'DBMIRROR'";
 my $setResult = $masterConn->exec($setQuery);
 if($setResult->resultStatus!=PGRES_COMMAND_OK) {
   logErrorMessage($masterConn->errorMessage . "\n" .
                   $setQuery);
   die;
 }

 my $setQuery2;
 $setQuery2 = "BEGIN";
 my $setResult2 = $masterConn->exec($setQuery2);
 if($setResult2->resultStatus!=PGRES_COMMAND_OK) {
   logErrorMessage($masterConn->errorMessage . "\n" .
                   $setQuery2);
   die;
 }

   setupSlave($::slaveInfo);
#print $::slaveInfo->{"uucpnode"} . "\n";
#LOCK CODE!!!!
   my $pendingLockQuery = "SELECT 1 FROM dbmirror_Pending pd";
   $pendingLockQuery .= " LEFT JOIN dbmirror_MirroredTransaction mt
INNER JOIN";
   $pendingLockQuery .= " dbmirror_MirrorHost mh ON mt.MirrorHostId = ";
   $pendingLockQuery .= " mh.MirrorHostId AND mh.HostName=";
   $pendingLockQuery .= " '$::slaveInfo->{\"slaveHost\"}' ";
   $pendingLockQuery .= " ON pd.XID";
   $pendingLockQuery .= " = mt.XID WHERE mt.XID is null and (pd.slaveid
is null or pd.slaveid = '$::slaveInfo->{\"MirrorHostId\"}') ";
   $pendingLockQuery .= " FOR UPDATE OF pd ";

   my $pendingLockResults = $masterConn->exec($pendingLockQuery);
   unless($pendingLockResults->resultStatus==PGRES_TUPLES_OK) {
     logErrorMessage("Can't query pending table\n" .
$masterConn->errorMessage);
     die;
   }
#END LOCK CODE!!!!

   #Obtain a list of pending transactions using ordering by our
approximation
   #to the commit time.  The commit time approximation is taken to be the
   #SeqId of the last row edit in the transaction.
   my $pendingTransQuery = "SELECT pd.XID,MAX(SeqId) FROM
dbmirror_Pending pd";
   $pendingTransQuery .= " LEFT JOIN dbmirror_MirroredTransaction mt
INNER JOIN";
   $pendingTransQuery .= " dbmirror_MirrorHost mh ON mt.MirrorHostId = ";
   $pendingTransQuery .= " mh.MirrorHostId AND mh.HostName=";
   $pendingTransQuery .= " '$::slaveInfo->{\"slaveHost\"}' ";
   $pendingTransQuery .= " ON pd.XID";
   $pendingTransQuery .= " = mt.XID WHERE mt.XID is null and
(pd.slaveid is null or pd.slaveid = '$::slaveInfo->{\"MirrorHostId\"}') ";
   $pendingTransQuery .= " GROUP BY pd.XID ";
   $pendingTransQuery .= " ORDER BY MAX(pd.SeqId)";

It got stuck inside the second query, after the FOR UPDATE locking .

I attach the client program, just for completeness. It just queries the
three tables :

- dbmirror_pending

- dbmirror_mirroredtransaction

- dbmirror_mirrorhost

first it tries do lock via FOR UPDATE , then queries the tables again.

>
> Yours,
> Laurenz Albe

Attachment Content-Type Size
AsyncMirrorWithSpecialTablesFastIIEsc.pl application/x-perl 27.8 KB

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Holger Jakobs 2025-08-22 12:42:33 Installing from PostgreSQL APT repository on Debian 13 (Trixie)
Previous Message Laurenz Albe 2025-08-22 08:29:54 Re: The same again with 16.9 : was Re: PostgreSQL 16.6 , query stuck with STAT Ssl, wait_event_type : IPC , wait_event : ParallelFinish