summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingxian Kong <anlin.kong@gmail.com>2021-07-10 15:50:14 +1200
committerLingxian Kong <anlin.kong@gmail.com>2021-07-12 20:04:09 +0000
commit67db4d40f5944aa43eeeb3275e905f48e42688e6 (patch)
treeaee6f7f5b61b3f19eb772231fca9737b4bac166c
parentae5904f92870c2726d47d693342e2f5d24c5630c (diff)
downloadtrove-67db4d40f5944aa43eeeb3275e905f48e42688e6.tar.gz
Fix rebuild instances in replication cluster
Story: 2009043 Task: 42806 Change-Id: I3499956a7ba0a5d0ab4a49f5938ce038446d91b7 (cherry picked from commit f0bf45ea120f5b22be50fdc0f588c431fea0e8f5)
-rwxr-xr-xtrove/taskmanager/models.py33
1 files changed, 31 insertions, 2 deletions
diff --git a/trove/taskmanager/models.py b/trove/taskmanager/models.py
index 4acb9203..7a0859bb 100755
--- a/trove/taskmanager/models.py
+++ b/trove/taskmanager/models.py
@@ -55,6 +55,7 @@ from trove.common.notification import TroveInstanceCreate
from trove.common.notification import TroveInstanceModifyFlavor
from trove.common.strategies.cluster import strategy
from trove.common.utils import try_recover
+from trove.configuration import models as config_models
from trove.extensions.mysql import models as mysql_models
from trove.instance import models as inst_models
from trove.instance import service_status as srvstatus
@@ -2073,6 +2074,11 @@ class MigrateAction(ResizeActionBase):
class RebuildAction(ResizeActionBase):
def __init__(self, instance, image_id):
+ """The action to perform rebuild.
+
+ :param instance: A BuiltInstanceTasks instance.
+ :param image_id: Image ID.
+ """
super(RebuildAction, self).__init__(instance)
self.image_id = image_id
self.ignore_stop_error = True
@@ -2102,14 +2108,16 @@ class RebuildAction(ResizeActionBase):
def _assert_processes_are_ok(self):
"""Send rebuild async request to the guest and wait."""
+ context = self.instance.context
flavor = self.instance.nova_client.flavors.get(self.instance.flavor_id)
config = self.instance._render_config(flavor)
config_contents = config.config_contents
overrides = {}
if self.instance.configuration:
- overrides = self.instance.configuration. \
- get_configuration_overrides()
+ user_config = config_models.Configuration(
+ context, self.instance.configuration.id)
+ overrides = user_config.get_configuration_overrides()
LOG.info(f"Sending rebuild request to the instance {self.instance.id}")
self.instance.guest.rebuild(
@@ -2119,6 +2127,27 @@ class RebuildAction(ResizeActionBase):
LOG.info(f"Waiting for instance {self.instance.id} healthy")
self._assert_guest_is_ok()
self.wait_for_healthy()
+
+ # Restore replication config for primary
+ if self.instance.slaves:
+ LOG.info(f"Enabling {self.instance.id} as primay after rebuild")
+ self.instance.enable_as_master()
+
+ # Restart all the replicas to reconnect with the primary
+ for replica in self.instance.slaves:
+ LOG.info(f"Restarting replica {replica.id} after rebuild "
+ f"primary {self.instance.id}")
+ replica_tasks = BuiltInstanceTasks.load(context, replica.id)
+ replica_tasks.restart()
+
+ # Restore replication config for replica
+ elif self.instance.slave_of_id:
+ LOG.info(f"Re-attaching replica {self.instance.id} after rebuild")
+ primary = BuiltInstanceTasks.load(
+ context, self.instance.slave_of_id)
+ self.instance.detach_replica(primary, for_failover=True)
+ self.instance.attach_replica(primary, restart=True)
+
LOG.info(f"Finished to rebuild {self.instance.id}")
def _revert_nova_action(self):