Backend problem with large objects - Mailing list pgsql-hackers
| From | Ian Grant |
|---|---|
| Subject | Backend problem with large objects |
| Date | |
| Msg-id | Pine.LNX.3.96.990202105901.2017E-100000@wimp.amtp.cam.ac.uk Whole thread Raw |
| Responses |
Re: [HACKERS] Backend problem with large objects
|
| List | pgsql-hackers |
I am writing a Postgres interface for Guile. (I know, I am the other one
of the two people doing this!)
I sent a message at the weekend, but I used mime encoding of the files
which I understand some people have difficulty decoding, so here is my
report again, in the clear this time.
I am having problems with my large object interface. In particular I get
the error
ERROR: heap_fetch: xinv19073 relation: ReadBuffer(81aeefe) failed
from the backend.
I have written a small C program to reproduce the problem, and it follows
below, along with the output of PQtrace.
In summary, the problem is:
/* Pseudo-C */
conn = PQconnectdb()
PQexec (conn, BEGIN TRANSACTION)
oid = lo_creat (conn, INV_READ | WRITE)
fd = lo_open(conn oid, INV_READ | INV_WRITE)
for (i = 0; i < 5; i++) lo_write(fd, 'X')
lo_lseek(fd, 1, 0)
lo_write(fd, 'y')
lo_lseek(fd, 3, 0)
lo_write(fd, 'y') /**** error happens here ****/
lo_close(fd)
PQexec (conn, END TRANSACTION)
The real C is:
#include <stdio.h>
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"
void exec_cmd(PGconn *conn, char *str);
main (int argc, char *argv[])
{ PGconn *conn; int lobj_fd; char buf[256]; int ret, i; Oid lobj_id;
conn = PQconnectdb("dbname=test"); if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Can't connect to
backend.\n"); fprintf(stderr, "ERROR: %s\n", PQerrorMessage(conn)); exit(1); } exec_cmd(conn, "BEGIN
TRANSACTION"); PQtrace (conn, stdout); if ((lobj_id = lo_creat(conn, INV_READ | INV_WRITE)) < 0) { fprintf(stderr,
"Can'tcreate lobj.\n"); fprintf(stderr, "ERROR: %s\n", PQerrorMessage(conn)); exit(1); } if ((lobj_fd =
lo_open(conn,lobj_id, INV_READ | INV_WRITE)) < 0) { fprintf(stderr, "Can't open lobj.\n"); fprintf(stderr,
"ERROR:%s\n", PQerrorMessage(conn)); exit(1); } fprintf(stderr, "lo_open returned fd = %d.\n", lobj_fd); for (i
=0; i < 5; i++) { if ((ret = lo_write(conn, lobj_fd, "X", 1)) != 1) { fprintf(stderr, "Can't write
lobj.\n"); fprintf(stderr, "ERROR: %s\n", PQerrorMessage(conn)); exit(1); } } if ((ret =
lo_lseek(conn,lobj_fd, 1, 0)) != 1) { fprintf(stderr, "error (%d) lseeking in large object.\n", ret);
fprintf(stderr,"ERROR: %s\n", PQerrorMessage(conn)); exit(1); } if ((ret = lo_write(conn, lobj_fd, "y", 1)) != 1)
{ fprintf(stderr, "Can't write lobj.\n"); fprintf(stderr, "ERROR: %s\n", PQerrorMessage(conn)); exit(1); }
if((ret = lo_lseek(conn, lobj_fd, 3, 0)) != 3) { fprintf(stderr, "error (%d) lseeking in large object.\n", ret);
fprintf(stderr, "ERROR: %s\n", PQerrorMessage(conn)); exit(1); } if ((ret = lo_write(conn, lobj_fd, "y", 1)) !=
1){ fprintf(stderr, "Can't write lobj.\n"); fprintf(stderr, "ERROR: %s\n", PQerrorMessage(conn)); exit(1);
} ret = lo_close(conn, lobj_fd); printf("lo_close returned %d.\n", ret); if (ret) fprintf(stderr, "Error message:
%s\n",PQerrorMessage(conn)); PQuntrace(conn); exec_cmd(conn, "END TRANSACTION"); exit(0);
}
void exec_cmd(PGconn *conn, char *str)
{ PGresult *res;
if ((res = PQexec(conn, str)) == NULL) { fprintf(stderr, "Error executing %s.\n", str); fprintf(stderr,
"Errormessage: %s\n", PQerrorMessage(conn)); exit(1); } if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr,"Error executing %s.\n", str); fprintf(stderr, "Error message: %s\n", PQerrorMessage(conn));
PQclear(res); exit(1); } PQclear(res);
}
Here is a trace-log of the whole affair:
To backend> Q
To backend> select proname, oid from pg_proc where proname = 'lo_open' or proname =
'lo_close' or proname = 'lo_creat' or proname = 'lo_unlink' or proname =
'lo_lseek' or proname = 'lo_tell' or proname = 'loread' o
r proname = 'lowrite'
>From backend> P
>From backend> "blank"
>From backend> T
>From backend (#2)> 2
>From backend> "proname"
>From backend (#4)> 19
>From backend (#2)> 32
>From backend (#4)> -1
>From backend> "oid"
>From backend (#4)> 26
>From backend (#2)> 4
>From backend (#4)> -1
>From backend> D
>From backend (1)> À
>From backend (#4)> 11
>From backend (7)> lo_open
>From backend (#4)> 7
>From backend (3)> 952
>From backend> D
>From backend (1)> À
>From backend (#4)> 12
>From backend (8)> lo_close
>From backend (#4)> 7
>From backend (3)> 953
>From backend> D
>From backend (1)> À
>From backend (#4)> 12
>From backend (8)> lo_creat
>From backend (#4)> 7
>From backend (3)> 957
>From backend> D
>From backend (1)> À
>From backend (#4)> 13
>From backend (9)> lo_unlink
>From backend (#4)> 7
>From backend (3)> 964
>From backend> D
>From backend (1)> À
>From backend (#4)> 12
>From backend (8)> lo_lseek
>From backend (#4)> 7
>From backend (3)> 956
>From backend> D
>From backend (1)> À
>From backend (#4)> 11
>From backend (7)> lo_tell
>From backend (#4)> 7
>From backend (3)> 958
>From backend> D
>From backend (1)> À
>From backend (#4)> 10
>From backend (6)> loread
>From backend (#4)> 7
>From backend (3)> 954
>From backend> D
>From backend (1)> À
>From backend (#4)> 11
>From backend (7)> lowrite
>From backend (#4)> 7
>From backend (3)> 955
>From backend> C
>From backend> "SELECT"
>From backend> Z
>From backend> Z
To backend> F
To backend (4#)> 957
To backend (4#)> 1
To backend (4#)> 4
To backend (4#)> 393216
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 19201
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 952
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 19201
To backend (4#)> 4
To backend (4#)> 393216
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 0
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 956
To backend (4#)> 3
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 4
To backend (4#)> 0
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 0
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 955
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 1
To backend> X
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 1
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 955
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 1
To backend> X
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 1
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 955
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 1
To backend> X
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 1
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 955
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 1
To backend> X
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 1
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 955
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 1
To backend> X
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 1
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 956
To backend (4#)> 3
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 4
To backend (4#)> 1
To backend (4#)> 4
To backend (4#)> 0
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 1
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 955
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 1
To backend> y
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 1
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 956
To backend (4#)> 3
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 4
To backend (4#)> 3
To backend (4#)> 4
To backend (4#)> 0
>From backend> V
>From backend> G
>From backend (#4)> 4
>From backend (#4)> 3
>From backend> 0
>From backend> Z
To backend> F
To backend (4#)> 955
To backend (4#)> 2
To backend (4#)> 4
To backend (4#)> 0
To backend (4#)> 1
To backend> y
>From backend> E
>From backend> "ERROR: heap_fetch: xinv19201 relation: ReadBuffer(81aeefe) failed
"
>From backend> Z
pgsql-hackers by date: