Re: Neuladen von shared objects ???

Lists: Postg무지개 토토SQL : Postg무지개
From: Jessica Ditt <jessica(dot)ditt(at)web(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Neuladen von shared objects ???
Date: 2005-05-27 09:54:32
Message-ID: 1117187672.4649.26.camel@localhost.localdomain
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Hallo Ihr,

zur Zeit schreibe ich C-Funktionen für meinen eigenen Datentyp in
Postgres.

Wenn ich den Quelltext geändert habe, werden diese Änderungen jedoch
nach DROP FUNCTION und erneutem CREATE FUNCTION nicht in der Datenbank
übernommen.

Vielleicht kann mir jemand sagen, wie ich Postgres dazu bringe bei der
erneuten Funktionsdeklaration in die neue .so-Datei zu schauen. Da die
Alte durch die Neue ersetzt wurde, muss Postgres die alte Deklaration ja
irgendwo gespeichert haben...

Mein Workaround CREATE DATABASE / DROP DATABASE ist auf die Dauer eher
etwas nervig, und ich bin mir sicher, dass es einen besseren Weg gibt.
Ich kann ihn nur nicht finden...

Ich freu mich über jeden Hinweis.

Viele Grüße

Jessica


From: Peter Eisentraut <peter_e(at)gmx(dot)net>
To: Jessica Ditt <jessica(dot)ditt(at)web(dot)de>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Neuladen von shared objects ???
Date: 2005-05-27 10:09:55
Message-ID: 200505271209.56070.peter_e@gmx.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Jessica Ditt wrote:
> Vielleicht kann mir jemand sagen, wie ich Postgres dazu bringe bei
> der erneuten Funktionsdeklaration in die neue .so-Datei zu schauen.

Entweder mit dem Befehl LOAD oder einfach neu verbinden.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/


From: Jessica Ditt <jessica(dot)ditt(at)web(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Neuladen von shared objects ???
Date: 2005-05-27 10:32:02
Message-ID: 1117189922.4649.31.camel@localhost.localdomain
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

LOAD war genau das, was ich gesucht hab.
MERCI :)

Am Freitag, den 27.05.2005, 12:09 +0200 schrieb Peter Eisentraut:

> Jessica Ditt wrote:
> > Vielleicht kann mir jemand sagen, wie ich Postgres dazu bringe bei
> > der erneuten Funktionsdeklaration in die neue .so-Datei zu schauen.
>
> Entweder mit dem Befehl LOAD oder einfach neu verbinden.
>


From: Jessica Ditt <jessica(dot)ditt(at)web(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Neuladen von shared objects ???
Date: 2005-05-27 12:41:07
Message-ID: 1117197668.4649.36.camel@localhost.localdomain
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Nachdem ich gerade erst dachte, LOAD würde mein Problem beheben, wurde
ich gerade eines Besseren belehrt.
Trotz erneuten Ladens der shared object-Dateien werden nach wie vor die
alten Funktionen ausgeführt.

Weiß jemand warum?

Am Freitag, den 27.05.2005, 12:09 +0200 schrieb Peter Eisentraut:

> Jessica Ditt wrote:
> > Vielleicht kann mir jemand sagen, wie ich Postgres dazu bringe bei
> > der erneuten Funktionsdeklaration in die neue .so-Datei zu schauen.
>
> Entweder mit dem Befehl LOAD oder einfach neu verbinden.
>


From: Andreas Seltenreich <seltenreich(at)gmx(dot)de>
To: Jessica Ditt <jessica(dot)ditt(at)web(dot)de>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Neuladen von shared objects ???
Date: 2005-05-27 13:31:37
Message-ID: 87acmgn6bq.fsf@gate450.dyndns.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg무지개 토토SQL : Postg무지개

Jessica Ditt schrob:

> Nachdem ich gerade erst dachte, LOAD würde mein Problem beheben, wurde
> ich gerade eines Besseren belehrt.
> Trotz erneuten Ladens der shared object-Dateien werden nach wie vor die
> alten Funktionen ausgeführt.

Hmm, das würde dann allerdings dem Handbuch widersprechen:

<http://www.postgresql.org/docs/current/static/xfunc-c.html#AEN29728>
--8<---------------cut here---------------start------------->8---
After it is used for the first time, a dynamically loaded object file
is retained in memory. Future calls in the same session to the
function(s) in that file will only incur the small overhead of a
symbol table lookup. If you need to force a reload of an object file,
for example after recompiling it, use the LOAD command or begin a
fresh session.
--8<---------------cut here---------------end--------------->8---

Klappt es denn auch nach dem Start einer neuen Session nicht?

Ich kann mir schlecht vorstellen, daß der Fehler dann bei Postgresql
liegt, da über die Sitzungen hinaus IIRC nur der Name der C-Funktion
und der Dateiname der shared Library gespeichert werden. Der alte Code
käme also nur über eine alte shared Library auf der Platte wieder in
den Speicher der nächsten Sitzung.

Bist du sicher, daß die Library auch korrekt neu übersetzt, und an der
richtigen Stelle abgelegt wurde? Möglicherweise ist es doch ein Bug in
deinem Makefile o.ä.? Ist das ganze vielleicht auf einem störrischen
Dateisystem (Samba, NFS, etc)?

Damit jemand versuchen könnte, das Problem zu reproduzieren, müßtest
du wenigstens noch deine Postgres-Version mitteilen.

Gruß
Andreas


From: Peter Wullinger <some-mail-drop(at)gmx(dot)net>
To: Jessica Ditt <jessica(dot)ditt(at)web(dot)de>, pgsql-de-allgemein(at)postgresql(dot)org, seltenreich(at)gmx(dot)de
Subject: Re: Neuladen von shared objects ???
Date: 2005-05-27 17:23:27
Message-ID: 20050527172326.GA3739@peter.home.wul
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

In epistula a Andreas Seltenreich, die horaque Fri, May 27, 2005 at 03:31:37PM +0200:
> Jessica Ditt schrob:
>
> > Nachdem ich gerade erst dachte, LOAD würde mein Problem beheben, wurde
> > ich gerade eines Besseren belehrt.
> > Trotz erneuten Ladens der shared object-Dateien werden nach wie vor die
> > alten Funktionen ausgeführt.
>

Aus Spaß an der Freude hab ich das mal ausprobiert:
PostgreSQL 8.0.4, FreeBSD 5.4-STABLE, ufs (softupdates)

= pgsql_hello_world.c ==
#include "postgres.h"
#include "fmgr.h"

PG_FUNCTION_INFO_V1(hello_world);
Datum
hello_world(PG_FUNCTION_ARGS)
{
elog(NOTICE, "Hello, world, first version!");
PG_RETURN_INT32(0);
}
= pgsql_hello_world.c ==

% gcc -I/<postgres>/include/server -L<postgres>/lib \
-W -Wall -Wl,-shared -o pgsql_notice.so pgsql_notice.c

psql: ~# CREATE OR REPLACE FUNCTION hello_world()
RETURNS INTEGER LANGUAGE 'C' AS
'/tmp/pgsql_hello_world.so', 'hello_world';

psql: ~# select hello_world();
NOTICE: Hello, world, first version!

= pgsql_hello_world.c ==
#include "postgres.h"
#include "fmgr.h"

PG_FUNCTION_INFO_V1(hello_world);
Datum
hello_world(PG_FUNCTION_ARGS)
{
elog(NOTICE, "Hello, world, second version!");
PG_RETURN_INT32(0);
}
= pgsql_hello_world.c ==

% gcc -I/<postgres>/include/server -L<postgres>/lib \
-W -Wall -Wl,-shared -o pgsql_pgsql_notice.so pgsql_hello_world.c

(in derselben Sitzung):
psql: ~# select hello_world();
NOTICE: Hello, world, first version!
psql: ~# LOAD '/tmp/pgsql_hello_world.so';
psql: ~# select hello_world();
NOTICE: Hello, world, second version!

= pgsql_hello_world.c ==
#include "postgres.h"
#include "fmgr.h"

PG_FUNCTION_INFO_V1(hello_world);
Datum
hello_world(PG_FUNCTION_ARGS)
{
elog(NOTICE, "Hello, world, third version!");
PG_RETURN_INT32(0);
}
= pgsql_hello_world.c ==

% gcc -I/<postgres>/include/server -L<postgres>/lib \
-W -Wall -Wl,-shared -o pgsql_pgsql_notice.so pgsql_hello_world.c

(in neuer Sitzung)
psql: ~# select hello_world();
NOTICE: Hello, world, third version!

> Bist du sicher, daß die Library auch korrekt neu übersetzt, und an der
> richtigen Stelle abgelegt wurde? Möglicherweise ist es doch ein Bug in
> deinem Makefile o.ä.? Ist das ganze vielleicht auf einem störrischen
> Dateisystem (Samba, NFS, etc)?

Würde ich auch mal tippen. Wobei ich auch einige Journaling-Dateisysteme
(lacht nicht) zu dem problematischen zählen würde. Dort nimmt man es
mit der Synchronisierbarkeit für Benutzerprogramme oft auch nicht
mehr so genau.

Gruß,
Peter

--
Strebe nicht nach der Gunst der Menge, denn diese ist selten auf
ehrenvolle und rechtmäßige Weise erlangt. Suche stattdessen das
Zeugnis weniger und zähle nicht die Stimmen, sondern gewichte sie.
-- Immanuel Kant


From: Jessica Ditt <jessica(dot)ditt(at)web(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Neuladen von shared objects ???
Date: 2005-05-28 09:02:13
Message-ID: 1117270933.4702.12.camel@localhost.localdomain
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

> Hmm, das würde dann allerdings dem Handbuch widersprechen:

Das Handbuch liegt brav vor mir... Erklären kann ich es mir wie gesagt
auch nicht.

>
> Klappt es denn auch nach dem Start einer neuen Session nicht?

Doch, das schon. Auch wenn ich eine neue Datenbank anlege und dort die
Funktionen deklariere, benutzt er die neue (sprich: aktuelle) Version
der Datei.

>
> Ich kann mir schlecht vorstellen, daß der Fehler dann bei Postgresql
> liegt, da über die Sitzungen hinaus IIRC nur der Name der C-Funktion
> und der Dateiname der shared Library gespeichert werden. Der alte Code
> käme also nur über eine alte shared Library auf der Platte wieder in
> den Speicher der nächsten Sitzung.
>
> Bist du sicher, daß die Library auch korrekt neu übersetzt, und an der
> richtigen Stelle abgelegt wurde? Möglicherweise ist es doch ein Bug in
> deinem Makefile o.ä.? Ist das ganze vielleicht auf einem störrischen
> Dateisystem (Samba, NFS, etc)?

An den Makefiles habe ich nichts geändert, sie liefern auch keine
Fehlerausgaben. Die Dateien liegen lokal auf meinem Rechner vor.

>
> Damit jemand versuchen könnte, das Problem zu reproduzieren, müßtest
> du wenigstens noch deine Postgres-Version mitteilen.

Entschuldigung: ich benutze Version 7.4.5 auf einem Rechner mit Fedora
Core 3 (kernel 2.6.9-1.667)...
Apropos Reproduzierbarkeit: Schlagt mich tot, aber ich kann es selbst
nicht 100%ig reproduzieren....
Die Hello-World Funktion zeigt das Verhalten auf jeden Fall nicht, da
gibt er brav first, second, etc aus...

Woran auch immer das Verhalten bei mir liegt, es ist halt wohl bei mir
so und ich danke Euch für Eure Hinweise & Ratschläge!!

VG, Jessica