Re: [BUG] calling lo_creat()
"Barnes, Sandy (Sandra)" <Sandy.Barnes@Honeywell.com> writes:
Platform: PostgreSQL 7.0.2 on RedHat6.2 Linux
Test: Testing the creation of large objects. I was putting the large
objects into a database table but this
test program recreates the error for me without having to do that.
Program Error: Can't create large object
Database Log Error: FATAL 1: my bits moved right off the end of the world!
Recreate index pg_attribute_relid_attnum_index
Can anyone else duplicate this? I don't see it on my available boxes
(7.0.2 and current on HPUX and an old Linux box). The test program
is pretty trivial, see attached.
regards, tom lane
/*-------------------------------------------------------------------------
*
* loOid2.c
* test creation of many large objects
*-------------------------------------------------------------------------
*/
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"
static Oid
createOid(PGconn *conn, int i)
{
Oid lobjId;
int lobj_fd;
/*
* create a large object
*/
lobjId = lo_creat(conn, INV_READ | INV_WRITE);
if (lobjId == 0)
{
fprintf(stderr, "can't create large object\n");
exit(1);
}
lobj_fd = lo_open(conn, lobjId, INV_WRITE);
printf("oid [%d] %d\n", lobjId, i);
/* printf("\tfd [%d]", lobj_fd); */
lo_close(conn, lobj_fd);
return lobjId;
}
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int
main(int argc, char **argv)
{
char *database;
Oid lobjOid;
PGconn *conn;
PGresult *res;
int i;
database = argv[1];
/*
* set up the connection
*/
conn = PQsetdb(NULL, NULL, NULL, NULL, database);
/* check to see that the backend connection was successfully made */
if (PQstatus(conn) == CONNECTION_BAD)
{
fprintf(stderr, "Connection to database '%s' failed.\n", database);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
}
res = PQexec(conn, "begin");
PQclear(res);
for (i=0; i<100; i++)
{
lobjOid = createOid(conn, i);
}
res = PQexec(conn, "end");
PQclear(res);
PQfinish(conn);
return 0;
}
Import Notes
Reply to msg id not found: 4B3EBD3B46D7D21194B30008C7B1C76505CA5A82@OLTEX134Reference msg id not found: 4B3EBD3B46D7D21194B30008C7B1C76505CA5A82@OLTEX134
This is not a bug. The problem was that I was not calling lo_unlink() after
consecutive lo_creat(), lo_close() calls. I found this out by looking at
the file system containing the database and seeing hundreds of xinvOID and
xinxOID files. After cleaning up these files I was able to run this program
without error.
Show quoted text
-----Original Message-----
From: Barnes, Sandy (Sandra)
Sent: Tuesday, August 29, 2000 11:06 AM
To: 'pgsql-bugs@postgresql.org'; 'Tom Lane'
Cc: Barnes, Sandy (Sandra)
Subject: [BUG] calling lo_creat()Per Tom's suggestion I am submitting my problem to BUGS email list. Our
project would like to use PostgreSQL in an embedded application that is
highly reliant on creating, storing and accessing large objects. I had
hoped that when lo_creat() returned a zero, I could test for this and call
lo_creat() until a valid oid is returned. The Database log error tells me
to recreate an index. Why ? How?... not sure what to do from here.
Thank you in advance for the time you may spend on this !Platform: PostgreSQL 7.0.2 on RedHat6.2 Linux
Test: Testing the creation of large objects. I was putting the large
objects into a database table but this
test program recreates the error for me without having to do that.
Program Error: Can't create large objectoid [55592] 21
Database Log Error: FATAL 1: my bits moved right off the end of the world!
Recreate index
pg_attribute_relid_attnum_index<< File: testOid2.doc >>
<< File: output.doc >>
Sandy Barnes
email sandy.barnes@honeywell.com
Import Notes
Resolved by subject fallback