pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Bryce Nesbitt <bryce2@obviously.com>
To: pgsql-sql@postgresql.org
Subject: "<IDLE> in transaction" can't be killed with pg_cancel_backend(). Is it a bug?
Date: Tue, 04 Jan 2011 14:29:37 -0800
Message-ID: <4D239F51.2000102@obviously.com> (raw)

Dear helpful postgres people;

I've got a database deadlock.  The initiating process was "<IDLE> in 
transaction" with PID 2219.
Use of pg_cancel_backend() returns true, but does not actually kill the 
process.

When this happens I kill the PID at the Unix level, which feels sort of 
stupid, like driving on the hood
of a car on the freeway without a safety harness.

Should I expect pg_cancel_backend() to work in a case like this?  If not 
does this sound like a reportable bug?

Also: is there a way I can get the value of $1 in the select for update 
shown below?

-----------------------------------------------------------------------------------------------------------------
# select version();
PostgreSQL 8.3.4 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.1.2 
20061115 (prerelease) (Debian 4.1.1-21)

# select procpid,now()-query_start,usename,substr(current_query,0,1000) 
from pg_stat_activity order by 2 desc;

  procpid |        ?column?         |  usename   |
---------+-------------------------+------------+-------------------------------------------------------------------
    32507 | 22:31:09.736599         | jira       | <IDLE>
     2219 | 04:01:59.139841         | production | <IDLE> in transaction
     3428 | 03:58:06.149227         | production | select object,utf8 
from user_objects where userid = $1 for update
     6574 | 03:46:35.627382         | production | select object,utf8 
from user_objects where userid = $1 for update
     4456 | 02:41:33.680257         | production | <IDLE>
    26217 | 02:26:49.609589         | production | select object,utf8 
from user_objects where userid = $1 for update
    29562 | 02:17:00.434927         | production | select object,utf8 
from user_objects where userid = $1 for update
     2123 | 00:28:04.877832         | production | select object,utf8 
from user_objects where userid = $1 for update
....

=# SELECT l.locktype,c.relname,l.pid,l.mode,granted from pg_locks 
l,pg_class c where l.relation=c.oid order by relname,granted;

  locktype |               relname               |  pid  |       
mode       | granted
----------+-------------------------------------+-------+------------------+---------
  relation | context_keyvals                     |  5841 | 
RowExclusiveLock | t
  relation | context_keyvals_ckey                |  5841 | 
RowExclusiveLock | t
  relation | context_objects                     |  2219 | 
RowShareLock     | t
  relation | context_objects_pkey                |  2219 | 
AccessShareLock  | t
  relation | contexts                            |  2549 | 
AccessShareLock  | t
  relation | contexts                            |  5841 | 
RowShareLock     | t
  relation | contexts_id_key                     |  5841 | 
AccessShareLock  | t
  relation | contexts_pkey                       |  5841 | 
AccessShareLock  | t
  relation | contexts_publication_date_idx       |  5841 | 
AccessShareLock  | t
  relation | contexts_site_key_ct_id_journal_key |  5841 | 
AccessShareLock  | t
  relation | contexts_site_key_ct_type_idx       |  5841 | 
AccessShareLock  | t
  relation | pg_class                            |  3738 | 
AccessShareLock  | t
  relation | pg_class_oid_index                  |  3738 | 
AccessShareLock  | t
  relation | pg_class_relname_nsp_index          |  3738 | 
AccessShareLock  | t
  relation | pg_locks                            |  3738 | 
AccessShareLock  | t
  relation | pg_toast_3794455612                 | 10155 | 
AccessShareLock  | t
  relation | pg_toast_3794455612_index           | 10155 | 
AccessShareLock  | t
  tuple    | user_objects                        | 26217 | 
ExclusiveLock    | f
  tuple    | user_objects                        |  6574 | 
ExclusiveLock    | f
  tuple    | user_objects                        |  2123 | 
ExclusiveLock    | f
  tuple    | user_objects                        | 29562 | 
ExclusiveLock    | f
  relation | user_objects                        |  2123 | 
RowShareLock     | t
  relation | user_objects                        | 26217 | 
RowShareLock     | t
  relation | user_objects                        | 10155 | 
AccessShareLock  | t
  tuple    | user_objects                        |  3428 | 
ExclusiveLock    | t
  relation | user_objects                        |  3428 | 
RowShareLock     | t
  relation | user_objects                        |  6574 | 
RowShareLock     | t
  relation | user_objects                        |  2219 | 
RowShareLock     | t
  relation | user_objects                        | 29562 | 
RowShareLock     | t
  relation | user_objects_pkey                   |  6574 | 
AccessShareLock  | t
  relation | user_objects_pkey                   |  2123 | 
AccessShareLock  | t
  relation | user_objects_pkey                   | 26217 | 
AccessShareLock  | t
  relation | user_objects_pkey                   |  3428 | 
AccessShareLock  | t
  relation | user_objects_pkey                   | 29562 | 
AccessShareLock  | t
  relation | user_objects_pkey                   |  2219 | 
AccessShareLock  | t
  relation | user_objects_pkey                   | 10155 | 
AccessShareLock  | t

# SELECT locktype, mode, granted, schemaname, relname
   FROM pg_locks
   INNER JOIN pg_stat_user_tables
   ON pg_locks.relation = pg_stat_user_tables.relid
   WHERE pg_locks.pid='2219';

  locktype |     mode     | granted | schemaname |     relname
----------+--------------+---------+------------+-----------------
  relation | RowShareLock | t       | public     | context_objects
  relation | RowShareLock | t       | public     | user_objects


# select pg_cancel_backend(2219);
  pg_cancel_backend
-------------------
  t

# SELECT locktype, mode, granted, schemaname, relname
   FROM pg_locks
   INNER JOIN pg_stat_user_tables
   ON pg_locks.relation = pg_stat_user_tables.relid
   WHERE pg_locks.pid='2219';

  locktype |     mode     | granted | schemaname |     relname
----------+--------------+---------+------------+-----------------
  relation | RowShareLock | t       | public     | context_objects
  relation | RowShareLock | t       | public     | user_objects
-----------------------------------------------------------------------------------------------------------------




view thread (4+ messages)  latest in thread

Message-ID: <4D239F51.2000102@obviously.com>
Permalink:  ../4D239F51.2000102@obviously.com/
Also on:    postgresql.org/message-id/4D239F51.2000102@obviously.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: bryce2@obviously.com
  Subject: Re: "<IDLE> in transaction" can't be killed with pg_cancel_backend(). Is it a bug?
  In-Reply-To: <4D239F51.2000102@obviously.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox