Wrap db sync in tenacity retry
Switch the charm to retry db-sync. This is a precursor to having all units run the db sync. If a table is locked by another unit the db sync command hangs until the lock is released so the most likely error condition is a command timeout. Change-Id: I1605220b9f605c8d98859c705c8498328c05edd2
This commit is contained in:
parent
14c10fe060
commit
00930c7419
@ -42,6 +42,7 @@ import ops.framework
|
|||||||
import ops.model
|
import ops.model
|
||||||
import ops.pebble
|
import ops.pebble
|
||||||
import ops.storage
|
import ops.storage
|
||||||
|
import tenacity
|
||||||
from lightkube import (
|
from lightkube import (
|
||||||
Client,
|
Client,
|
||||||
)
|
)
|
||||||
@ -411,6 +412,22 @@ class OSBaseOperatorCharm(ops.charm.CharmBase):
|
|||||||
"""Name of Containerto run db sync from."""
|
"""Name of Containerto run db sync from."""
|
||||||
return self.service_name
|
return self.service_name
|
||||||
|
|
||||||
|
@tenacity.retry(
|
||||||
|
stop=tenacity.stop_after_attempt(3),
|
||||||
|
retry=tenacity.retry_if_exception_type(ops.pebble.ChangeError),
|
||||||
|
after=tenacity.after_log(logger, logging.WARNING),
|
||||||
|
wait=tenacity.wait_exponential(multiplier=1, min=10, max=300),
|
||||||
|
)
|
||||||
|
def _retry_db_sync(self, cmd):
|
||||||
|
container = self.unit.get_container(self.db_sync_container_name)
|
||||||
|
logging.debug("Running sync: \n%s", cmd)
|
||||||
|
process = container.exec(cmd, timeout=5 * 60)
|
||||||
|
out, warnings = process.wait_output()
|
||||||
|
if warnings:
|
||||||
|
for line in warnings.splitlines():
|
||||||
|
logger.warning("DB Sync Out: %s", line.strip())
|
||||||
|
logging.debug("Output from database sync: \n%s", out)
|
||||||
|
|
||||||
def run_db_sync(self) -> None:
|
def run_db_sync(self) -> None:
|
||||||
"""Run DB sync to init DB.
|
"""Run DB sync to init DB.
|
||||||
|
|
||||||
@ -422,17 +439,13 @@ class OSBaseOperatorCharm(ops.charm.CharmBase):
|
|||||||
try:
|
try:
|
||||||
if self.db_sync_cmds:
|
if self.db_sync_cmds:
|
||||||
logger.info("Syncing database...")
|
logger.info("Syncing database...")
|
||||||
container = self.unit.get_container(
|
|
||||||
self.db_sync_container_name
|
|
||||||
)
|
|
||||||
for cmd in self.db_sync_cmds:
|
for cmd in self.db_sync_cmds:
|
||||||
logging.debug("Running sync: \n%s", cmd)
|
try:
|
||||||
process = container.exec(cmd, timeout=5 * 60)
|
self._retry_db_sync(cmd)
|
||||||
out, warnings = process.wait_output()
|
except tenacity.RetryError:
|
||||||
if warnings:
|
raise sunbeam_guard.BlockedExceptionError(
|
||||||
for line in warnings.splitlines():
|
"DB sync failed"
|
||||||
logger.warning("DB Sync Out: %s", line.strip())
|
)
|
||||||
logging.debug("Output from database sync: \n%s", out)
|
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"Not DB sync ran. Charm does not specify self.db_sync_cmds"
|
"Not DB sync ran. Charm does not specify self.db_sync_cmds"
|
||||||
|
@ -6,3 +6,4 @@ python-keystoneclient
|
|||||||
git+https://github.com/openstack/charm-ops-interface-ceph-client#egg=interface_ceph_client
|
git+https://github.com/openstack/charm-ops-interface-ceph-client#egg=interface_ceph_client
|
||||||
lightkube
|
lightkube
|
||||||
lightkube-models
|
lightkube-models
|
||||||
|
tenacity
|
||||||
|
@ -23,6 +23,7 @@ from setuptools import setup, find_packages
|
|||||||
version = "0.0.1.dev1"
|
version = "0.0.1.dev1"
|
||||||
install_require = [
|
install_require = [
|
||||||
'ops',
|
'ops',
|
||||||
|
'tenacity',
|
||||||
]
|
]
|
||||||
|
|
||||||
tests_require = [
|
tests_require = [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user