diff --git a/docs/internal/pxf_bookings.md b/docs/internal/pxf_bookings.md index c80a0f3..3a5c158 100644 --- a/docs/internal/pxf_bookings.md +++ b/docs/internal/pxf_bookings.md @@ -126,6 +126,8 @@ - `pxf-env.sh` по‑прежнему копируется в `PXF_BASE`, чтобы `/start_gpdb.sh` не пытался выполнять `pxf cluster prepare` на непустом `PXF_BASE`; - healthcheck `greenplum` ждёт не только PXF, но и наличие `extension pxf`. +- добавлен экспорт `PGPASSWORD` для `pxf cluster start`, чтобы `docker compose stop/start` + не ломал запуск из‑за `password authentication failed` для `gpadmin`. ### Если ошибка всё ещё возникает @@ -142,3 +144,52 @@ - `pxf/init/10_pxf_bookings.sh` (ensure‑логика) - `pxf/init/start_greenplum_with_pxf.sh` (старт контейнера) - `README.md` (раздел «Greenplum + PXF: свой образ») + +## 10. Известная проблема: после `docker compose stop/start` Greenplum может упасть (auth для PXF) + +### Симптом + +После `docker compose stop`, затем `docker compose start` контейнер `greenplum` иногда уходит в `Exited (1)`. +В логах видно, что GPDB поднялся, но упал на старте PXF: + +- `INFO - pxf cluster start` +- `ERROR: Could not connect to GPDB` +- `FATAL: password authentication failed for user "gpadmin"` + +### Текущее понимание причины (почему это “иногда”) + +1) При старте GPDB образ `woblerr/greenplum` генерирует/дописывает `pg_hba.conf` на persistent volume. +2) В `pg_hba.conf` присутствует trust‑правило для **конкретного IP** контейнера в docker‑сети + (пример из диагностики: `host all gpadmin 172.21.0.2/32 trust`). +3) После `docker compose stop/start` Docker может выдать контейнеру **другой IP** (например, `172.21.0.3`). + Тогда trust‑правило больше не подходит, и подключение начинает идти по `md5`. +4) `pxf cluster start` подключается к GPDB по TCP на `host=gpdbsne` (hostname контейнера), + то есть попадает именно в `pg_hba.conf` (а не в local‑auth). +5) В результате при “не совпавшем IP” получаем `md5` + пароль (возможно пустой/не тот) → падение на `28P01`. + +Эта проблема выглядит флапающей, потому что IP после `stop/start` иногда совпадает с захардкоженным trust‑/32, +а иногда нет. + +### Как подтвердить при следующем воспроизведении + +1) Посмотреть логи `greenplum`: +`docker compose logs --tail=200 greenplum` + +2) Найти реальный IP клиента в master‑логах GPDB (на томе): +`Password does not match ...` обычно содержит адрес вида `172.21.0.X`. + +3) Сравнить его с trust‑строкой в `pg_hba.conf` на томе: +`/data/master/gpseg-1/pg_hba.conf` + +Если IP в ошибке (например, `172.21.0.3`) **не** совпадает с trust‑/32 (например, `172.21.0.2/32`) — +это почти наверняка корень падения. + +### Что с этим делать дальше (варианты решения, без реализации здесь) + +Основная цель — убрать зависимость от “случайного IP после stop/start”: + +- заставить `pxf cluster start` подключаться к GPDB через `127.0.0.1` (тогда работает существующий trust на localhost); +- или перестать добавлять в `pg_hba.conf` trust на конкретный `172.21.0.2/32` и заменить на более стабильное правило + (например, на подсеть docker‑сети или на `samehost`); +- или закрепить IP контейнера в compose (static IP), чтобы он не “плавал”; +- или отказаться от `stop/start` в пользу сценария, который не меняет сетевое окружение (но это хуже для UX студентов). diff --git a/pxf/init/start_greenplum_with_pxf.sh b/pxf/init/start_greenplum_with_pxf.sh index 209120e..988332a 100755 --- a/pxf/init/start_greenplum_with_pxf.sh +++ b/pxf/init/start_greenplum_with_pxf.sh @@ -3,6 +3,11 @@ set -euo pipefail ensure_script="/opt/pxf-scripts/ensure_pxf_bookings.sh" +# PXF CLI использует libpq, без PGPASSWORD после stop/start возможна ошибка auth. +if [ -z "${PGPASSWORD:-}" ]; then + export PGPASSWORD="${GREENPLUM_PASSWORD:-gpadmin}" +fi + ensure_pxf_extension() { local gp_user="${GREENPLUM_USER:-gpadmin}" local gp_db="${GREENPLUM_DATABASE_NAME:-gp_dwh}"