Description
Столкнулись с неожиданной ошибкой при работе плагина XLOG
XLOG - catch error: float() argument must be a string or a number, not 'NoneType'
включили DEBUG режим и получили:
[DEBUG] 2021-06-07 13:02:43,267 - PGSQL-(host=localhost db=mamonsu user=mamonsu port=5432) - Run: " SELECT pg_catalog.pg_wal_lsn_diff (pg_catalog.pg_current_wal_lsn(), '0/00000000');"
[DEBUG] 2021-06-07 13:02:43,268 - PGSQL-(host=localhost db=mamonsu user=mamonsu port=5432) - Run: " SELECT application_name, flush_lag, replay_lag, write_lag, total_lag FROM public.mamon
su_count_wal_lag_lsn()"
[ERROR] 2021-06-07 13:02:43,278 - XLOG - catch error: float() argument must be a string or a number, not 'NoneType'
[INFO] 2021-06-07 13:02:43,278 - XLOG - hint: enable debug level to full exception trace
[DEBUG] 2021-06-07 13:02:43,278 - XLOG - Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/mamonsu/lib/plugin.py", line 169, in _loop
self.run(self.sender)
File "/usr/lib/python3/dist-packages/mamonsu/plugins/pgsql/xlog.py", line 58, in run
info[0]), float(info[4]), self.DELTA_SPEED)
TypeError: float() argument must be a string or a number, not 'NoneType'
разбор полётов показал, что проблема при выполнении запроса:
SELECT application_name, flush_lag, replay_lag, write_lag, total_lag FROM public.mamonsu_count_wal_lag_lsn();
Выяснилось, что в поле total_lag появляется значение NULL в момент работ по созданию бэкапа.
Оказывается, в тот момент пока выполняется бэкап и сервер (мастер) находится в состоянии между:
select pg_start_backup()
и
select pg_stop_backup ()
в представлении pg_stat_replication поле replay_lsn есть NULL
на данный момент мы просто вставили в код расчета поля
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS total_lag
->
coalesce(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn),0)
заглушку на этот момент.
Возможно, что вы найдёте более красивое решение.