AURORA-1831: гонка technical_number при параллельном POST /projects #229

Open
aep wants to merge 2 commits from feat/207-aurora-1831-project-tn-race into test
Owner

Closes #207

Jira: AURORA-1831

Что сделано

  • Миграция 0050: v3.add_project (копия версии из 0018) с pg_advisory_xact_lock(hashtext('v3.project.technical_number'), p_org_unit_id) перед вычислением MAX. Решение опирается на READ COMMITTED (комментарий в SQL).
  • Счётчик > 99: RAISE EXCEPTION с понятным текстом вместо тихой обрезки lpad. Хэндлер отдаёт 400 с этим текстом (новых маппингов нет). Формат номера не менялся.
  • Не в этой задаче: повтор номера после удаления и обрезка org_unit_id >= 10000 (AURORA-1919).

Тесты

  • tests/integration/test_project_technical_number_concurrency.py: гонка на двух соединениях (ожидание блокировки через pg_stat_activity, уборка в finally; до правки unique violation) и переполнение счётчика (вставка номера с 99 в транзакции с откатом).
  • Полный прогон на PG16: 202 passed, 4 skipped, 3 failed (исходные падения test, не связаны).

Проверить руками

  • Два параллельных POST /api/v1/projects на одну оргединицу: оба 200, номера различаются на 1 в последних двух цифрах.
  • Номер 0050 могут занять другие PR: при rebase проверить down_revision.

Замер до/после

Будет добавлен после ночного прогона на стенде perf/: параллельное создание проектов в одной оргединице, ожидаются 0 ответов 409.

Rulings I made

нет

🤖 Generated with Claude Code

Closes #207 Jira: AURORA-1831 ## Что сделано - Миграция 0050: v3.add_project (копия версии из 0018) с pg_advisory_xact_lock(hashtext('v3.project.technical_number'), p_org_unit_id) перед вычислением MAX. Решение опирается на READ COMMITTED (комментарий в SQL). - Счётчик > 99: RAISE EXCEPTION с понятным текстом вместо тихой обрезки lpad. Хэндлер отдаёт 400 с этим текстом (новых маппингов нет). Формат номера не менялся. - Не в этой задаче: повтор номера после удаления и обрезка org_unit_id >= 10000 (AURORA-1919). ## Тесты - tests/integration/test_project_technical_number_concurrency.py: гонка на двух соединениях (ожидание блокировки через pg_stat_activity, уборка в finally; до правки unique violation) и переполнение счётчика (вставка номера с 99 в транзакции с откатом). - Полный прогон на PG16: 202 passed, 4 skipped, 3 failed (исходные падения test, не связаны). ## Проверить руками - Два параллельных POST /api/v1/projects на одну оргединицу: оба 200, номера различаются на 1 в последних двух цифрах. - Номер 0050 могут занять другие PR: при rebase проверить down_revision. ## Замер до/после Будет добавлен после ночного прогона на стенде perf/: параллельное создание проектов в одной оргединице, ожидаются 0 ответов 409. ## Rulings I made нет 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 2 commits 2026-10-28 17:15:01 +03:00
Author
Owner

Проверка на PostgreSQL 15.12 (контроллер, 28.10): ветка + коммиты AURORA-1922 (PR #221, без них test на 15 не накатывается), пустая БД, --init_db — миграция 0050 проходит; полный pytest: 204 passed, 4 skipped, 3 failed (исходные падения test). Новых падений нет.

Проверка на PostgreSQL 15.12 (контроллер, 28.10): ветка + коммиты AURORA-1922 (PR #221, без них test на 15 не накатывается), пустая БД, --init_db — миграция 0050 проходит; полный pytest: 204 passed, 4 skipped, 3 failed (исходные падения test). Новых падений нет.
This pull request can be merged automatically.
You are not authorized to merge this pull request.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/207-aurora-1831-project-tn-race:feat/207-aurora-1831-project-tn-race
git checkout feat/207-aurora-1831-project-tn-race
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/DFiP_Budget_planing#229
No description provided.