Skip to content

Commit

Permalink
Fix race condition for grastate.dat
Browse files Browse the repository at this point in the history
There seems to be a race condition involving the grastate.dat file.
Upon creation of a new mariad-server pod the file would exist however,
it is not populated for a short period of time. It seems to take
around 15-20 seconds for this file to be populated. However there is
a separate thread which is attempting to read the file and tends to
end in an IndexError exception killing the thread which maintains the
grastate.dat file until the pod is restarted. This patchset adds a
loop to check for up to 60 seconds for the file to be populated
before attempting to continue, thus giving the file time to be
populated.

Change-Id: I2f2a801aa4528a7af61797419422572be1c82e75
  • Loading branch information
Neely, Travis M committed Apr 19, 2021
1 parent 38e6023 commit f33a629
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 3 deletions.
2 changes: 1 addition & 1 deletion mariadb/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ apiVersion: v1
appVersion: v10.2.31
description: OpenStack-Helm MariaDB
name: mariadb
version: 0.1.12
version: 0.1.13
home: https://mariadb.com/kb/en/
icon: http:https://badges.mariadb.org/mariadb-badge-180x60.png
sources:
Expand Down
15 changes: 13 additions & 2 deletions mariadb/templates/bin/_start.py.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -497,8 +497,19 @@ def get_grastate_val(key):
"""
logger.debug("Reading grastate.dat key={0}".format(key))
try:
with open("/var/lib/mysql/grastate.dat", "r") as myfile:
grastate_raw = [s.strip() for s in myfile.readlines()]
# This attempts to address a potential race condition with the initial
# creation of the grastate.date file where the file would exist
# however, it is not immediately populated. Testing indicated it could
# take 15-20 seconds for the file to be populated. So loop and keep
# checking up to 60 seconds. If it still isn't populated afterwards,
# the IndexError will still occur as we are seeing now without the loop.
time_end = time.time() + 60
while time.time() < time_end:
with open("/var/lib/mysql/grastate.dat", "r") as myfile:
grastate_raw = [s.strip() for s in myfile.readlines()]
if grastate_raw:
break
time.sleep(1)
return [i for i in grastate_raw
if i.startswith("{0}:".format(key))][0].split(':')[1].strip()
except IndexError:
Expand Down
1 change: 1 addition & 0 deletions releasenotes/notes/mariadb.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ mariadb:
- 0.1.10 Rename mariadb backup identities
- 0.1.11 Disable mariadb mysql history client logging
- 0.1.12 Set strict permission on mariadb data dir
- 0.1.13 Fix race condition for grastate.dat
...

0 comments on commit f33a629

Please sign in to comment.