Discussion:
User defined type in C
(too old to reply)
Armel HERVE
2004-05-10 10:20:31 UTC
Permalink
Hi everybody,

Sorry if it's not the good forum and for my poor English.

I'm trying to create a new type in C for postgreSQL (7.3.4).
This type is a structure of 4 fields including a variable length field.

When I try to insert record ino a table using this type, postgre server
crashes:
LOG: server process (pid 10838) was terminated by signal 11
LOG: terminating any other active server processes
WARNING: Message from PostgreSQL backend:
The Postmaster has informed me that some other backend
died abnormally and possibly corrupted shared memory.
I have rolled back the current transaction and am
going to terminate your database system connection and exit.
Please reconnect to the database system and repeat your query.
WARNING: Message from PostgreSQL backend:
The Postmaster has informed me that some other backend
died abnormally and possibly corrupted shared memory.
I have rolled back the current transaction and am
going to terminate your database system connection and exit.
Please reconnect to the database system and repeat your query.
WARNING: Message from PostgreSQL backend:
The Postmaster has informed me that some other backend
died abnormally and possibly corrupted shared memory.
I have rolled back the current transaction and am
going to terminate your database system connection and exit.
Please reconnect to the database system and repeat your query.
LOG: all server processes terminated; reinitializing shared memory and
semaphores
LOG: database system was interrupted at 2004-05-10 12:25:55 CEST
LOG: checkpoint record is at 0/627BE1DC
LOG: redo record is at 0/627BE1DC; undo record is at 0/0; shutdown TRUE
LOG: next transaction id: 2026530; next oid: 342157
LOG: database system was not properly shut down; automatic recovery in
progress
LOG: redo starts at 0/627BE21C
LOG: ReadRecord: record with zero length at 0/627DD5F4
LOG: redo done at 0/627DD5D0
LOG: database system is ready


Does anybody can help me ???
Thanks for your answers,



Armel HERVE




This is the C code:
#include "postgres.h"

#define KEY_SIZE 31

typedef struct {
int4 globalSize;
int64 fileSize;
char fileKey[KEY_SIZE + 1];
char fileName[1];
} Psfile;

#define PSFILE_BASIC_SIZE (4 + sizeof(int64) + KEY_SIZE + 1)

/**
*
* char *str : string representation of a psfile.
* must be formatted as follow :
* xxx,yyy,zzz
* with xxx : the name of the file
* yyy : the size of the file
* zzz : the key associated with the file.
*/
Psfile *psfile_in(char *str) {
Psfile *retValue = NULL;

int nameSize = 0;

// In first, we look for the size of the name
for(nameSize = 0; str[nameSize] != ',' && str[nameSize] != 0;
nameSize++) {
// Nothing to do in this block...
}

if(str[nameSize] == 0) {
// We are at the end of the string... Something is wrong!!
elog(ERROR, "psfile_in: string representation of a psfile :
name,size,key \"%s\"", str);
return NULL;
}

// Now, we have the size, so we can allocate memory for the global
structure
retValue = (Psfile *)palloc(PSFILE_BASIC_SIZE + nameSize + 1);

char format[15];
sprintf(format, "%%%ds,%%li,%%s", nameSize);

char *fileName = retValue->fileName;
char *fileKey = retValue->fileKey;
int64 *fileSize = &(retValue->fileSize);

if(sscanf(str, format, fileName, fileSize, fileKey) != 3) {
// Something is wrong : the number of parameters found must
be 3
pfree(retValue);
elog(ERROR, "psfile_in: string representation of a psfile :
name,size,key \"%s\"", str);
return NULL;
}

return retValue;
}

char *psfile_out(Psfile *psfile) {
elog(LOG, "psfile_out");
if(psfile == NULL) return NULL;

char *retValue = NULL;

char size[30];
sprintf(size, "%ld", psfile->fileSize);

retValue = (char *)palloc(strlen(psfile->fileName) + 1 +
strlen(size) + 1 + strlen(psfile->fileKey) + 1);

sprintf(retValue, "%s,%s,%s", psfile->fileName, size,
psfile->fileKey);

return retValue;
}

And this is the type declaration :
CREATE FUNCTION psfile_in(cstring)
RETURNS psfile
AS '/usr/include/pgsql/server/pslib/pslib'
LANGUAGE C IMMUTABLE STRICT;

CREATE FUNCTION psfile_out(psfile)
RETURNS cstring
AS '/usr/include/pgsql/server/pslib/pslib'
LANGUAGE C IMMUTABLE STRICT;

CREATE TYPE psfile(
internallength = valiable,
input = psfile_in,
output = psfile_out,
alignment = int4
);






---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend
Tom Lane
2004-05-10 11:50:35 UTC
Permalink
Post by Armel HERVE
I'm trying to create a new type in C for postgreSQL (7.3.4).
This type is a structure of 4 fields including a variable length field.
Variable-size values must start with an integer indicating their total
size (this count must include itself, btw). Perhaps your globalSize
field is intended to serve that purpose, but if so, you forgot to set it.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend
Armel HERVE
2004-05-10 12:22:14 UTC
Permalink
You're right... I'm confuse...
I'm sorry, it's the bug which I'm looking for a while...

Thanks

Armel


-----Message d'origine-----
De : Tom Lane [mailto:***@sss.pgh.pa.us]
Envoyé : lundi 10 mai 2004 13:51
À : Armel HERVE
Cc : pgsql-***@postgresql.org
Objet : Re: [ADMIN] User defined type in C
Post by Armel HERVE
I'm trying to create a new type in C for postgreSQL (7.3.4).
This type is a structure of 4 fields including a variable length field.
Variable-size values must start with an integer indicating their total
size (this count must include itself, btw). Perhaps your globalSize
field is intended to serve that purpose, but if so, you forgot to set it.

regards, tom lane


---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faqs/FAQ.html
Steve Lane
2004-05-12 18:39:08 UTC
Permalink
Hello all:

I have a customer with an application in production (postgres + php +
apache) where we began seeing a number of scary messages in the logs. (It's
postgres 7.2.1, by the way).

Generally the messages seem to point to resource starvation of some kind:

FATAL 1: out of free buffers: time to abort !


And

Sorry, too many clients already

Also some messages indicating shared memory had been corrupted. I shut down
and ran ipcclean and those messages are gone. I also boosted shared-buffers
considerably and the "out of free buffers" message is also gone.

BUT, the "sorry too many clients" message persists. The app has a spike-y
usage pattern, i.e. A large number of students sits down at once and takes a
survey in accordance with verabl instructions from the front of the
classroom, so many of them are hitting the proverbial Submit button at once.

I tried increasing max_clients, but got a message to the effect that SHMMIN
was set incorrectly on my machine ...

Let me get to my actual question (none of the above contains the question
yet :->).

Is there any guideline as to how much free RAM I need per client connection?
I think I understand that things like sort_mem play into this -- that's set
low and should remain so. But for Apache, for example, I think of 10 meg per
connection. Any similar rule of thumb for postgres?

I'll follow up as I inspect the logs, but I haven't thoroughly sifted them.
So for my now my question is the one about RAM per connection. Any
thoughts'd be much appreciated.

-- sgl


=======================================================
Steve Lane

Vice President
The Moyer Group
14 North Peoria St Suite 2H
Chicago, IL 60607

Voice: (312) 433-2421 Email: ***@moyergroup.com
Fax: (312) 850-3930 Web: http://www.moyergroup.com
=======================================================


---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend
Tom Lane
2004-05-12 20:13:37 UTC
Permalink
Post by Steve Lane
I have a customer with an application in production (postgres + php +
apache) where we began seeing a number of scary messages in the logs. (It's
postgres 7.2.1, by the way).
^^^^^^^^^^^^^^

Reading the CVS logs for post-7.2.1 bug fixes will curl your toes.
You're irresponsible to still be running production data on that
version. Move up to 7.2.4 before you find out the hard way.
Post by Steve Lane
I tried increasing max_clients, but got a message to the effect that SHMMIN
was set incorrectly on my machine ...
I'd expect SHMMAX to be the issue not SHMMIN. It's set very
conservatively on many platforms, and you should not be afraid to raise
it.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
joining column's datatypes do not match
Steve Lane
2004-05-13 00:15:43 UTC
Permalink
Date: Wed, 12 May 2004 16:13:37 -0400
Subject: Re: [ADMIN] RAM usage per connection
Post by Steve Lane
I have a customer with an application in production (postgres + php +
apache) where we began seeing a number of scary messages in the logs. (It's
postgres 7.2.1, by the way).
^^^^^^^^^^^^^^
Reading the CVS logs for post-7.2.1 bug fixes will curl your toes.
You're irresponsible to still be running production data on that
version. Move up to 7.2.4 before you find out the hard way.
I spoke too hastily. It's 7.1.3. Which probably doesn't make it better :-(
Post by Steve Lane
I tried increasing max_clients, but got a message to the effect that SHMMIN
was set incorrectly on my machine ...
I'd expect SHMMAX to be the issue not SHMMIN. It's set very
conservatively on many platforms, and you should not be afraid to raise
it.
I was also puzzled to see the reference to SHMMIN. I'll look again.

-- steve


---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to ***@postgresql.org)
Loading...