BUG #1569: Threads don't see ecpg default connection

Started by Gavin Scottabout 21 years ago4 messagesbugs
Jump to latest
#1Gavin Scott
gavin@ipalsoftware.com

The following bug has been logged online:

Bug reference: 1569
Logged by: Gavin Scott
Email address: gavin@ipalsoftware.com
PostgreSQL version: 8.0.1
Operating system: Fedora Core 3
Description: Threads don't see ecpg default connection
Details:

When using postgresql 8.0 compiled with --enable-thread-safety, new threads
no longer see the default ecpg connection. That was not the case in 7.4.x
compiled with or without --enable-thread-safety.

TEST CASE

The program at the end of this mail sets up a database table named
"dbthreadtest" in the default database. It then spawns 5 threads which each
do a select from that table using the default connection.

If the program is saved as dbthreadtest.pgc, compile with:

ecpg -t -o dbthreadtest.c dbthreadtest.pgc
gcc -Wall -o dbthreadtest dbthreadtest.c -lecpg -lpthread

Results under 7.4.x / 8.0 without --enable-thread-safety:

[gavin@hesse protocol_lib]$ psql --version
psql (PostgreSQL) 7.4.7
contains support for command-line editing
[gavin@hesse protocol_lib]$ ./dbthreadtest
got id = 1
got id = 1
got id = 1
got id = 1
got id = 1

Results under 8.0 with --enable-thread-safety:

[gavin@marquez protocol_lib]$ psql --version
psql (PostgreSQL) 8.0.1
contains support for command-line editing
[gavin@marquez protocol_lib]$ ./dbthreadtest
'No such connection NULL in line 76.', sqlcode = -220 select id

TEST PROGRAM

/* -*-C-*- */

#include <stdlib.h>
#include <pthread.h>

#define CHECK_SQL(fmt, args...) \
do \
{ \
if (sqlca.sqlcode != ECPG_NO_ERROR) \
{ \
fprintf (stderr, "'%s', sqlcode = %ld " fmt "\n", \
sqlca.sqlerrm.sqlerrmc, \
sqlca.sqlcode, ## args); \
exit (1); \
} \
} \
while (0)

#define FATAL(fmt, args...) \
do \
{ \
fprintf (stderr, fmt "\n", ## args); \
exit (1); \
} \
while (0)

pthread_mutex_t global_lock;
pthread_t global_threads[5];

void
setup_db ()
{
exec sql begin declare section;
const char *_user;
exec sql end declare section;

pthread_mutex_lock (&global_lock);

_user = getenv ("LOGNAME");

exec sql connect to :_user;
CHECK_SQL ("connect");

exec sql create table dbthreadtest (id int);
CHECK_SQL ("create dbthreadtest");

exec sql insert into dbthreadtest (id) values (1);
CHECK_SQL ("insert 1");

pthread_mutex_unlock (&global_lock);
}

void
teardown_db ()
{
pthread_mutex_lock (&global_lock);

exec sql drop table dbthreadtest;
CHECK_SQL ("drop dbthreadtest");

exec sql disconnect;
CHECK_SQL ("disconnect");

pthread_mutex_unlock (&global_lock);
}

void *query_db (void *ignorep)
{
exec sql begin declare section;
int _id;
exec sql end declare section;

pthread_mutex_lock (&global_lock);
exec sql select id into :_id from dbthreadtest;
CHECK_SQL ("select id");

fprintf (stdout, "got id = %d\n", _id);
pthread_mutex_unlock (&global_lock);

return NULL;
}

int
main ()
{
int i;

pthread_mutex_init (&global_lock, NULL);

setup_db ();

for (i = 0; i < sizeof (global_threads) / sizeof (global_threads[0]);
++i)
{
if (pthread_create (&global_threads[i], NULL, query_db, NULL))
FATAL ("pthread_create %d failed", i);
}

for (i = 0; i < sizeof (global_threads) / sizeof (global_threads[0]);
++i)
{
if (pthread_join (global_threads[i], NULL))
FATAL ("pthread_join %d failed", i);
}

teardown_db ();

return 0;
}

#2Bruce Momjian
bruce@momjian.us
In reply to: Gavin Scott (#1)
Re: BUG #1569: Threads don't see ecpg default connection

Are you still seeing a failure in ecpg? I ran your test here and got:

got id = 0
got id = 0
got id = 0
got id = 0
got id = 0

This is with thread safety enabled and CVS HEAD, which matches 8.0.X.

---------------------------------------------------------------------------

Gavin Scott wrote:

The following bug has been logged online:

Bug reference: 1569
Logged by: Gavin Scott
Email address: gavin@ipalsoftware.com
PostgreSQL version: 8.0.1
Operating system: Fedora Core 3
Description: Threads don't see ecpg default connection
Details:

When using postgresql 8.0 compiled with --enable-thread-safety, new threads
no longer see the default ecpg connection. That was not the case in 7.4.x
compiled with or without --enable-thread-safety.

TEST CASE

The program at the end of this mail sets up a database table named
"dbthreadtest" in the default database. It then spawns 5 threads which each
do a select from that table using the default connection.

If the program is saved as dbthreadtest.pgc, compile with:

ecpg -t -o dbthreadtest.c dbthreadtest.pgc
gcc -Wall -o dbthreadtest dbthreadtest.c -lecpg -lpthread

Results under 7.4.x / 8.0 without --enable-thread-safety:

[gavin@hesse protocol_lib]$ psql --version
psql (PostgreSQL) 7.4.7
contains support for command-line editing
[gavin@hesse protocol_lib]$ ./dbthreadtest
got id = 1
got id = 1
got id = 1
got id = 1
got id = 1

Results under 8.0 with --enable-thread-safety:

[gavin@marquez protocol_lib]$ psql --version
psql (PostgreSQL) 8.0.1
contains support for command-line editing
[gavin@marquez protocol_lib]$ ./dbthreadtest
'No such connection NULL in line 76.', sqlcode = -220 select id

TEST PROGRAM

/* -*-C-*- */

#include <stdlib.h>
#include <pthread.h>

#define CHECK_SQL(fmt, args...) \
do \
{ \
if (sqlca.sqlcode != ECPG_NO_ERROR) \
{ \
fprintf (stderr, "'%s', sqlcode = %ld " fmt "\n", \
sqlca.sqlerrm.sqlerrmc, \
sqlca.sqlcode, ## args); \
exit (1); \
} \
} \
while (0)

#define FATAL(fmt, args...) \
do \
{ \
fprintf (stderr, fmt "\n", ## args); \
exit (1); \
} \
while (0)

pthread_mutex_t global_lock;
pthread_t global_threads[5];

void
setup_db ()
{
exec sql begin declare section;
const char *_user;
exec sql end declare section;

pthread_mutex_lock (&global_lock);

_user = getenv ("LOGNAME");

exec sql connect to :_user;
CHECK_SQL ("connect");

exec sql create table dbthreadtest (id int);
CHECK_SQL ("create dbthreadtest");

exec sql insert into dbthreadtest (id) values (1);
CHECK_SQL ("insert 1");

pthread_mutex_unlock (&global_lock);
}

void
teardown_db ()
{
pthread_mutex_lock (&global_lock);

exec sql drop table dbthreadtest;
CHECK_SQL ("drop dbthreadtest");

exec sql disconnect;
CHECK_SQL ("disconnect");

pthread_mutex_unlock (&global_lock);
}

void *query_db (void *ignorep)
{
exec sql begin declare section;
int _id;
exec sql end declare section;

pthread_mutex_lock (&global_lock);
exec sql select id into :_id from dbthreadtest;
CHECK_SQL ("select id");

fprintf (stdout, "got id = %d\n", _id);
pthread_mutex_unlock (&global_lock);

return NULL;
}

int
main ()
{
int i;

pthread_mutex_init (&global_lock, NULL);

setup_db ();

for (i = 0; i < sizeof (global_threads) / sizeof (global_threads[0]);
++i)
{
if (pthread_create (&global_threads[i], NULL, query_db, NULL))
FATAL ("pthread_create %d failed", i);
}

for (i = 0; i < sizeof (global_threads) / sizeof (global_threads[0]);
++i)
{
if (pthread_join (global_threads[i], NULL))
FATAL ("pthread_join %d failed", i);
}

teardown_db ();

return 0;
}

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
#3Gavin Scott
gavin@ipalsoftware.com
In reply to: Bruce Momjian (#2)
Re: BUG #1569: Threads don't see ecpg default connection

On Sat, 2005-05-07 at 12:37 -0400, Bruce Momjian wrote:

Are you still seeing a failure in ecpg? I ran your test here and got:

got id = 0
got id = 0
got id = 0
got id = 0
got id = 0

This is with thread safety enabled and CVS HEAD, which matches 8.0.X.

Hi Bruce,

This was fixed by r1.25 of pgsql/src/interfaces/ecpg/ecpglib/connect.c :

----------------------------
revision 1.25
date: 2005/04/14 10:08:57; author: meskes; state: Exp; lines: +24 -7
Added patch by Philip Yarra <philip.yarra@internode.on.net> for a bug in
thread
support.
----------------------------

--
Gavin Scott
gavin@ipalsoftware.com

#4Michael Meskes
meskes@postgresql.org
In reply to: Bruce Momjian (#2)
Re: BUG #1569: Threads don't see ecpg default connection

On Sat, May 07, 2005 at 12:37:24PM -0400, Bruce Momjian wrote:

Are you still seeing a failure in ecpg? I ran your test here and got:
...

Bruce,

this is fixed AFAIK. I just never saw the original post on -bugs and
thus did not answer there either.

Michael

--
Michael Meskes
Email: Michael at Fam-Meskes dot De
ICQ: 179140304, AIM/Yahoo: michaelmeskes, Jabber: meskes@jabber.org
Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!