From 03cd7eb3563788ca1ffd7b19130f18614887a546 Mon Sep 17 00:00:00 2001
From: Scott Solkhon <scott.solkhon@gresearch.co.uk>
Date: Tue, 13 Aug 2019 15:27:50 +0000
Subject: [PATCH] Wait for MariaDB to be accessible via HAProxy

Explicitly wait for the database to be accessible via the load balancer.
Sometimes it can reject connections even when all database services are up,
possibly due to the health check polling in HAProxy.

Closes-Bug: #1840145
Change-Id: I7601bb710097a78f6b29bc4018c71f2c6283eef2
---
 ansible/roles/mariadb/tasks/recover_cluster.yml  |  2 ++
 ansible/roles/mariadb/tasks/register.yml         |  2 ++
 .../mariadb/tasks/wait_for_loadbalancer.yml      | 16 ++++++++++++++++
 3 files changed, 20 insertions(+)
 create mode 100644 ansible/roles/mariadb/tasks/wait_for_loadbalancer.yml

diff --git a/ansible/roles/mariadb/tasks/recover_cluster.yml b/ansible/roles/mariadb/tasks/recover_cluster.yml
index 1d1c340feb..12012a39de 100644
--- a/ansible/roles/mariadb/tasks/recover_cluster.yml
+++ b/ansible/roles/mariadb/tasks/recover_cluster.yml
@@ -190,3 +190,5 @@
   when:
     - bootstrap_host is defined
     - bootstrap_host != inventory_hostname
+
+- import_tasks: wait_for_loadbalancer.yml
diff --git a/ansible/roles/mariadb/tasks/register.yml b/ansible/roles/mariadb/tasks/register.yml
index bdcd12eb2e..a2984397e2 100644
--- a/ansible/roles/mariadb/tasks/register.yml
+++ b/ansible/roles/mariadb/tasks/register.yml
@@ -13,6 +13,8 @@
       priv: "*.*:USAGE"
   run_once: True
 
+- import_tasks: wait_for_loadbalancer.yml
+
 - name: Creating the Percona XtraBackup database
   kolla_toolbox:
     module_name: mysql_db
diff --git a/ansible/roles/mariadb/tasks/wait_for_loadbalancer.yml b/ansible/roles/mariadb/tasks/wait_for_loadbalancer.yml
new file mode 100644
index 0000000000..da6bd55c2e
--- /dev/null
+++ b/ansible/roles/mariadb/tasks/wait_for_loadbalancer.yml
@@ -0,0 +1,16 @@
+---
+# Explicitly wait for the database to be accessible via the load balancer.
+# Sometimes it can reject connections even when all database services are up,
+# due to the health check polling in HAProxy.
+- name: wait for MariaDB to be available via HAProxy
+  wait_for:
+    host: "{{ database_address }}"
+    port: "{{ database_port }}"
+    connect_timeout: 1
+    timeout: 60
+    search_regex: "MariaDB"
+  register: check_mariadb_port
+  until: check_mariadb_port is success
+  retries: 10
+  delay: 6
+  run_once: True
-- 
GitLab