From 567fe8f36b95de91b8dbcdbcff763e8ba5d995aa Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Tue, 20 Oct 2020 14:54:48 -0400 Subject: [PATCH] Wait for existing migrations before proceeding --- node-daemon/pvcnoded/VMInstance.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/node-daemon/pvcnoded/VMInstance.py b/node-daemon/pvcnoded/VMInstance.py index 496e6107..fa2415ab 100644 --- a/node-daemon/pvcnoded/VMInstance.py +++ b/node-daemon/pvcnoded/VMInstance.py @@ -354,6 +354,13 @@ class VMInstance(object): zkhandler.writedata(self.zk_conn, { '/domains/{}/lastnode'.format(self.domuuid): '' }) return + # Wait for any in-progress migrations + if zkhandler.readdata(self.zk_conn, '/locks/domain_migrate') != '': + self.logger.out('Queueing for completion of existing migration', state='i', prefix='Domain {}'.format(self.domuuid)) + while zkhandler.readdata(self.zk_conn, '/locks/domain_migrate') != '': + time.sleep(0.1) + time.sleep(0.5) + self.inmigrate = True self.logger.out('Migrating VM to node "{}"'.format(self.node), state='i', prefix='Domain {}'.format(self.domuuid)) @@ -469,6 +476,17 @@ class VMInstance(object): # Receive the migration from another host def receive_migrate(self): + # Don't try to migrate a node to itself + if self.node == self.lastnode: + return + + # Wait for any in-progress migrations + if zkhandler.readdata(self.zk_conn, '/locks/domain_migrate') != '': + self.logger.out('Queueing for completion of existing migration', state='i', prefix='Domain {}'.format(self.domuuid)) + while zkhandler.readdata(self.zk_conn, '/locks/domain_migrate') != '': + time.sleep(0.1) + time.sleep(0.5) + self.inreceive = True live_receive = True @@ -514,7 +532,7 @@ class VMInstance(object): self.logger.out('Acquired write lock for synchronization phase D', state='o', prefix='Domain {}'.format(self.domuuid)) time.sleep(0.2) # Time for reader to acquire the lock - time.sleep(0.1) + time.sleep(0.3) self.state = zkhandler.readdata(self.zk_conn, '/domains/{}/state'.format(self.domuuid)) self.dom = self.lookupByUUID(self.domuuid) if self.dom: @@ -536,7 +554,7 @@ class VMInstance(object): zkhandler.writedata(self.zk_conn, { '/domains/{}/state'.format(self.domuuid): 'start' }) else: # The send failed catastrophically - self.logger.out('Send failed catastrophically, VM in undefined state', state='e', prefix='Domain {}'.format(self.domuuid)) + self.logger.out('VM in undefined state: {}'.format(self.state), state='e', prefix='Domain {}'.format(self.domuuid)) self.logger.out('Releasing write lock for synchronization phase D', state='i', prefix='Domain {}'.format(self.domuuid)) zkhandler.writedata(self.zk_conn, { '/locks/domain_migrate': '' })