Skip to content

Commit 65ca1e3

Browse files
committed
fix: fixed replication lag on slave
- added query based on recovery control functions instead of timestamp evaluation; - added new bootstrap optional parameter '-c/--config': bootstrap uses some plugin parameters set by user for functions generating;
1 parent d705a89 commit 65ca1e3

File tree

5 files changed

+30
-42
lines changed

5 files changed

+30
-42
lines changed

github-actions-tests/tools/bootstrap.sh

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ function check_db_objects() {
5252
echo "MAMONSU_USER = $MAMONSU_USER, MAMONSU_DB = $MAMONSU_DB"
5353

5454
$PSQL $DB -c "\dt mamonsu.config" | grep "mamonsu.*config.*table.*$MAMONSU_USER" || exit 11
55-
MAMONSU_TIMESTAMP_NAME=`echo $MAMONSU_VERSION | sed 's/\./\_/g'`
56-
$PSQL $DB -c "\dt mamonsu.timestamp_master_$MAMONSU_TIMESTAMP_NAME" | grep "mamonsu.*timestamp_master_$MAMONSU_TIMESTAMP_NAME.*table.*$MAMONSU_USER" || exit 11
57-
$PSQL $DB -c "\df mamonsu.timestamp_master_update" | grep "mamonsu.*timestamp_master_update" || exit 11
5855
$PSQL $DB -c "\df mamonsu.timestamp_get" | grep "mamonsu.*timestamp_get" || exit 11
5956
$PSQL $DB -c "\df mamonsu.count_autovacuum" | grep "mamonsu.*count_autovacuum" || exit 11
6057
$PSQL $DB -c "\df mamonsu.get_oldest_xid" | grep "mamonsu.*get_oldest_xid" || exit 11

mamonsu/plugins/pgsql/driver/pool.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ class Pool(object):
77

88
SQL = {
99
# query type: ( 'if_not_installed', 'if_installed' )
10-
'replication_lag_master_query': (
11-
'select 1 as replication_lag_master_query',
12-
'select mamonsu.timestamp_master_update()'
13-
),
1410
'replication_lag_slave_query': (
15-
'select extract(epoch from now()-pg_last_xact_replay_timestamp())',
11+
"SELECT"
12+
" CASE WHEN pg_last_{1}() = pg_last_{2}() THEN 0"
13+
" ELSE extract (epoch FROM now() - coalesce(pg_last_xact_replay_timestamp(), now() - INTERVAL '{0} seconds'))"
14+
" END",
1615
'select mamonsu.timestamp_get()'
1716
),
1817
'count_xlog_files': (

mamonsu/plugins/pgsql/xlog.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,17 @@ class Xlog(Plugin):
5454
def run(self, zbx):
5555

5656
if Pooler.in_recovery():
57-
# replication lag
58-
lag = Pooler.run_sql_type('replication_lag_slave_query')
57+
if Pooler.server_version_greater('10.0'):
58+
lag = Pooler.run_sql_type('replication_lag_slave_query'.format(self.plugin_config('interval'),
59+
'wal_receive_lsn',
60+
'wal_replay_lsn'))
61+
else:
62+
lag = Pooler.run_sql_type('replication_lag_slave_query'.format(self.plugin_config('interval'),
63+
'xlog_receive_location',
64+
'xlog_replay_location'))
5965
if lag[0][0] is not None:
6066
zbx.send('pgsql.replication_lag[sec]', float(lag[0][0]))
6167
else:
62-
Pooler.run_sql_type('replication_lag_master_query')
6368
if Pooler.server_version_greater('10.0'):
6469
result = Pooler.query(self.query_wal_lsn_diff)
6570
result_lags = Pooler.run_sql_type('wal_lag_lsn')

mamonsu/tools/bootstrap/sql.py

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,12 @@
2929
3030
INSERT INTO mamonsu.config(version) VALUES('{0}');
3131
32-
DROP TABLE IF EXISTS mamonsu.timestamp_master_{1};
33-
34-
CREATE TABLE mamonsu.timestamp_master_{1}(
35-
id int primary key,
36-
ts double precision,
37-
lsn pg_lsn
38-
);
39-
40-
INSERT INTO mamonsu.timestamp_master_{1} (id) values (1);
41-
42-
CREATE OR REPLACE FUNCTION mamonsu.timestamp_master_update()
43-
RETURNS void AS $$
44-
UPDATE mamonsu.timestamp_master_{1} SET
45-
ts = extract(epoch from now() at time zone 'utc')::double precision,
46-
lsn = pg_catalog.pg_current_{4}()
47-
WHERE
48-
id = 1;
49-
$$ LANGUAGE SQL SECURITY DEFINER;
50-
5132
CREATE OR REPLACE FUNCTION mamonsu.timestamp_get()
5233
RETURNS double precision AS $$
5334
SELECT
54-
(extract(epoch from now() at time zone 'utc') - ts)::double precision
55-
FROM mamonsu.timestamp_master_{1}
56-
WHERE id = 1 LIMIT 1;
35+
CASE WHEN pg_last_{11}() = pg_last_{12}() THEN 0
36+
ELSE extract (epoch FROM now() - coalesce(pg_last_xact_replay_timestamp(), now() - INTERVAL '{13} seconds'))
37+
END
5738
$$ LANGUAGE SQL SECURITY DEFINER;
5839
5940
CREATE OR REPLACE FUNCTION mamonsu.count_autovacuum()
@@ -178,10 +159,6 @@
178159
GrantsOnDefaultSchemaSQL = """
179160
ALTER TABLE mamonsu.config OWNER TO {1};
180161
181-
ALTER TABLE mamonsu.timestamp_master_{0} OWNER TO {1};
182-
183-
GRANT EXECUTE ON FUNCTION mamonsu.timestamp_master_update() TO {1};
184-
185162
GRANT EXECUTE ON FUNCTION mamonsu.timestamp_get() TO {1};
186163
187164
GRANT EXECUTE ON FUNCTION mamonsu.count_autovacuum() TO {1};

mamonsu/tools/bootstrap/start.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
import optparse
55
import sys
66

7+
from mamonsu.lib.config import Config
78
import mamonsu.lib.platform as platform
89
from mamonsu.lib.parser import MissOptsParser
910
from mamonsu.plugins.pgsql.driver.checks import is_conn_to_db
1011
from mamonsu import __version__ as mamonsu_version
1112
from mamonsu.lib.default_config import DefaultConfig
1213
from mamonsu.plugins.pgsql.pool import Pooler
1314
from mamonsu.tools.bootstrap.sql import CreateMamonsuUserSQL, CreateSchemaExtensionSQL, \
14-
CreateSchemaDefaultSQL,GrantsOnDefaultSchemaSQL, GrantsOnExtensionSchemaSQL, QuerySplit
15+
CreateSchemaDefaultSQL, GrantsOnDefaultSchemaSQL, GrantsOnExtensionSchemaSQL, QuerySplit
1516

1617

1718
class Args(DefaultConfig):
@@ -67,6 +68,11 @@ def __init__(self):
6768
action='store_true',
6869
dest='create_extensions',
6970
help='create pg_buffercache extension in mamonsu schema')
71+
bootstrap_group.add_option(
72+
'-c', '--config',
73+
dest='config',
74+
default=DefaultConfig.default_config_path(),
75+
help='Mamonsu config file')
7076
parser.add_option_group(group)
7177
parser.add_option_group(bootstrap_group)
7278

@@ -153,8 +159,9 @@ def test_db(self, host_pre):
153159
return True
154160

155161

156-
def fill_query_params(queries):
162+
def fill_query_params(queries, args):
157163
formatted_queries = ""
164+
cfg = Config(args.args.config)
158165
for sql in queries.format(
159166
mamonsu_version,
160167
mamonsu_version.replace('.', '_'),
@@ -168,7 +175,10 @@ def fill_query_params(queries):
168175
'flush_lag INTERVAL, replay_lag INTERVAL, write_lag INTERVAL,' if Pooler.server_version_greater('10.0')
169176
else '',
170177
'lsn' if Pooler.server_version_greater('10.0') else 'location',
171-
'walfile' if Pooler.server_version_greater('10.0') else 'xlogfile'
178+
'walfile' if Pooler.server_version_greater('10.0') else 'xlogfile',
179+
'wal_receive_lsn' if Pooler.server_version_greater('10.0') else 'xlog_receive_location',
180+
'wal_replay_lsn' if Pooler.server_version_greater('10.0') else 'xlog_replay_location',
181+
cfg.fetch('xlog', 'interval')
172182
).split(QuerySplit):
173183
formatted_queries += sql
174184
return formatted_queries
@@ -215,15 +225,15 @@ def run_deploy():
215225
sys.exit(2)
216226

217227
try:
218-
bootstrap_queries = fill_query_params(CreateSchemaDefaultSQL)
228+
bootstrap_queries = fill_query_params(CreateSchemaDefaultSQL, args)
219229
Pooler.query(bootstrap_queries)
220230
except Exception as e:
221231
sys.stderr.write("Bootstrap execution have exited with an error: {0}\n".format(e))
222232
sys.exit(2)
223233

224234
if args.args.create_extensions:
225235
try:
226-
bootstrap_extension_queries = fill_query_params(CreateSchemaExtensionSQL)
236+
bootstrap_extension_queries = fill_query_params(CreateSchemaExtensionSQL, args)
227237
Pooler.query(bootstrap_extension_queries)
228238
except Exception as e:
229239
sys.stderr.write(

0 commit comments

Comments
 (0)