фикс pxf

This commit is contained in:
2026-01-08 23:34:26 +03:00
parent 1efeb58449
commit 573c853f15
5 changed files with 47 additions and 42 deletions
+3 -3
View File
@@ -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.
Сборка и запуск:
+1 -1
View File
@@ -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
+15 -27
View File
@@ -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. Связанные файлы
+5 -1
View File
@@ -61,10 +61,14 @@ copy_seed_file \
"${PXF_BASE}/conf/pxf-application.properties" \
"pxf-application.properties"
copy_seed_file \
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
+19 -6
View File
@@ -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
-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 готово"
else
echo "WARN - не удалось создать extension pxf"
fi
return 0
fi
fi
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