Deadlock - Mailing list pgsql-admin

From Benjamin Krajmalnik
Subject Deadlock
Date
Msg-id F4E6A2751A2823418A21D4A160B6898807A6EC@fletch.stackdump.local
Whole thread Raw
In response to Re: stracing a connection  ("Benjamin Krajmalnik" <kraj@illumen.com>)
Responses Re: Deadlock
List pgsql-admin
My aplogies - I forgot to set the subject of the problem I am having
when I got lazy and used "reply".

> -----Original Message-----
> From: pgsql-admin-owner@postgresql.org
> [mailto:pgsql-admin-owner@postgresql.org] On Behalf Of
> Benjamin Krajmalnik
> Sent: Wednesday, August 01, 2007 11:32 AM
> To: pgsql-admin
> Subject: Re: [ADMIN] stracing a connection
>
> I have  ascheduled pgAgent job which runs monthly executing a
> stored procedure which handles some partitoned tables.
> Essentially, it truncated the data in a given partitio and
> then it changes its rules so it will be ready to accept the
> data for its respective next cycle.
>
> The stored procedure follows:
>
>
>
> CREATE OR REPLACE FUNCTION fn_cleardata()
>   RETURNS void AS
> $BODY$
> declare
>        year            integer;
>        month           integer;
>        endmonth        integer;
>        endyear         integer;
>        startoffset     integer;
>        endoffset       integer;
>        currentdate     date;
>        i               integer;
>        tablename       varchar;
>        startday        integer;
>        endday          integer;
>
> begin
>      currentdate := CURRENT_DATE;
>      month := DATE_PART('month', currentdate)-2;
>      year := DATE_PART('year', currentdate);
>
>      if month <=0 then
>         month := month+12;
>      else
>          year := year+1;
>      end if;
>
>      startoffset := ((month-1)*4)+1;
>      endoffset := startoffset+3;
>      startday := 1;
>      endday := 9;
>      endmonth = month;
>      endyear = year;
>
>      for i in startoffset..endoffset loop
>          if i < 10 then
>             tablename := 'tblksdata' || 0 || i;
>          else
>             tablename := 'tblksdata' || i;
>          end if;
>          EXECUTE 'TRUNCATE TABLE '||tablename;
>          EXECUTE 'ALTER TABLE '||tablename||' DROP CONSTRAINT
> '||tablename||'_datecheck';
>          EXECUTE 'ALTER TABLE '||tablename||' ADD CONSTRAINT
> '||tablename||'_datecheck
>                            CHECK (testtime >=
> '''||year||'-'||month||'-'||startday||' 00:00:00''::timestamp
> without time zone
>                            AND testtime <
> '''||endyear||'-'||endmonth||'-'||endday||'
> 00:00:00''::timestamp without time zone)';
>          EXECUTE 'CREATE OR REPLACE RULE '||tablename||'_rl_insert AS
>                            ON INSERT TO tblksdata
>                            WHERE new.testtime >=
> '''||year||'-'||month||'-'||startday||'''::timestamp without time zone
>                            AND new.testtime <
> '''||endyear||'-'||endmonth||'-'||endday||'''::timestamp
> without time zone
>                            DO INSTEAD  INSERT INTO '||tablename||'
> (testtime, replyval, statusid, kstestssysid)
>                            VALUES (new.testtime,
> new.replyval, new.statusid, new.kstestssysid)';
>
>          startday := startday + 8;
>          endday := endday + 8;
>          if startday = 25 then
>             endday = 1;
>             endmonth = endmonth + 1;
>             if endmonth > 12 then
>                endyear := endyear + 1;
>                endmonth := endmonth - 12;
>             end if;
>          end if;
>      end loop;
> end
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE;
> ALTER FUNCTION fn_cleardata() OWNER TO postgres;
>
>
> If I run it manually from pgAdmin during the day it runs fine
> without returning an error.  When it runs scheduled, it is
> returning an error.
>
> At the same time, another function accessing the parent table
> may be running, calculating statistical data for the tests.
> The partition which is truncated and whose constraints and
> rule is being rewritten has data which is beyond the range of
> that in the statistical calculation function, yet I am
> getting a deadlock.  The error in the pgAgent log
> follows:
>
>
> ERROR: deadlock detected
>
> DETAIL: Process 47642 waits for AccessExclusiveLock on
> relation 317009 of database 316900; blocked by process 46648.
>
> Process 46648 waits for RowExclusiveLock on relation 317071
> of database 316900; blocked by process 47642.
>
> CONTEXT: SQL statement "CREATE OR REPLACE RULE
> tblksdata21_rl_insert AS
>
> ON INSERT TO tblksdata
>
> WHERE new.testtime >= '2008-6-1'::timestamp without time zone
>
> AND new.testtime < '2008-6-9'::timestamp without time zone
>
> DO INSTEAD INSERT INTO tblksdata21 (testtime, replyval, statusid,
> kstestssysid)
>
> VALUES (new.testtime, new.replyval, new.statusid, new.kstestssysid)"
>
> PL/pgSQL function "fn_cleardata" line 43 at execute statement
>
> tblksdata  is the parent table.  The functio running against
> it is not updateing any of the data - it is simply
> calculating aggregates for specifc rows (max, min, stddev).
>
> Any suggestions would be appreciated.
> I am running PostgreSQL 8.1.4 on FreeBSD.
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 6: explain analyze is your friend
>

pgsql-admin by date:

Previous
From: "Benjamin Krajmalnik"
Date:
Subject: Re: stracing a connection
Next
From: Carol Walter
Date:
Subject: Re: Raw disk space used