[PostgreSQL] main 함수

PostgreSQL의 main 함수 분석 (src/backend/main/main.c)


main 함수에서 호출하는 함수

  • get_progname(argv[0])
    • 디렉토리 경로, 확장자를 제외한 프로그램 이름을 반환한다
  • startup_hacks(progname)
    • 어떤 종류의 서버 프로세스의 생성보다 전에 해야 할 작업을 진행한다
    • 실질적으로는 Windows환경에서의 C runtime에 대한 설정을 진행한다
  • save_ps_display_args(argc, argv)
    • argv가 가리키는 공간에 저장된 제이터가 이후에 ps_display 의 동작에 의해 덮어써질 수 있기 때문에 그 데이터들을 안전한 곳으로 복사한다
  • MemoryContextInit()
    • 에러, 메모리 관리 시스템 초기화(fireup)
    • 이 함수가 반환한 이후에는 elog/ereport를 사용할 수 있다
    • 단, GUC가 로드되기 전까지는 메세지들이 stderr에만 출력된다
  • set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("postgres"))
    • locale 정보 초기화
  • init_locale
    • 인자를 바꿔가며 4번 연속으로 호출한다
    • LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME
    • 일부 C 함수들은 locale 정보에 의해 출력하거나 데이터 처리 방식이 달라진다
  • unsetenv("LC_ALL")
    • 위에서 locale 정보를 충분히 설정했기 때문에 기존의 locale 설정을 지운다
    • 환경변수를 삭제한다
  • check_root(progname)
    • PostgreSQL이 루트 권한으로 실행된 경우 의도되지 않았다면 종료한다
    • 루트 권한으로 실행 가능한 경우는 아래의 경우이다. 이 두 경우는 read-only 작업만을 수행하기 때문에 루트 권한으로 실행되어도 안전하다
    • argv[1] : --describe-config
    • argv[1] : -C
  • 첫 번째 cli argument에 따라 다양한 subprogram으로 분기한다
    • --check : BootstrapModeMain(argc, argv, true)
    • --boot : BootstrapmasterMain(artc, argv)
    • --forkchild : SubPostmasterMain(argc, argv)
    • --describe-config : GucInfoMain
    • --single : PostgresSingleUserMain(argc, argv, strdup(get_user_name_or_exit(program)))
    • else : PostmasterMain
    • 위의 함수들은 반환하지 않는다
  • abort()

postmaster 프로세스

  • postmaster는 여러 명이 접속 가능한 PostgreSQL DB server이다
  • 클라이언트가 데이터베이스에 접속하려면 반드시 필요하다
  • postmain 프로세스는 postgres 프로세스를 실행시킨다
    • postgres 프로세스에서 클라이언트의 연결(connection)을 처리한다
    • postmain 프로세스는 서버 프로세스들 사이의 통신을 관리한다
  • foreground 프로세스로 실행되는게 기본이지만 백그라운드 프로세스로 실행도 가능하다

references