Сценарий 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¶
- “Какова основная архитектура?”
- “Где определена функция [function_name]?”
- “Кто вызывает функцию [function_name]?”
- “Что делает модуль [module_name]?”
- “Покажи связь между X и Y”
Советы¶
- Начинайте с общих вопросов, затем углубляйтесь
- Используйте граф вызовов, чтобы понять зависимости
- Задавайте вопросы о потоке данных, чтобы понять взаимодействие компонентов
- Сохраняйте сессию с помощью
/saveдля дальнейшего использования
Связанные сценарии¶
- Разработка функций — Когда вы уже понимаете кодовую базу
- Отладка — Для устранения неполадок
- Архитектура — Для более глубокого понимания архитектуры