diff --git a/README.md b/README.md index 1b6a046..8a9464f 100644 --- a/README.md +++ b/README.md @@ -150,10 +150,10 @@ make gp-psql # Подключение к Greenplum - базовые конфиги PXF копируются в `PXF_BASE/conf` (если их ещё нет); - создаются каталоги `PXF_BASE/run` и `PXF_BASE/logs`; -- `CREATE EXTENSION pxf` выполняется автоматически, когда Greenplum становится доступен. +- `CREATE EXTENSION pxf` выполняется автоматически, когда Greenplum становится доступен (с ретраями). -Healthcheck сервиса `greenplum` учитывает не только готовность Greenplum, но и запуск PXF — -это нужно, чтобы Airflow не стартовал раньше PXF. +Healthcheck сервиса `greenplum` учитывает не только готовность Greenplum, но и запуск PXF, +а также наличие `extension pxf` — это нужно, чтобы Airflow не стартовал раньше PXF. Сборка и запуск: diff --git a/docker-compose.yml b/docker-compose.yml index 64231c4..9b5aed9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -86,7 +86,7 @@ services: healthcheck: # Ждём не только доступность GPDB, но и готовность PXF, # чтобы Airflow не стартовал раньше PXF. - test: [ "CMD-SHELL", "/usr/local/greenplum-db/bin/pg_isready -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} && su - ${GP_USER:-gpadmin} -c '/usr/local/pxf/bin/pxf cluster status' >/dev/null 2>&1" ] + test: [ "CMD-SHELL", "/usr/local/greenplum-db/bin/pg_isready -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} && PGPASSWORD=${GP_PASSWORD:-gpadmin} /usr/local/greenplum-db/bin/psql -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} -t -A -c \"SELECT 1 FROM pg_extension WHERE extname='pxf';\" | grep -q 1 && su - ${GP_USER:-gpadmin} -c '/usr/local/pxf/bin/pxf cluster status' >/dev/null 2>&1" ] interval: 10s timeout: 5s retries: 30 diff --git a/docs/internal/pxf_bookings.md b/docs/internal/pxf_bookings.md index 3b2061f..82b1114 100644 --- a/docs/internal/pxf_bookings.md +++ b/docs/internal/pxf_bookings.md @@ -101,13 +101,13 @@ - причина: файлы уже лежат в `PXF_BASE` на томе, а seed из образа по умолчанию не перетирает их; - решение: `make build` + restart `greenplum` + (при необходимости) `PXF_SEED_OVERWRITE=1`. -## 9. Известная проблема: `protocol "pxf" does not exist` на «холодном старте» +## 9. Известная проблема: `protocol "pxf" does not exist` на «холодном старте» (исправлено) -Иногда (и это воспроизводится в `./scripts/e2e_smoke.sh`) при первом `make ddl-gp` можно получить: +Раньше (воспроизводилось в `./scripts/e2e_smoke.sh`) при первом `make ddl-gp` можно было получить: `ERROR: protocol "pxf" does not exist` -### Почему так происходит +### Почему так происходило В базовом `/start_gpdb.sh` из образа Greenplum создание расширения `pxf` связано с проверкой файла `${PXF_BASE}/conf/pxf-env.sh`: @@ -116,35 +116,23 @@ `CREATE EXTENSION IF NOT EXISTS pxf`; - если `pxf-env.sh` **уже существует**, этот блок **пропускается**, и расширение может не появиться. -При этом наш ensure‑скрипт `pxf/init/10_pxf_bookings.sh` копирует `pxf-env.sh` в `${PXF_BASE}` -ещё до запуска Greenplum, из‑за чего базовый скрипт считает PXF “уже настроенным” и -пропускает создание расширения. +При этом наш ensure‑скрипт `pxf/init/10_pxf_bookings.sh` копировал `pxf-env.sh` в `${PXF_BASE}` +ещё до запуска Greenplum, из‑за чего базовый скрипт считал PXF “уже настроенным” и +пропускал создание расширения. -Отдельно `/start_greenplum_with_pxf.sh` пытается выполнить `CREATE EXTENSION IF NOT EXISTS pxf` -в фоне, но это может “не попасть” в окно готовности базы (гонка при старте), поэтому после старта: -- PXF может быть “running” (`pxf cluster status`), но -- `protocol pxf` в базе ещё не создан. +### Что изменили -### Как проверить +- ensure‑скрипт больше не копирует `pxf-env.sh`, если файла ещё нет (даём `/start_gpdb.sh` создать его); +- в `start_greenplum_with_pxf.sh` добавлена retry‑логика с проверкой наличия extension; +- healthcheck `greenplum` ждёт не только PXF, но и наличие `extension pxf`. -- `docker compose exec greenplum bash -lc "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -d gp_dwh -t -A -c \"SELECT extname FROM pg_extension WHERE extname = ''pxf'';\"'"` +### Если ошибка всё ещё возникает -Если команда ничего не вернула — расширение не создано. +1) Пересоберите образ и перезапустите контейнер `greenplum`: +`make build && make down && make up` -### Временный workaround (ручной) - -1) Создать расширение: -`docker compose exec greenplum bash -lc "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -d gp_dwh -c \"CREATE EXTENSION IF NOT EXISTS pxf;\"'"` - -2) Повторить DDL: -`make ddl-gp` - -### Что чинить в коде (идея фикса) - -Сделать создание расширения `pxf` независимым от наличия `pxf-env.sh`: -- либо убрать/изменить условие в `/start_gpdb.sh` (в образе), -- либо перестать копировать `pxf-env.sh` в ensure‑скрипте и дать базовому скрипту создать его, -- либо сделать retry‑логику `CREATE EXTENSION pxf` надёжной (повторять попытки и проверять результат). +2) Проверьте наличие extension: +`docker compose exec greenplum bash -lc "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -d gp_dwh -t -A -c \"SELECT extname FROM pg_extension WHERE extname = ''pxf'';\"'"` ## 8. Связанные файлы diff --git a/pxf/init/10_pxf_bookings.sh b/pxf/init/10_pxf_bookings.sh index 522d36c..845d197 100755 --- a/pxf/init/10_pxf_bookings.sh +++ b/pxf/init/10_pxf_bookings.sh @@ -61,10 +61,14 @@ copy_seed_file \ "${PXF_BASE}/conf/pxf-application.properties" \ "pxf-application.properties" -copy_seed_file \ - "${PXF_CONF_SEED_DIR}/pxf-env.sh" \ - "${PXF_BASE}/conf/pxf-env.sh" \ - "pxf-env.sh" +if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then + copy_seed_file \ + "${PXF_CONF_SEED_DIR}/pxf-env.sh" \ + "${PXF_BASE}/conf/pxf-env.sh" \ + "pxf-env.sh" +else + log_info "pxf-env.sh отсутствует в ${PXF_BASE}/conf, пропускаем копирование до инициализации PXF" +fi # Устанавливаем уменьшенные JVM-опции, если они ещё не заданы явно if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then diff --git a/pxf/init/start_greenplum_with_pxf.sh b/pxf/init/start_greenplum_with_pxf.sh index aa90cf1..209120e 100755 --- a/pxf/init/start_greenplum_with_pxf.sh +++ b/pxf/init/start_greenplum_with_pxf.sh @@ -13,22 +13,35 @@ ensure_pxf_extension() { return 0 fi - for _ in $(seq 1 "${attempts}"); do + extension_exists() { + local result + result=$(PGPASSWORD="${gp_password}" /usr/local/greenplum-db/bin/psql \ + -h 127.0.0.1 -p 5432 -U "${gp_user}" -d "${gp_db}" \ + -t -A -c "SELECT 1 FROM pg_extension WHERE extname='pxf';" 2>/dev/null || true) + [ "${result}" = "1" ] + } + + for attempt in $(seq 1 "${attempts}"); do if /usr/local/greenplum-db/bin/pg_isready \ -h 127.0.0.1 -p 5432 -U "${gp_user}" -d "${gp_db}" >/dev/null 2>&1; then + if extension_exists; then + echo "INFO - extension pxf уже создано" + return 0 + fi if PGPASSWORD="${gp_password}" /usr/local/greenplum-db/bin/psql \ -h 127.0.0.1 -p 5432 -U "${gp_user}" -d "${gp_db}" \ - -v ON_ERROR_STOP=1 -c "CREATE EXTENSION IF NOT EXISTS pxf;" >/dev/null; then - echo "INFO - extension pxf готово" - else - echo "WARN - не удалось создать extension pxf" + -v ON_ERROR_STOP=1 -c "CREATE EXTENSION IF NOT EXISTS pxf;" >/dev/null 2>&1; then + if extension_exists; then + echo "INFO - extension pxf готово" + return 0 + fi fi - return 0 + echo "WARN - попытка ${attempt}/${attempts}: не удалось создать extension pxf" fi sleep 2 done - echo "WARN - Greenplum не готов, пропускаем CREATE EXTENSION pxf" + echo "WARN - Greenplum не готов или extension pxf не создано" } if [ -f "${ensure_script}" ]; then