Summary: | Error:undefined symbol: RelationUsesTempNamespace when 1C create database | ||
---|---|---|---|
Product: | Postgres@Etersoft | Reporter: | capitan <bla-bla-bla> |
Component: | пакеты | Assignee: | Станислав Коробейников <stas> |
Status: | CLOSED FIXED | QA Contact: | Konstantin Artyushkin <akv> |
Severity: | critical | ||
Priority: | P4 | CC: | akv, lav |
Version: | не указана | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Linux | ||
Whiteboard: | |||
Заявки RT: | 40385 | Связано с: | |
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 11144 | ||
Deadline: | 2015-10-07 |
Description
capitan
2014-05-29 16:20:15 MSK
Откладываем задачи, к которым не обращались более 100 дней. Беглый поиск по коду версии 9.2.14 не нашёл определение этого макроса $ack RelationUsesTempNamespace ./* rebased [0ca422f] contrib/fasttrun/fasttrun.c 47: if ( !RelationUsesTempNamespace(rel) ) ==== Согласно заявке 40385 без него Ubuntu ругается: ERROR: could not load library /usr/lib/x86_64-linux-gnu/postgresql/fasttrun.so undefined В postgres с tag REL9_2_1 в файле rel.h есть макрос: /* * RelationUsesTempNamespace * True if relation's catalog entries live in a private namespace. */ #define RelationUsesTempNamespace(relation) \ ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP) В commit'е fe2ef429a19b25903438b882ce16617a6e700d0f (Fix failure to ignore leftover temp tables after a server crash.) он удаляется. При этом используется другая конструкция: - if (RelationUsesTempNamespace(rel)) + if (isTempOrToastNamespace(rel->rd_rel->relnamespace)) функция isTempOrToastNamespace находится в следующих файлах src/include/catalog/namespace.h src/backend/catalog/namespace.c заголовок и реализация соответственно. Но пока я не разобрался с ситуацией в gitum'е. Там вроде бы макрос ещё есть. А если нет, то как тогда собралось и слинковалось. А если есть, то в что вызывает ошибку. Нужно прокосультироваться с akv (Ответ Станислав Коробейников на комментарий4)
> В postgres с tag REL9_2_1 в файле rel.h есть макрос:
> /*
> * RelationUsesTempNamespace
> * True if relation's catalog entries live in a private namespace.
> */
> #define RelationUsesTempNamespace(relation) \
> ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
>
> В commit'е fe2ef429a19b25903438b882ce16617a6e700d0f (Fix failure to ignore
> leftover temp tables after a server crash.) он удаляется. При этом
> используется другая конструкция:
> - if (RelationUsesTempNamespace(rel))
> + if (isTempOrToastNamespace(rel->rd_rel->relnamespace))
> функция isTempOrToastNamespace находится в следующих файлах
> src/include/catalog/namespace.h
> src/backend/catalog/namespace.c
> заголовок и реализация соответственно.
>
> Но пока я не разобрался с ситуацией в gitum'е. Там вроде бы макрос ещё есть.
> А если нет, то как тогда собралось и слинковалось. А если есть, то в что
> вызывает ошибку. Нужно прокосультироваться с akv
Посмотрел по истории веток rebased, upstream и mainline.
В ветке upstream нет папки contrib и всего туда входящего.
В коммите fe2ef429a19b25903438b882ce16617a6e700d0f действительно происходит глобальная замена макроса на функцию isTempOrToastNamespace(rel->rd_rel->relnamespace). Что не было выполнено в файлах из папки contrib.
Почему собралось без ругани - загадка. В spece сборки не нашёл никаких ignore на проблемы линковки.
contrib'ы собираются с флагом shared, и при такой сборки gcc -I../../src/include -fpic -c -o fasttrun.o fasttrun.c gcc -fpic -shared -o fasttrun.so fasttrun.o можно собрать foo(bar()); и получить только два варнинга: fasttrun.c:38:2: warning: implicit declaration of function ‘foo’ [-Wimplicit-function-declaration] foo(bar()); ^ fasttrun.c:38:6: warning: implicit declaration of function ‘bar’ [-Wimplicit-function-declaration] foo(bar()); ^ Заменил - if (RelationUsesTempNamespace(rel)) на + if (isTempOrToastNamespace(rel->rd_rel->relnamespace)) варнинги сборки исчезли. Написал скрипт, который проходится по файлам sql в /usr/share/postgresql/extension и /usr/share/postgresql/contrib и выполняет. Т.е. должны ставиться все расширения. Ошибка в contrib'е нашлась. Пока не собрался postgres для p7 собрал на builder'е, и поставил с no-deps, эта ошибка ушла. Но из-за несовпадения версий libicu в p7 и сизифе появились другие. (Ответ Станислав Коробейников на комментарий6) > contrib'ы собираются с флагом shared, и при такой сборки > gcc -I../../src/include -fpic -c -o fasttrun.o fasttrun.c > gcc -fpic -shared -o fasttrun.so fasttrun.o > > можно собрать foo(bar()); и получить только два варнинга: > > fasttrun.c:38:2: warning: implicit declaration of function ‘foo’ > [-Wimplicit-function-declaration] > foo(bar()); добавить -Werror=implicit-function-declaration ? https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html (In reply to Vitaly Lipatov from comment #7) > добавить -Werror=implicit-function-declaration ? > https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html попробовал в spec добавить: %add_optflags -Werror=implicit-function-declaration макрос должен добавлять CFLAGS в configure. не получилось. Не проходит проверку: checking whether long long int is 64 bits... no дело в том, что для проверки используется программа из config/c-compiler.m4 main() { exit(! does_int64_work()); } при этом, похоже, stdlib.h не инклудится. Т.е. и возникает тот самый варнинг, который делается ошибкой. добавил для сборки contrib и contrib/xml таким образом: %make_build -C contrib all CFLAGS="%optflags -Werror=implicit-function-declaration" всё прошло хорошо. Закрываю до сборки собралось ошибка не воспроизводится, всё хорошо, закрываю ошибка не воспроизводится, всё хорошо, закрываю Конкретно эту ошибку можно тестировать следующим образом createdb -U postgres test psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql >> test.log || echo "error in $filedb". dropdb -U postgres test Т.е. так: Конкретно эту ошибку можно тестировать следующим образом createdb -U postgres test psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql dropdb -U postgres test (Ответ Станислав Коробейников на комментарий14)
> Т.е. так:
> Конкретно эту ошибку можно тестировать следующим образом
> createdb -U postgres test
> psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql
> dropdb -U postgres test
Что-то я не понял с какой версией мы работаем. В названии баги 9.2.4.
А мы с тобой вроде о 9.2.14 говорили. Пакеты source для версии 9.2.4 имеют дату правки за 2013 год. А вот 9.2.14 вроде свежие.
С 9.2.4 вообще что-то непонятное происходит:
Createdb -U postgres test
createdb: не удалось подключиться к базе template1: ?????: ???????????? "postgres" ?? ?????? ???????? ??????????? (Peer)
#epmqp postgre
postgre-etersoft9.2-9.2.4-eter2ubuntu
postgre-etersoft9.2-contrib-9.2.4-eter2ubuntu
postgre-etersoft9.2-seltaaddon-9.2.4-eter2ubuntu
postgre-etersoft9.2-server-9.2.4-eter2ubuntu
--------
В 9.2.1 ошибка уже с переводом на русский язык
createdb -U postgres test
createdb: не удалось подключиться к базе template1: ВАЖНО: пользователь "postgres" не прошёл проверку подлинности (Peer)
--------
Пока ещё не нашёл в чём причина или что я не донастроил.
(In reply to Konstantin Artyushkin from comment #15) > Что-то я не понял с какой версией мы работаем. В названии баги 9.2.4. > А мы с тобой вроде о 9.2.14 говорили. Сейчас речь идёт о 9.2.14. Нужно что бы эта версия заработала > createdb: не удалось подключиться к базе template1: ВАЖНО: пользователь > "postgres" не прошёл проверку подлинности (Peer) в pg_hba.conf нужно поставить local ...... trust http://wiki.etersoft.ru/PostgreSQL#.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0_PostgreSQL Проверил всё работает: $createdb -U postgres test $ psql -U postgres -d test -f /usr/share/postgresql/contrib/fasttrun.sql BEGIN CREATE FUNCTION COMMIT $ dropdb -U postgres test |