Я думаю, вы, вероятно, говорите о контуре событий сервера.
Это зависит от типа бэкэнд.
Для почтмейстера это PostmasterMain
в src/backend/postmaster/postmaster.c
(postmaster startup), то ServerLoop
в том же файле.
Для обычных рабочих бэкендов это PostgresMain
в src/backend/tcop/postgres.c
.
Другие бэкенды (например, авторам фона, автовакуумной пусковой установке и т. Д.) Имеют свои собственные основные петли.
На самом деле вы должны начать с developer information on the PostgreSQL site, особенно в разделе разработчика документации PostgreSQL, в которой обсуждаются внутренние функции PostgreSQL, а также ряд презентаций и статей, доступных для внутренних компонентов PostgreSQL.
Кроме того, получить хороший текстовый редактор с поддержкой ctags
/cscope
и ознакомятся с помощью отладчика, как gdb
. Это упростит навигацию по источникам и прохождение кода. Вы могли бы вы ответили на это самостоятельно, например, путем:
Начиная бэкенд и получить его идентификатор процесса
regress=> select pg_backend_pid();
pg_backend_pid
----------------
2292
(1 row)
Прикрепление gdb
sudo -u postgres gdb -p 2292
Получение трассировку
(gdb) bt
#0 0x0000003bc68f5c3d in __libc_recv (fd=10, [email protected]=0xc3d0a0 <PqRecvBuffer>, [email protected]=8192, flags=-1, [email protected]=0) at ../sysdeps/unix/sysv/linux/x86_64/recv.c:29
#1 0x00000000005f95f5 in recv (__flags=0, __n=8192, __buf=0xc3d0a0 <PqRecvBuffer>, __fd=<optimized out>) at /usr/include/bits/socket2.h:44
#2 secure_read (port=0x1db02c0, ptr=0xc3d0a0 <PqRecvBuffer>, len=8192) at be-secure.c:317
#3 0x0000000000602b53 in pq_recvbuf() at pqcomm.c:854
#4 0x00000000006037d5 in pq_getbyte() at pqcomm.c:895
#5 0x00000000006e19a0 in SocketBackend (inBuf=0x7fff2f397b10) at postgres.c:335
#6 ReadCommand (inBuf=0x7fff2f397b10) at postgres.c:483
#7 PostgresMain (argc=<optimized out>, [email protected]=0x1d8b2b8, dbname=0x1d8b120 "regress", username=<optimized out>) at postgres.c:3975
#8 0x0000000000463c51 in BackendRun (port=0x1db02c0) at postmaster.c:4117
#9 BackendStartup (port=0x1db02c0) at postmaster.c:3791
#10 ServerLoop() at postmaster.c:1570
#11 0x00000000006780ee in PostmasterMain ([email protected]=3, [email protected]=0x1d8a2d0) at postmaster.c:1223
#12 0x00000000004649fb in main (argc=3, argv=0x1d8a2d0) at main.c:227
Большое спасибо! – Lemon
@ZackLi Предлагаю ознакомиться с http://www.postgresql.org/docs/current/static/internals.html и https://wiki.postgresql.org/wiki/Developer_FAQ. –