Wait for existing migrations before proceeding
This commit is contained in:
		| @@ -354,6 +354,13 @@ class VMInstance(object): | |||||||
|             zkhandler.writedata(self.zk_conn, { '/domains/{}/lastnode'.format(self.domuuid): '' }) |             zkhandler.writedata(self.zk_conn, { '/domains/{}/lastnode'.format(self.domuuid): '' }) | ||||||
|             return |             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.inmigrate = True | ||||||
|         self.logger.out('Migrating VM to node "{}"'.format(self.node), state='i', prefix='Domain {}'.format(self.domuuid)) |         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 |     # Receive the migration from another host | ||||||
|     def receive_migrate(self): |     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 |         self.inreceive = True | ||||||
|         live_receive = 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)) |         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.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.state = zkhandler.readdata(self.zk_conn, '/domains/{}/state'.format(self.domuuid)) | ||||||
|         self.dom = self.lookupByUUID(self.domuuid) |         self.dom = self.lookupByUUID(self.domuuid) | ||||||
|         if self.dom: |         if self.dom: | ||||||
| @@ -536,7 +554,7 @@ class VMInstance(object): | |||||||
|                 zkhandler.writedata(self.zk_conn, { '/domains/{}/state'.format(self.domuuid): 'start' }) |                 zkhandler.writedata(self.zk_conn, { '/domains/{}/state'.format(self.domuuid): 'start' }) | ||||||
|             else: |             else: | ||||||
|                 # The send failed catastrophically |                 # 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)) |         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': '' }) |         zkhandler.writedata(self.zk_conn, { '/locks/domain_migrate': '' }) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user