7.4RC1 et al: cannot find block containing chunk - Mailing list pgsql-bugs

From greimel@ing.iac.es (Robert Greimel)
Subject 7.4RC1 et al: cannot find block containing chunk
Date
Msg-id 200311091733.hA9HXMnE003254@puppis.ing.iac.es
Whole thread Raw
Responses Re: 7.4RC1 et al: cannot find block containing chunk  (Peter Eisentraut <peter_e@gmx.net>)
Re: 7.4RC1 et al: cannot find block containing chunk  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
============================================================================
                        POSTGRESQL BUG REPORT TEMPLATE
============================================================================


Your name               :       Robert Greimel
Your email address      :       greimel ( at ) ing ( dot ) iac ( dot ) es


System Configuration
---------------------
  Architecture (example: Intel Pentium)         : Intel Pentium
                                                  AMD Athlon

  Operating System (example: Linux 2.0.26 ELF)  : Linux 2.4.18 ELF (RedHat-8)
                                                  Linux 2.4.22 ELF (homegrown)

  PostgreSQL version (example: PostgreSQL-7.3):   PostgreSQL-7.4RC1
                                                  PostgreSQL-7.2.3
                                                  PostgreSQL-7.2.2

  Compiler used (example:  gcc 2.95.2)          : gcc 3.2


Please enter a FULL description of your problem:
------------------------------------------------

7.2.2 and RedHat 8
===================
using PostgreSQL-7.2.2 and several user defined C function - dynamically loaded
from one .so file - I (sometimes) see the following error message doing the
following query:

>psql database
=# SELECT id,deg2ra(ra),deg2dec(dec),frames FROM Fields;
ERROR:  AllocSetFree: cannot find block containing chunk 0x83a5300

Here deg2dec and deg2ra are user functions defined as
CREATE FUNCTION deg2dec(float4) RETURNS text AS '/some/path/coord.so','deg2dec_float4' LANGUAGE C WITH (isStrict);
CREATE FUNCTION deg2dec(float8) RETURNS text AS '/some/path/coord.so','deg2dec_float8' LANGUAGE C WITH (isStrict);
CREATE FUNCTION deg2ra(float4) RETURNS text AS '/some/path/coord.so','deg2ra_float4' LANGUAGE C WITH (isStrict);
CREATE FUNCTION deg2ra(float8) RETURNS text AS '/some/path/coord.so','deg2ra_float8' LANGUAGE C WITH (isStrict);

and ra and dec are defined as REAL in table Fields.

The query
>psql database
=# SELECT id,ra,deg2dec(dec),frames FROM Fields;
  id   |   ra    |    deg2dec    | frames
-------+---------+---------------+--------
 3706  | 99.4405 | -04:16:00.001 | {0}
...
(deg2ra function removed) works. There is only a minute difference in the
code for deg2dec and deg2ra, so I am fairly certain that its not a programming
error on my part - although this is my first go on extending Postgres.

Calling (in a new psql session) the deg2ra function once before the query
>psql database
=# SELECT deg2ra(300);
    deg2ra
--------------
 20:00:00.000
(1 row)
=# SELECT id,deg2ra(ra),deg2dec(dec),frames FROM Fields;
  id   |    deg2ra    |    deg2dec    | frames
-------+--------------+---------------+--------
 3706  | 06:37:45.720 | -04:16:00.001 | {0}
...
makes the query work !!!

7.2.3 and RedHat 8
==================
using PostgreSQL-7.2.3 the same error is produced as in 7.2.2 .

However, the workaround of calling deg2ra before doing the query no longer
works. The single "SELECT deg2ra(300)" works - and I have never seen it fail -
but the table query afterwards produces the AllocSetFree error.

However, explicitly loading the dynamic code makes the query work again:
>psql database
=# LOAD '/some/path/coord.so';
=# SELECT id,deg2ra(ra),deg2dec(dec),frames FROM Fields;
  id   |    deg2ra    |    deg2dec    | frames
-------+--------------+---------------+--------
 3706  | 06:37:45.720 | -04:16:00.001 | {0}
...
works !!!

Interestingly, reversing the columns that call the functions also makes the
query work (this does not need an explicit LOAD or single SELECT before):
>psql database
=# SELECT id,deg2dec(dec),deg2ra(ra),frames FROM Fields;
  id   |    deg2dec    |    deg2ra    | frames
-------+---------------+--------------+--------
 3706  | -04:16:00.001 | 06:37:45.720 | {0}
...
works !!!

7.4RC1 and my own homegrown Linux
=================================
PostgreSQL-7.4RC1 still has the problem, but in a slightly different form.
The error is now

ERROR:  could not find block containing chunk 0x82eff00

This time I also experimented with debug levels. For a straight query there
was a slight difference in the reported error for the different debug levels,
but none worked:

postmaster (without debug, -d 1 and -d 2)
>psql database
=# SELECT id,deg2dec(dec),deg2ra(ra),frames FROM Fields;
ERROR:  could not find block containing chunk 0x82eca00

postmaster (-d 3 and -d 4)
>psql database
=# SELECT id,deg2dec(dec),deg2ra(ra),frames FROM Fields;
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
!> \q

Doing the single SELECT before the query gives also different results depending
on debug level - it works for high debug levels but not for low:

postmaster (without debug, -d 1 and -d 2)
>psql database
=# SELECT deg2ra(300);
    deg2ra
--------------
 20:00:00.000
(1 row)

=# SELECT id,deg2dec(dec),deg2ra(ra),frames FROM Fields;
ERROR:  could not find block containing chunk 0x82eca00


postmaster (-d 3 and -d 4)
>psql database
=# SELECT deg2ra(300);
    deg2ra
--------------
 20:00:00.000
(1 row)

=# SELECT id,deg2dec(dec),deg2ra(ra),frames FROM Fields;
  id   |    deg2ra    |    deg2dec    | frames
-------+--------------+---------------+--------
 3706  | 06:37:45.720 | -04:16:00.001 | {0}
...


Doing the LOAD of the dynamic module explicitly worked for all debug levels.

postmaster (without debug, -d 1, -d 2, -d 3 and -d 4)
>psql database
=# LOAD '/some/path/coord.so';
=# SELECT id,deg2ra(ra),deg2dec(dec),frames FROM Fields;
  id   |    deg2ra    |    deg2dec    | frames
-------+--------------+---------------+--------
 3706  | 06:37:45.720 | -04:16:00.001 | {0}
...

Reversing the column order worked for all debug levels

>psql database
=# SELECT id,deg2dec(dec),deg2ra(ra),frames FROM Fields;
  id   |    deg2dec    |    deg2ra    | frames
-------+---------------+--------------+--------
 3706  | -04:16:00.001 | 06:37:45.720 | {0}
...

Hope this is useful in tracking down the bug - if you need more information,
please email me.

Please describe a way to repeat the problem.   Please try to provide a
concise reproducible example, if at all possible:
----------------------------------------------------------------------

see above.



If you know how this problem might be fixed, list the solution below:
---------------------------------------------------------------------

see above for workarounds.

pgsql-bugs by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: minor: ~ not resolved in psql
Next
From: Micah Yoder
Date:
Subject: Re: The postmaster keeps crashing