WCS OAM init_tsdb sql error

mrinner

Member
wcs-oam | Execute query: SELECT create_hypertable('conditions', 'time', 'node_id', chunk_time_interval => interval '2 days')
wcs-oam | Can not execute query: ERROR: invalid number of partitions for dimension "node_id"
wcs-oam | Hint: A closed (space) dimension must specify between 1 and 32767 partitions.
wcs-oam | org.postgresql.util.PSQLException: ERROR: invalid number of partitions for dimension "node_id"
wcs-oam | Hint: A closed (space) dimension must specify between 1 and 32767 partitions.
 

Max

Administrator
Staff member
Уточните, пожалуйста, какая версия WCS OAM.
 

Max

Administrator
Staff member
Добрый день.
Проверили, при чистой установке WCS OAM 1.170 на пустую Postgres БД проблема не воспроизводится. При обновлении, если БД wcsoam и wcsstat уже существуют, данный скрипт вызывать не нужно.
Попробуйте сбросить обе БД
Code:
DROP DATABASE wcsoam;
DROP DATABASE wcsstat;
и повторить шаги 10-13 из этой инструкции
 

mrinner

Member
Мы закатываем наш проект в докер, postgres используем 11 (image: timescale/timescaledb:latest-pg11).
Init такой:
Code:
CREATE USER wcsoam WITH PASSWORD 'wcsoam';
CREATE DATABASE wcsstat;
CREATE DATABASE wcsoam;
GRANT ALL PRIVILEGES ON DATABASE wcsstat TO wcsoam;
GRANT ALL PRIVILEGES ON DATABASE wcsoam TO wcsoam;
\c wcsstat;
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
затем запускаем init_tsdb.sh

так же из-за отсутствия hypertable 'conditions' не запускается очистка старых данных (cron)
Code:
postgres | 2020-04-16 15:05:01.235 UTC [120] ERROR:  "conditions" is not a hypertable or a continuous aggregate view
postgres | 2020-04-16 15:05:01.235 UTC [120] HINT:  It is only possible to drop chunks from a hypertable or continuous aggregate view
 
Last edited:

Max

Administrator
Staff member
Добрый день.
В нашем Docker стенде мы используем образ timescale/timescaledb:latest-pg9.6, init.sql следующий:
Code:
DROP DATABASE IF EXISTS wcsstat;
DROP DATABASE IF EXISTS wcsoam;
CREATE USER wcsoam WITH PASSWORD 'wcsoam';
CREATE DATABASE wcsstat;
GRANT ALL PRIVILEGES ON DATABASE wcsstat TO "wcsoam";
CREATE DATABASE wcsoam;
GRANT ALL PRIVILEGES ON DATABASE wcsoam TO "wcsoam";
расширение создается из скрипта init_tsdb.sh
При этом WCS OAM работает.
В рабочем окружении также используется postgres 9.6.
Если необходимо получать метрики потоков, в качестве альтернативы можно также использовать Prometheus, туда же отдаются и параметры статистики.
 

mrinner

Member
Попробовали образ timescale/timescaledb:latest-pg9.6 .. аналогичная проблема.
Если убрать создание расширения из init.sql - то прав не хватает у wcsoam создать его из init_tsdb.sh.
Так же, в init_tsdb.sh проверяется запущен ли сервис:
Code:
if [ -f $OAM_PID_FILE -a -f $OAM_LOCK_FILE ]; then
echo $"$PRODUCT: running, first shutdown"
exit 1
fi
поэтому вызов .sh сделали до запуска oam. Можете поделиться своим docker образом?


Code:
wcs-oam         | Execute query: CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE
wcs-oam         | Execute query: CREATE TABLE IF NOT EXISTS conditions (time TIMESTAMPTZ NOT NULL, node_id BIGINT NOT NULL, media_id TEXT NOT NULL , VIDEO_HEIGHT BIGINT NULL, VIDEO_WIDTH BIGINT NULL, VIDEO_RATE BIGINT NULL, VIDEO_SYNC BIGINT NULL, VIDEO_FPS BIGINT NULL, VIDEO_NACK BIGINT NULL, VIDEO_PLI BIGINT NULL, VIDEO_CODEC BIGINT NULL, AUDIO_SYNC BIGINT NULL, AUDIO_RATE BIGINT NULL, AUDIO_LOST BIGINT NULL, AUDIO_CODEC BIGINT NULL, VIDEO_B_FRAMES BIGINT NULL, VIDEO_K_FRAMES BIGINT NULL, VIDEO_P_FRAMES BIGINT NULL)
wcs-oam         | Execute query: CREATE INDEX idx_media_id on conditions(media_id)
wcs-oam         | Execute query: SELECT create_hypertable('conditions', 'time', 'node_id', chunk_time_interval => interval '2 days')
wcs-oam         | Can not execute query: ERROR: invalid number of partitions for dimension "node_id"
wcs-oam         |   Hint: A closed (space) dimension must specify between 1 and 32767 partitions.
wcs-oam         | org.postgresql.util.PSQLException: ERROR: invalid number of partitions for dimension "node_id"
wcs-oam         |   Hint: A closed (space) dimension must specify between 1 and 32767 partitions.
wcs-oam         |     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
wcs-oam         |     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
wcs-oam         |     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
wcs-oam         |     at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
wcs-oam         |     at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
wcs-oam         |     at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:307)
wcs-oam         |     at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:293)
wcs-oam         |     at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:270)
wcs-oam         |     at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:266)
wcs-oam         |     at com.flashphoner.oam.utils.PrepareTimeSeriesDatabaseTool.initTimeScale(PrepareTimeSeriesDatabaseTool.java:129)
wcs-oam         |     at com.flashphoner.oam.utils.PrepareTimeSeriesDatabaseTool.main(PrepareTimeSeriesDatabaseTool.java:63)
 
Last edited:

Max

Administrator
Staff member
Добрый день.
Так же, в init_tsdb.sh проверяется запущен ли сервис:
Да, init_tsdb.sh должен быть вызван до запуска WCS OAM, это описано в документации: сначала идет настройка, затем запуск
Можете поделиться своим docker образом?
Готовый docker образ у нас есть только для WCS.
Для запуска OAM в docker мы используем отдельный контейнер БД на базе timescale/timescaledb:latest-pg9.6
Code:
FROM timescale/timescaledb:latest-pg9.6
COPY init.sql /docker-entrypoint-initdb.d/
init.sql
SQL:
DROP DATABASE IF EXISTS wcsstat;
DROP DATABASE IF EXISTS wcsoam;
CREATE USER wcsoam WITH PASSWORD 'wcsoam';
CREATE DATABASE wcsstat;
GRANT ALL PRIVILEGES ON DATABASE wcsstat TO "wcsoam";
CREATE DATABASE wcsoam;
GRANT ALL PRIVILEGES ON DATABASE wcsoam TO "wcsoam";
и контейнер на базе Ubuntu 18.04 c JDK 8 или 12
Code:
FROM ubuntu:18.04
COPY docker-entrypoint.sh /usr/local/bin/
RUN bash /usr/local/bin/docker-entrypoint.sh
docker_entrypoint:
Bash:
#!/bin/bash
set -e

apt-get -y update
apt-get -y upgrade
apt-get install -y openjdk-8-jdk openjdk-8-jre expect openssh-server openssh-client net-tools curl wget nano gettext tcpdump
java_path=`update-alternatives --display java | grep java-8 | grep '^/' | cut -f 1 -d' ' | sed 's/\(.*\)\/java/\1/'`
jdk_path=`update-alternatives --display jstack | grep java-8 | grep '^/' | cut -f 1 -d' ' | sed 's/\(.*\)\/jstack/\1/'`
if [ "$jdk_path" == "" ]; then
 if [ "$version" == "11" ]; then
  jdk_path=$java_path
 elif [ -L "/usr/bin/jstack" ]; then
  jdk_path=/usr/bin/jstack
  while [[ -L ${jdk_path} && "$(ls -l "${jdk_path}")" =~ -\>\ (.*) ]]
  do
    jdk_path="${BASH_REMATCH[1]}"
  done
  jdk_path=`echo $jdk_path | sed 's/\(.*\)\/jstack/\1/'`
 fi
 update-alternatives --install "/usr/bin/jstack" "jstack" "$jdk_path/jstack" 1
 update-alternatives --install "/usr/bin/jcmd" "jcmd" "$jdk_path/jcmd" 1
 update-alternatives --install "/usr/bin/jmap" "jmap" "$jdk_path/jmap" 1
fi
update-alternatives --set "java" "$java_path/java"
update-alternatives --set "jstack" "$jdk_path/jstack"
update-alternatives --set "jcmd" "$jdk_path/jcmd"
update-alternatives --set "jmap" "$jdk_path/jmap"
Контейнеры поднимаются в одной docker сети, затем работает скрипт, который
- скачивает нужную сборку OAM
- устанавливает ее в контейнер
- копирует wcsoam.properties (куда заранее прописывается IP адрес контейнера БД), log4j.properties в каталог /usr/local/FlashphonerWebCallServerOAM/conf в контейнер
- запускает init_tsdb.sh
- запускает OAM
init_tsdb.sh действительно бросает исключение, но OAM при этом работает, метрики принимаются.
Если проходить процедуру установки и настройки ОАМ без использования готовых сборок, с установкой Postgres 9.6 и TimescaleDB по инструкции https://docs.flashphoner.com/pages/viewpage.action?pageId=14254799, исключение при запуске init_tsdb.sh не воспроизводится. Поэтому рекомендуем попробовать такой вариант: создание кастомного контейнера на базе CentOS 7/Ubuntu 18.04 c установкой туда Postgres 9.6, TimeScaleDB и WCS OAM.
 

mrinner

Member
Спасибо, у нас приблизительно все аналогично, на jdk 8. Метрики ходят, с этим ок. Из-за исключения, видимая "побочка" - не отрабатывает cron на зачистку старых данных. Возможно, если postgr+timescale поднять кастомно в докере - то будет ок, попробуем.
 
Top