Optimize VM list in API
With many VMs this slows down linearly. Rework it a bit so there are fewer calls to getInformationFromXML and so the processing could happen in parallel at some point.
This commit is contained in:
		@@ -821,7 +821,6 @@ def get_list(zkhandler, node, state, limit, is_fuzzy=True):
 | 
			
		||||
            return False, 'VM state "{}" is not valid.'.format(state)
 | 
			
		||||
 | 
			
		||||
    full_vm_list = zkhandler.children('base.domain')
 | 
			
		||||
    vm_list = []
 | 
			
		||||
 | 
			
		||||
    # Set our limit to a sensible regex
 | 
			
		||||
    if limit and is_fuzzy:
 | 
			
		||||
@@ -834,38 +833,46 @@ def get_list(zkhandler, node, state, limit, is_fuzzy=True):
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            return False, 'Regex Error: {}'.format(e)
 | 
			
		||||
 | 
			
		||||
    # If we're limited, remove other nodes' VMs
 | 
			
		||||
    vm_node = {}
 | 
			
		||||
    vm_state = {}
 | 
			
		||||
    get_vm_info = dict()
 | 
			
		||||
    for vm in full_vm_list:
 | 
			
		||||
        # Check we don't match the limit
 | 
			
		||||
        name = zkhandler.read(('domain', vm))
 | 
			
		||||
        vm_node[vm] = zkhandler.read(('domain.node', vm))
 | 
			
		||||
        vm_state[vm] = zkhandler.read(('domain.state', vm))
 | 
			
		||||
        # Handle limiting
 | 
			
		||||
        is_limit_match = False
 | 
			
		||||
        is_node_match = False
 | 
			
		||||
        is_state_match = False
 | 
			
		||||
 | 
			
		||||
        # Check on limit
 | 
			
		||||
        if limit:
 | 
			
		||||
            try:
 | 
			
		||||
                if re.match(limit, vm):
 | 
			
		||||
                    if not node and not state:
 | 
			
		||||
                        vm_list.append(common.getInformationFromXML(zkhandler, vm))
 | 
			
		||||
                    else:
 | 
			
		||||
                        if vm_node[vm] == node or vm_state[vm] == state:
 | 
			
		||||
                            vm_list.append(common.getInformationFromXML(zkhandler, vm))
 | 
			
		||||
 | 
			
		||||
                    is_limit_match = True
 | 
			
		||||
                if re.match(limit, name):
 | 
			
		||||
                    if not node and not state:
 | 
			
		||||
                        vm_list.append(common.getInformationFromXML(zkhandler, vm))
 | 
			
		||||
                    else:
 | 
			
		||||
                        if vm_node[vm] == node or vm_state[vm] == state:
 | 
			
		||||
                            vm_list.append(common.getInformationFromXML(zkhandler, vm))
 | 
			
		||||
                    is_limit_match = True
 | 
			
		||||
            except Exception as e:
 | 
			
		||||
                return False, 'Regex Error: {}'.format(e)
 | 
			
		||||
        else:
 | 
			
		||||
            # Check node to avoid unneeded ZK calls
 | 
			
		||||
            if not node and not state:
 | 
			
		||||
                vm_list.append(common.getInformationFromXML(zkhandler, vm))
 | 
			
		||||
            else:
 | 
			
		||||
                if vm_node[vm] == node or vm_state[vm] == state:
 | 
			
		||||
                    vm_list.append(common.getInformationFromXML(zkhandler, vm))
 | 
			
		||||
            is_limit_match = True
 | 
			
		||||
 | 
			
		||||
        # Check on node
 | 
			
		||||
        if node:
 | 
			
		||||
            vm_node = zkhandler.read(('domain.node', vm))
 | 
			
		||||
            if vm_node == node:
 | 
			
		||||
                is_node_match = True
 | 
			
		||||
        else:
 | 
			
		||||
            is_node_match = True
 | 
			
		||||
 | 
			
		||||
        # Check on state
 | 
			
		||||
        if state:
 | 
			
		||||
            vm_state = zkhandler.read(('domain.state', vm))
 | 
			
		||||
            if vm_state == state:
 | 
			
		||||
                is_state_match = True
 | 
			
		||||
        else:
 | 
			
		||||
            is_state_match = True
 | 
			
		||||
 | 
			
		||||
        if is_limit_match and is_node_match and is_state_match:
 | 
			
		||||
            get_vm_info[vm] = True
 | 
			
		||||
        else:
 | 
			
		||||
            get_vm_info[vm] = False
 | 
			
		||||
 | 
			
		||||
    vm_list = [common.getInformationFromXML(zkhandler, vm) for vm in full_vm_list if get_vm_info[vm]]
 | 
			
		||||
 | 
			
		||||
    return True, vm_list
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user