Anomalie #5584
fermé{DB0001} query error : ERROR: duplicate key value violates unique constraint "pg_type_typname_nsp_index" DETAIL: Key (typname, typnamespace)=(session_conf, 43891) already exists.
100%
Pré-créer la table session_conf à l'installation.
Ajouter aussi le "create table if not exists"
Description
Sur un contexte vierge fraîchement installé par le CLI et auquel aucun client Web ne c'est connecté, si plusieurs requêtes sont lancés en //, ces requêtes retournent une erreur "HTTP/1.1 500 Dynacase Uncaugth Exception" et dans le error_log j'ai :
[25-Jun-2015 13:34:06 Europe/Paris] 0) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:770 DbObj::setError()
[25-Jun-2015 13:34:06 Europe/Paris] 1) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:587 DbObj::exec_query()
[25-Jun-2015 13:34:06 Europe/Paris] 2) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:657 DbObj::Create()
[25-Jun-2015 13:34:06 Europe/Paris] 3) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:756 DbObj::tryCreate()
[25-Jun-2015 13:34:06 Europe/Paris] 4) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:217 DbObj::exec_query()
[25-Jun-2015 13:34:06 Europe/Paris] 5) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:146 DbObj::Select()
[25-Jun-2015 13:34:06 Europe/Paris] 6) /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php:307 DbObj::__construct()
[25-Jun-2015 13:34:06 Europe/Paris] 7) /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php:218 Session::newId()
[25-Jun-2015 13:34:06 Europe/Paris] 8) /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php:93 Session::Open()
[25-Jun-2015 13:34:06 Europe/Paris] 9) /var/www/autotest/contexts/document-uis/WHAT/Lib.Main.php:57 Session::Set()
[25-Jun-2015 13:34:06 Europe/Paris] 10) /var/www/autotest/contexts/document-uis/WHAT/Class.ActionRouter.php:21 ::getMainAction()
[25-Jun-2015 13:34:06 Europe/Paris] 11) /var/www/autotest/contexts/document-uis/guest.php:42 ActionRouter::__construct()
[25-Jun-2015 13:34:06 Europe/Paris] {DB0001} query error : ERROR: duplicate key value violates unique constraint "pg_type_typname_nsp_index"
DETAIL: Key (typname, typnamespace)=(session_conf, 43891) already exists.
create table session_conf ( key varchar(50),
val varchar(200))
[25-Jun-2015 13:34:06 Europe/Paris] 0) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:770 DbObj::setError()
[25-Jun-2015 13:34:06 Europe/Paris] 1) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:217 DbObj::exec_query()
[25-Jun-2015 13:34:06 Europe/Paris] 2) /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php:146 DbObj::Select()
[25-Jun-2015 13:34:06 Europe/Paris] 3) /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php:307 DbObj::__construct()
[25-Jun-2015 13:34:06 Europe/Paris] 4) /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php:218 Session::newId()
[25-Jun-2015 13:34:06 Europe/Paris] 5) /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php:93 Session::Open()
[25-Jun-2015 13:34:06 Europe/Paris] 6) /var/www/autotest/contexts/document-uis/WHAT/Lib.Main.php:57 Session::Set()
[25-Jun-2015 13:34:06 Europe/Paris] 7) /var/www/autotest/contexts/document-uis/WHAT/Class.ActionRouter.php:21 ::getMainAction()
[25-Jun-2015 13:34:06 Europe/Paris] 8) /var/www/autotest/contexts/document-uis/guest.php:42 ActionRouter::__construct()
[25-Jun-2015 13:34:06 Europe/Paris] {DB0001} query error : ERROR: relation "session_conf" does not exist
LINE 1: select session_conf.key,session_conf.val from session_conf ...
^
select session_conf.key,session_conf.val from session_conf where session_conf.key=E'MAGIC'
[25-Jun-2015 13:34:06 Europe/Paris] 28238> Dynacase got an uncaught exception 'Dcp\Db\Exception' with message '{DB0001} query error : ERROR: relation "session_conf" does not exist
LINE 1: select session_conf.key,session_conf.val from session_conf ...
^
select session_conf.key,session_conf.val from session_conf where session_conf.key=E'MAGIC'
' in file /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php at line 826:
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #0 /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php(770): DbObj->setError('select session_...')
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #1 /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php(217): DbObj->exec_query('select session_...')
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #2 /var/www/autotest/contexts/document-uis/WHAT/Class.DbObj.php(146): DbObj->Select('MAGIC')
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #3 /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php(307): DbObj->__construct('service='docume...', 'MAGIC')
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #4 /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php(218): Session->newId()
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #5 /var/www/autotest/contexts/document-uis/WHAT/Class.Session.php(93): Session->Open('3')
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #6 /var/www/autotest/contexts/document-uis/WHAT/Lib.Main.php(57): Session->Set('')
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #7 /var/www/autotest/contexts/document-uis/WHAT/Class.ActionRouter.php(21): getMainAction(NULL, NULL)
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #8 /var/www/autotest/contexts/document-uis/guest.php(42): ActionRouter->__construct(Object(Account))
[25-Jun-2015 13:34:06 Europe/Paris] 28238> #9 {main}
[25-Jun-2015 13:34:06 Europe/Paris] 28238> End Of Exception.
Le problème semble provenir du mécanisme d'auto-création des tables :
- N requêtes sont émises
- les N requêtes détectent que la table T n'existe pas
- une des requêtes va alors créer la table T
- les autres requêtes vont faire de même à quelques msec. d'écart et vont alors tomber sur l'erreur que la table T existe déjà
Script de reproduction de l'erreur :
#!/bin/bash
PGSERVICE=$pgservice_core psql -f - <<'EOF' > /dev/null
DROP TABLE sessions;
DROP TABLE session_conf;
EOF
{
curl -s -D - -o /dev/null 'http://localhost/autotest/contexts/document-uis//guest.php?app=DOCUMENT&action=TEMPLATE&part=attribute&subPart=default&bust=1435231231678' &
curl -s -D - -o /dev/null 'http://localhost/autotest/contexts/document-uis//guest.php?app=DOCUMENT&action=TEMPLATE&part=attribute&subPart=default&bust=1435231231678' &
curl -s -D - -o /dev/null 'http://localhost/autotest/contexts/document-uis//guest.php?app=DOCUMENT&action=TEMPLATE&part=attribute&subPart=default&bust=1435231231678' &
} | grep HTTP/1.1
Sortie:
HTTP/1.1 500 Dynacase Uncaugth Exception HTTP/1.1 500 Dynacase Uncaugth Exception HTTP/1.1 200 OK
Mis à jour par Jérôme Augé il y a presque 11 ans
Comme on requiert PostgreSQL >= 9.1, peut-être qu'on peut utiliser la nouvelle syntaxe "CREATE TABLE IF NOT EXISTS ..." introduite pas PostgreSQL 9.1 ?
- http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html
Mis à jour par Marc Claverie il y a plus de 10 ans
- Statut changé de Nouveau à À analyser
- Assigné à mis à Éric Brison
- Version cible mis à 3.2.20
Mis à jour par Éric Brison il y a plus de 10 ans
- Statut changé de À analyser à Assigné
- Assigné à changé de Éric Brison à Jérôme Augé
- Solution proposée mis à jour (diff)
Mis à jour par Jérôme Augé il y a plus de 10 ans
- % réalisé changé de 0 à 100
Sur Pg 9.1, "CREATE TABLE" supporte la construction "IF NOT EXISTS" mais pas les "CREATE INDEX". Comme la propriété `sqlcreate` peut aussi contenir des "CREATE INDEX", il n'est alors pas possible d'utiliser cette construction pour gérer ce problème.
On va donc créer explicitement la table `session_conf` lors de l'installation de l'applicationn CORE.
Mis à jour par Éric Brison il y a plus de 10 ans
- Statut changé de Assigné à Intégré
Appliqué par commit dynacase-core|commit:c300d7c5d7fa791628d376590920ecb1cd703ebb.