#c #postgresql #unix #installation #mmap
#c #postgresql #unix #установка #mmap
Вопрос:
Я использую PostgreSQL 9.2.8 на CentOS 5.8.
Создавая свой собственный модуль contrib, я обнаружил, что простое изменение extension_name.so
cp
файла приводит к сбою процесса сервера, но обновление extension_name.so
файла через make amp;amp; make install
работает должным образом.
Это выглядит серьезно, потому что сбой процесса сервера приводит к неожиданному перезапуску кластера.
Это точно так же, как pg_stat_statements
и pg_buffers
в соответствии с моим собственным тестом.
Почему это произошло? Спасибо.
Комментарии:
1. Вы смотрели, что
make install
происходит? Мне кажется, это действительно логичный следующий шаг.
Ответ №1:
В чем разница?
make install
обычно используется install
команда, которая удаляет, а затем повторно создает файл. (Это неверно по своей сути, просто так пишется у большинства людей Makefile
).
Напротив, cp
просто перезаписывает его на месте.
Почему это имеет значение?
Двоичные файлы систем UNIX / Linux mmap
сохраняются в памяти при запуске. Это означает, что содержимое файла, по сути, является прямой частью памяти программы. Поэтому, когда вы перезаписываете содержимое исполняемого двоичного файла во время работы программы, все, вероятно, пойдет бум захватывающим образом.
Напротив, если вы удалите (разорвете связь) файл, он останется отображенным как анонимный файл. Он все еще существует до тех пор, пока не будет закрыт последний дескриптор, у него просто больше нет имени файла. Затем создается новый файл с тем же именем файла, но без изменения содержимого теперь недоступного несвязанного файла. Таким образом, ничего не происходит сбоя — до тех пор, пока у вас нет нескольких экземпляров программ, которые ожидают увидеть одну и ту же версию разделяемой библиотеки, по крайней мере.
Как сделать это правильно?
Если вы настаиваете на замене двоичных файлов запущенных исполняемых файлов, вы должны сделать это с помощью install
команды или с rm /the/path amp;amp; cp /new/file /the/path
последующим любым обязательным chown
и chmod
.
Демонстрация, показывающая разницу
Настройка:
$ echo "whatevs" > blah
$ touch /tmp/blah
Используя install
:
strace -e unlink,open,write install blah /tmp/blah
...
unlink("/tmp/blah") = 0
open("blah", O_RDONLY) = 3
open("/tmp/blah", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
write(4, "whatevsn", 8) = 8
...
против cp
:
$ strace -e unlink,open,write cp blah /tmp/blah
...
open("blah", O_RDONLY) = 3
open("/tmp/blah", O_WRONLY|O_TRUNC) = 4
write(4, "whatevsn", 8) = 8
...
Обратите внимание, как install
unlink
сначала удалить старый файл? Это очень важно.
Другое отличие заключается в том, что install
содержимое других ссылок на тот же базовый файл не изменится, если файл имеет несколько жестких ссылок. cp
будет.