Postgres中的“核心”功能

时间:2014-09-23 21:56:12

标签: postgresql

我正在开发一个与Postgres相关的课程项目。我想知道"核心" Postgres服务器使用的功能?我正在寻找一个简单的C程序中与main()对应的东西。我想知道文件路径和函数名称。我正在使用Postgres 9.3.5,但我假设"核心"函数将在不同的修订版本之间保持不变。

如果您对我的问题感到困惑,请告诉我。

感谢。

修改:re-posted this on the pgsql-hackers mailing list

1 个答案:

答案 0 :(得分:6)

我认为您可能正在谈论服务器事件循环。

取决于后端类型。

对于邮寄管理员,它是PostmasterMain(邮件管理员启动)中的src/backend/postmaster/postmaster.c,然后ServerLoop位于同一文件中。

对于PostgresMain中的常规工作人员后端src/backend/tcop/postgres.c

其他后端(如后台编写器,autovacuum启动器等)都有自己的主循环。

你应该从developer information on the PostgreSQL site开始,特别是PostgreSQL文档中讨论PostgreSQL内部的开发人员部分,以及PostgreSQL内部的一系列演示文章和文章。


此外,获得一个支持ctags / cscope支持的优秀文本编辑器,并熟悉gdb之类的调试器。它将使源代码导航并更轻松地逐步执行代码方式。你可以自己回答这个问题,例如:

  • 启动后端并获取其进程ID

    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, buf=buf@entry=0xc3d0a0 <PqRecvBuffer>, n=n@entry=8192, flags=-1, flags@entry=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>, argv=argv@entry=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 (argc=argc@entry=3, argv=argv@entry=0x1d8a2d0) at postmaster.c:1223
    #12 0x00000000004649fb in main (argc=3, argv=0x1d8a2d0) at main.c:227