Hi Mice,

I think option#2 is better because it will avoid unnecessary iterations and 
return when first fit satisfying both volume allocations and host linkage is 
found.

However I think it would be good to do all the size computation in a separate 
method for readability.

Also following needs to be fixed in your logic:


1)  haveEnoughSpace should be initialized to false for every Volume iteration

2)  If for some volume none of the pool seems to have enough space (due to 
other prior volumes allocated), we need not continue - error out there.

Thus add the check if(!haveEnoughSpace) { //error/ } inside the l

3)  storageUsedMap should be initialized for every host iteration, otherwise 
while trying the second host 'requestedSpaceSize' might be wrong.


4)  Before iterating over the volumes, I think we should sort the list in 
descending order of volume size - so that volume needing the largest chunk of 
space gets mapped to the pool first.



This will avoid the situation like this:

volA 4G, volb 6G

SP1 6G, SP2 4G

Allocator could  return volA -> SP1, SP2 and volB -> SP1.
If you choose the pool for VolA first, then VolB might not find a fit. But if 
we sort by size and choose pool for VolB first, we might find a destination.


Thanks,
Prachi


From: Mice Xia [mailto:mice_...@tcloudcomputing.com]
Sent: Wednesday, July 25, 2012 6:43 AM
To: Edison Su
Cc: cloudstack-dev@incubator.apache.org; Prachi Damle; Nitin Mehta
Subject: Re: Review Request: CS-15609 Volumes can be created as a part of VM 
creation when un-allocated space is insufficient on primary storage



Hi Edison,

after some further investigation, i found it is non-trivial to put this logic 
in findSuitablePoolsForVolumes.

method findSuitablePoolsForVolumes is essentially used for listing all storage 
pools for one individual volume.(it even gets a parameter 'returnUpTo'). if it 
has to deal with more then one volumes, the computation there will be 
exponential, it is basically a tree recursive search for all possible volume 
allocation on storagepools, think about following example.

volA 20G , volB 30G
SP1 40G, sp2 60G

there are three possible allocation:
volA->SP1 volB->SP2
volA->SP2 volB->SP2
volA->SP2 volB->SP1

this seems not very efficient and the return signature may need a change.

back to this multiple volumes capacity check issue, i would like to suggest 
following two approaches:
1) put special check logic in findSuitablePoolsForVolumes, but, instead of 
recursive exploring, return immediately when the first possible allocation is 
found.
2) or keep it in findPotentialDeploymentResources, while 
findSuitablePoolsForVolumes is responsbile for providing pools for single 
volume, findPotentialDeploymentResources will check them as a whole and it will 
return immediately after find a proper allocation.

please adivce, thanks

Regards
Mice


Reply via email to