From 802396d085fbcd76d102178c6a89fad5c3a3a3df Mon Sep 17 00:00:00 2001 From: Victor <87538976+visill@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:48:12 +0500 Subject: [PATCH] Fix od_rules_group_checker_run (light verion) (#695) * Fix od_rules_group_checker_run * Fix memleak when group checker fail to check * Add test with falling postgres --- docker/group/config.conf | 2 +- docker/group/test_group.sh | 19 ++++++++++++++++++- sources/rules.c | 24 +++++++++++++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/docker/group/config.conf b/docker/group/config.conf index a656adca2..0caa5daf1 100644 --- a/docker/group/config.conf +++ b/docker/group/config.conf @@ -138,5 +138,5 @@ enable_online_restart yes bindwith_reuseport yes stats_interval 60 - +group_checker_interval 500 pid_file "/var/run/odyssey.pid" diff --git a/docker/group/test_group.sh b/docker/group/test_group.sh index bf3411ef9..253ee68d2 100755 --- a/docker/group/test_group.sh +++ b/docker/group/test_group.sh @@ -92,4 +92,21 @@ psql -h ip4-localhost -p 6432 -U group_user7 -c "SELECT 1" group_db >/dev/null 2 exit 1 } -ody-stop +sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/repl/ -o '-p 5433' stop +sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/main/ stop +sleep 2 +sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/main/ start +sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/repl/ -o '-p 5433' start +psql -h ip4-localhost -p 6432 -U group_user7 -c "SELECT 1" group_db >/dev/null 2>&1 && { + echo "Break by falling postgres" + + cat /var/log/odyssey.log + echo " + + " + cat /var/log/postgresql/postgresql-14-main.log + + exit 1 +} + +ody-stop \ No newline at end of file diff --git a/sources/rules.c b/sources/rules.c index a8510d392..8ac4fa3bd 100644 --- a/sources/rules.c +++ b/sources/rules.c @@ -270,7 +270,7 @@ void od_rules_group_checker_run(void *arg) continue; } } - + /* TODO: remove this loop (always works once)*/ for (int retry = 0; retry < group->check_retry; ++retry) { if (od_backend_query_send( server, "group_checker", group->group_query, @@ -295,6 +295,11 @@ void od_rules_group_checker_run(void *arg) "read error: %s", od_io_error( &server->io)); + rc = -1; + break; + } else { + /* If timeout try read again */ + continue; } } @@ -342,6 +347,23 @@ void od_rules_group_checker_run(void *arg) od_router_close(router, group_checker_client); + if (rc == NOT_OK_RESPONSE) { + od_debug(&instance->logger, "group_checker", + group_checker_client, server, + "group check failed"); + + od_list_t *it, *n; + od_list_foreach_safe(&members, it, n) + { + member = od_container_of( + it, od_group_member_name_item_t, + link); + if (member) + free(member); + } + break; + } + bool have_default = false; od_list_t *i; int count_group_users = 0;