summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingxian Kong <anlin.kong@gmail.com>2020-11-05 09:44:57 +1300
committerLingxian Kong <anlin.kong@gmail.com>2020-11-10 12:08:51 +1300
commit29c336c6751dcc6a9080a8b13d6e7c9f7ff92a53 (patch)
tree412382b9abb7b442b8f8530caadc6a2c3e1a710a
parent679cc3adbdba120f25b7cf43ee238d79a0d8147b (diff)
downloadtrove-29c336c6751dcc6a9080a8b13d6e7c9f7ff92a53.tar.gz
Fix upgrading instance datastore version
Change-Id: I0456688c2e6c72b0312f1f79bb3e68f13fd2cb6e (cherry picked from commit 59a972b312c8d25ffb46b4a994374490731747ea)
-rw-r--r--trove/guestagent/datastore/mysql_common/service.py5
-rw-r--r--trove/guestagent/utils/docker.py8
-rw-r--r--trove/instance/service.py9
3 files changed, 22 insertions, 0 deletions
diff --git a/trove/guestagent/datastore/mysql_common/service.py b/trove/guestagent/datastore/mysql_common/service.py
index a20aa574..339170bb 100644
--- a/trove/guestagent/datastore/mysql_common/service.py
+++ b/trove/guestagent/datastore/mysql_common/service.py
@@ -800,6 +800,8 @@ class BaseMySqlApp(service.BaseDbApp):
def upgrade(self, upgrade_info):
"""Upgrade the database."""
new_version = upgrade_info.get('datastore_version')
+ if new_version == CONF.datastore_version:
+ return
LOG.info('Stopping db container for upgrade')
self.stop_db()
@@ -807,6 +809,9 @@ class BaseMySqlApp(service.BaseDbApp):
LOG.info('Deleting db container for upgrade')
docker_util.remove_container(self.docker_client)
+ LOG.info('Remove unused images before starting new db container')
+ docker_util.prune_images(self.docker_client)
+
LOG.info('Starting new db container with version %s for upgrade',
new_version)
self.start_db(update_db=True, ds_version=new_version)
diff --git a/trove/guestagent/utils/docker.py b/trove/guestagent/utils/docker.py
index da3ad412..0fdda049 100644
--- a/trove/guestagent/utils/docker.py
+++ b/trove/guestagent/utils/docker.py
@@ -151,3 +151,11 @@ def get_container_logs(client, name='database', tail=50):
container = client.containers.get(name)
output = container.logs(tail=tail)
return _decode_output(output)
+
+
+def prune_images(client):
+ """Remove unused images."""
+ try:
+ client.images.prune(filters={'dangling': False})
+ except Exception as e:
+ LOG.warning(f"Prune image failed, error: {str(e)}")
diff --git a/trove/instance/service.py b/trove/instance/service.py
index 883c1cd3..536d2136 100644
--- a/trove/instance/service.py
+++ b/trove/instance/service.py
@@ -521,6 +521,12 @@ class InstanceController(wsgi.Controller):
elif 'datastore_version' in kwargs:
datastore_version = ds_models.DatastoreVersion.load(
instance.datastore, kwargs['datastore_version'])
+
+ if datastore_version.name == instance.ds_version.name:
+ LOG.warning(f"Same datastore version {datastore_version.name} "
+ f"for upgrading")
+ return
+
context.notification = (
notification.DBaaSInstanceUpgrade(context, request=req))
with StartNotification(context, instance_id=instance.id,
@@ -568,6 +574,9 @@ class InstanceController(wsgi.Controller):
if 'access' in body['instance']:
args['access'] = body['instance']['access']
+ if 'datastore_version' in body['instance']:
+ args['datastore_version'] = body['instance']['datastore_version']
+
self._modify_instance(context, req, instance, **args)
return wsgi.Result(None, 202)