summaryrefslogtreecommitdiff
path: root/trove/instance/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'trove/instance/models.py')
-rw-r--r--trove/instance/models.py62
1 files changed, 32 insertions, 30 deletions
diff --git a/trove/instance/models.py b/trove/instance/models.py
index c33ea1c6..70bd6fd6 100644
--- a/trove/instance/models.py
+++ b/trove/instance/models.py
@@ -602,24 +602,30 @@ def load_instance(cls, context, id, needs_server=False,
return cls(context, db_info, server, service_status)
-def load_instance_with_info(cls, context, id, cluster_id=None):
- db_info = get_db_info(context, id, cluster_id)
- LOG.debug('Task status for instance %s: %s', id, db_info.task_status)
-
- service_status = InstanceServiceStatus.find_by(instance_id=id)
- if (db_info.task_status == InstanceTasks.NONE and
- not service_status.is_uptodate()):
- LOG.warning('Guest agent heartbeat for instance %s has expried', id)
+def update_service_status(task_status, service_status, ins_id):
+ """Update service status as needed."""
+ if (task_status == InstanceTasks.NONE and
+ service_status.status != srvstatus.ServiceStatuses.RESTART_REQUIRED and
+ not service_status.is_uptodate()):
+ LOG.warning('Guest agent heartbeat for instance %s has expried',
+ ins_id)
service_status.status = \
srvstatus.ServiceStatuses.FAILED_TIMEOUT_GUESTAGENT
+
+def load_instance_with_info(cls, context, ins_id, cluster_id=None):
+ db_info = get_db_info(context, ins_id, cluster_id)
+ service_status = InstanceServiceStatus.find_by(instance_id=ins_id)
+
+ update_service_status(db_info.task_status, service_status, ins_id)
+
load_simple_instance_server_status(context, db_info)
load_simple_instance_addresses(context, db_info)
instance = cls(context, db_info, service_status)
- load_guest_info(instance, context, id)
+ load_guest_info(instance, context, ins_id)
load_server_group_info(instance, context)
@@ -897,6 +903,11 @@ class BaseInstance(SimpleInstance):
del_instance.set_status(srvstatus.ServiceStatuses.DELETED)
del_instance.save()
+ def set_servicestatus_restart(self):
+ del_instance = InstanceServiceStatus.find_by(instance_id=self.id)
+ del_instance.set_status(srvstatus.ServiceStatuses.RESTARTING)
+ del_instance.save()
+
def set_instance_fault_deleted(self):
try:
del_fault = DBInstanceFault.find_by(instance_id=self.id)
@@ -1432,7 +1443,10 @@ class Instance(BuiltInstance):
LOG.info("Rebooting instance %s.", self.id)
if self.db_info.cluster_id is not None and not self.context.is_admin:
raise exception.ClusterInstanceOperationNotSupported()
+
self.update_db(task_status=InstanceTasks.REBOOTING)
+ self.set_servicestatus_restart()
+
task_api.API(self.context).reboot(self.id)
def restart(self):
@@ -1440,13 +1454,10 @@ class Instance(BuiltInstance):
LOG.info("Restarting datastore on instance %s.", self.id)
if self.db_info.cluster_id is not None and not self.context.is_admin:
raise exception.ClusterInstanceOperationNotSupported()
- # Set our local status since Nova might not change it quick enough.
- # TODO(tim.simpson): Possible bad stuff can happen if this service
- # shuts down before it can set status to NONE.
- # We need a last updated time to mitigate this;
- # after some period of tolerance, we'll assume the
- # status is no longer in effect.
+
self.update_db(task_status=InstanceTasks.REBOOTING)
+ self.set_servicestatus_restart()
+
task_api.API(self.context).restart(self.id)
def detach_replica(self):
@@ -1819,9 +1830,9 @@ class Instances(object):
db.server_status = "SHUTDOWN" # Fake it...
db.addresses = []
- datastore_status = InstanceServiceStatus.find_by(
+ service_status = InstanceServiceStatus.find_by(
instance_id=db.id)
- if not datastore_status.status: # This should never happen.
+ if not service_status.status: # This should never happen.
LOG.error("Server status could not be read for "
"instance id(%s).", db.id)
continue
@@ -1829,24 +1840,15 @@ class Instances(object):
# Get the real-time service status.
LOG.debug('Task status for instance %s: %s', db.id,
db.task_status)
- if db.task_status == InstanceTasks.NONE:
- last_heartbeat_delta = (
- timeutils.utcnow() - datastore_status.updated_at)
- agent_expiry_interval = timedelta(
- seconds=CONF.agent_heartbeat_expiry)
- if last_heartbeat_delta > agent_expiry_interval:
- LOG.warning(
- 'Guest agent heartbeat for instance %s has '
- 'expried', id)
- datastore_status.status = \
- srvstatus.ServiceStatuses.FAILED_TIMEOUT_GUESTAGENT
+ update_service_status(db.task_status, service_status, db.id)
except exception.ModelNotFoundError:
LOG.error("Server status could not be read for "
"instance id(%s).", db.id)
continue
- ret.append(load_instance(context, db, datastore_status,
- server=server))
+ ret.append(
+ load_instance(context, db, service_status, server=server)
+ )
return ret