Назад к блогу

Реверты в Postgres 19: что удалили из релиза и почему это связывают с перегрузкой ревью

Реверты в Postgres 19: что удалили из релиза и почему это связывают с перегрузкой ревью

В преддверии выхода PostgreSQL 19 из релиза были отозваны уже принятые возможности — графовые запросы SQL/PGQ, конструкция GROUP BY ALL и функции интроспекции DDL, причём откат одного из них развернул сразу 47 коммитов. Эти события обнажили системную проблему: дефицит ревьюеров приводит к тому, что патчи попадают в дерево без должной проверки и вскрываются лишь на поздних стадиях цикла. Разбор показывает, как устроен процесс приёма патчей в сообществе и почему цена позднего ревью оказывается слишком высокой.

За несколько недель до выхода Postgres 19 Beta 4 коммиттеры откатили из ветки релиза несколько крупных возможностей, включая GROUP BY ALL, SQL/PGQ и функции интроспекции DDL. Часть откатов затронула уже принятый код, а один — 47 коммитов сразу в двух ветках. Параллельно в обсуждениях сообщества возникла тема нехватки ревьюеров: патчи попадают в дерево без содержательного разбора и откатываются уже после того, как в них обнаруживаются ошибки.

Что именно откатили

Три функции для интроспекции DDL — получения команд определения ролей, tablespaces и баз данных — откатил Andrew Dunstan коммитом db169985c1 12 сентября.

GROUP BY ALL откатили иначе: Tom Lane предложил вернуть функцию в v20, Daniel Gustafsson подготовил откат, сохранив попутные правки документации, а Lane выждал день на случай возражений и запушил с комментарием «Hearing nothing, pushed».

SQL/PGQ — механизм графов свойств — откатил Peter Eisentraut коммитом 2b9e1aff4d 7 сентября. Откат размотал 47 коммитов сразу в REL_19_STABLE и master.

Кроме этого, v19 сохраняет per-row fast path для проверок внешних ключей, но теряет batching: изменения запушил Langote 10-го числа. Также утрачена возможность синтаксически выполнять MERGE и SPLIT для партиций.

Почему откатили каждый патч

Для GROUP BY ALL Chao Li 29 июня сообщил, что функция уходила в отдельную ветку при разборе группировки запроса, из-за чего пропускалась логика копирования семантики оператора из совпадающего элемента ORDER BY. Запрос с явной группирующей колонкой и ORDER BY a USING operator(pg_catalog.*<) давал две строки, тогда как GROUP BY ALL возвращал одну.

Для SQL/PGQ разработчики обнаружили, что инварианты проверялись только на этапе CREATE. Сценарий: добавить первичный ключ, создать граф свойств, удалить ключ — граф остаётся. Добавить столбец, чтобы счётчики свойств метки совпали, создать граф, удалить столбец — рабочий запрос GRAPH_TABLE начинает падать. Melanie Plageman объяснила удаление тем, что несколько сообщённых проблем ставят вопросы дизайна и поведения, которые сообщество и авторы патчей ещё не разрешили, и времени на исправление до релиза недостаточно. Ashutosh Bapat отметил, что исправление может потребовать catversion bump, поскольку граф свойств, созданный до изменения, будет иметь эти атрибуты, а после — нет.

Что считается неприемлемым после feature freeze

Патч, которому всё ещё требуется catversion bump через четыре месяца после feature freeze, по мнению автора разбора, не должен попадать в v19. Такая необходимость указывает на критический недостаток, который должен был быть обнаружен раньше, и должна была привести к автоматическому откату, как только проблема обнаружилась в середине code freeze. У других отозванных функций истории похожие: критический изъян прошёл первоначальное ревью.

Feature freeze для Postgres 19 состоялся 8 апреля. По странице open items, беты выходили так: Beta 1 — 4 июня, Beta 2 — 16 июля, Beta 3 — 13 августа, Beta 4 — 24 сентября. RC 1 и GA оба помечены как «TBD» через пять месяцев после feature freeze. Для сравнения: Postgres 18 выпустил три беты и сразу перешёл к release candidate. Roadmap при этом всё ещё указывает плановую дату следующего мажорного релиза — октябрь 2026 года.

Как устроен процесс приёма патчей

CommitFest — периодический перерыв в разработке PostgreSQL, посвящённый рецензированию и коммиту патчей, а не новой разработке. CF проводятся, чтобы вся работа для релиза получала относительно быстрый отзыв и не накапливалась к концу цикла. В типичном цикле мажорного релиза проходит пять CommitFest'ов: в июле, сентябре, ноябре, январе и марте. Мартовский — последний, после него наступает feature freeze и начинается бета-период.

Рецензирование открыто для всех, но применить или отклонить патч может только коммиттер, поэтому рецензии обычно лишь дополнительный отзыв. Когда CF заканчивается, всё, что ещё ждёт автора и имеет хотя бы одну рецензию, получает статус Returned with Feedback. Патч считается активным, если по нему была переписка за последние 30 дней и он не проваливал CI более 21 дня. После feature freeze коммиттеры могут отозвать патч.

Перегрузка ревьюеров

В обсуждении описан случай: патч RI fast-path FK закоммитили без ревью, затем откатили из-за ошибок. Noah Misch, единственный ревьюер в списке с реальным контекстом по этому коду, отказался от ревью, сославшись на нехватку времени. Патч никто не взял — ни в тот день, ни на той неделе. Через два дня Langote закоммитил патчи, рассудив, что они исправляют живые баги и лучше раньше, чем позже. Результат — тихая порча внешних ключей из-за ревью, которое никто не успел сделать.

Причину перегрузки автор разбора видит в том, что благодаря AI участники могут отправлять больше патчей за цикл, и каждый патч проходит более исчерпывающую автоматизированную проверку. Число отозванных патчей выросло с 21 до 51 — рост на 62% на фоне падающей частоты коммитов. При этом большинство, если не все, крупные фичи в 19 были написаны, отревьюены и протестированы до того, как AI-инструменты стали доступны или настолько хороши, как сейчас.

Дополнительная проверка угрожает выбросить патчи, которые раньше выжили бы: исторически часть таких багов всплыла бы месяцами позже и была бы исправлена точечным релизом. Обсуждаются два варианта — сдвинуть релиз Postgres 19 дальше или удалить сомнительные патчи, чтобы сохранить обычную каденцию. Haas признал, что нехватка внимания коммиттеров реальна и для него, но возразил, что выпуск необычно багованного релиза, вероятно, контрпродуктивен с точки зрения пропускной способности ревью.

Что это значит для разработчиков

Откаты затрагивают обе ветки — и REL_19_STABLE, и master. Проект прямо предупреждает: во время бета-цикла функции могут меняться несовместимо или удаляться полностью. Код, опирающийся на удалённые функции, перестанет работать после отката.

Открытые вопросы

Из десяти категорий функций, которыми восторгался автор разбора, многие всё ещё в дереве, но некоторые уже удалены: GROUP BY ALL, синтаксические MERGE и SPLIT для партиций, интроспекция DDL ролей, tablespace и баз данных. Сколько ещё функций выживет — нерешённый вопрос. RC 1 и GA не определены. Отдельно упоминается, что Amit Langote закрыл open item 22-го числа, и он оставался закрытым около четырёх дней, после чего был снова открыт.

Источники

Похожее