Сценарий 01: Ввод нового разработчика

Сценарий 01: Ввод нового разработчика

Новый разработчик присоединяется к команде и должен быстро понять структуру кодовой базы.

Быстрый старт

# Выберите сценарий ввода
/select 01

Примеры использования

День 1: Обзор кодовой базы

Задайте общие вопросы о системе:

> Что такое подсистема исполнителя (executor)?

╭─────────────── Ответ ────────────────╮
│ Подсистема исполнителя отвечает за  │
│ выполнение планов запросов,          │
│ сгенерированных планировщиком.       │
│                                      │
│ Основные компоненты:                 │
│   - ExecutorStart: Инициализация     │
│   - ExecutorRun: Основной цикл       │
│   - ExecutorEnd: Освобождение ресурсов│
│                                      │
│ Точка входа: src/backend/executor/   │
│              execMain.c              │
╰──────────────────────────────────────╯

> Каковы основные точки входа в подсистему исполнителя?

> Покажи архитектуру выполнения запросов

Поиск определений функций

Быстро находите реализации функций:

> Где определена функция palloc?

╭─────────────── Ответ ────────────────╮
│ palloc определена в:                 │
│   src/backend/utils/mmgr/mcxt.c:1089 │
│                                      │
│ Сигнатура:                           │
│   void *palloc(Size size)            │
│                                      │
│ Связанные функции:                   │
│   palloc0(), palloc_extended(),      │
│   repalloc(), pfree()                │
╰──────────────────────────────────────╯

Понимание графа вызовов

> Покажи все места, где вызывается palloc

╭─────────────── Вызывающие функции ──────────────╮
 1. heap_form_tuple()                           
 2. ExecStoreTuple()                            
 3. construct_array()                           
 4. pnstrdup()                                  
 5. SPI_connect()                               
 ... (показано первые 5 из 2 847 вызывающих)    
╰────────────────────────────────────────────────╯

> Какие функции вызывает LWLockAcquire?

Отслеживание потока данных

> Как проходят данные от pg_parse_query до исполнителя?

╭─────────────── Поток данных ─────────────╮
│ pg_parse_query()                         │
│     ↓                                    │
│ pg_analyze_and_rewrite()                 │
│     ↓                                    │
│ pg_plan_queries()                        │
│     ↓                                    │
│ PortalRun()                              │
│     ↓                                    │
│ ExecutorRun()                            │
│     ↓                                    │
│ ExecProcNode()                           │
╰──────────────────────────────────────────╯

Понимание управления памятью

> Как работает выделение памяти в PostgreSQL?

╭─────────────── Ответ ────────────────╮
│ PostgreSQL использует контексты      │
│ памяти для иерархического управления│
│ памятью:                             │
│                                      │
│ Основные функции:                    │
│   palloc()  - Выделение памяти       │
│   pfree()   - Освобождение памяти    │
│   MemoryContextCreate() - Новый контекст │
│   MemoryContextReset()  - Массовое освобождение │
│                                      │
│ Основные контексты:                  │
│   TopMemoryContext - Корневой контекст │
│   CurrentMemoryContext - Текущий контекст │
│   MessageContext - Контекст на сообщение │
╰──────────────────────────────────────╯

Примеры вопросов на День 1

  1. “Какова основная архитектура?”
  2. “Где определена функция [function_name]?”
  3. “Кто вызывает функцию [function_name]?”
  4. “Что делает модуль [module_name]?”
  5. “Покажи связь между X и Y”

Советы

  • Начинайте с общих вопросов, затем углубляйтесь
  • Используйте граф вызовов, чтобы понять зависимости
  • Задавайте вопросы о потоке данных, чтобы понять взаимодействие компонентов
  • Сохраняйте сессию с помощью /save для дальнейшего использования

Связанные сценарии