Description
===========
In rocky cycle, 'GET /allocation_candidates' started to be aware of nested providers from microversion 1.29.
From microversion 1.29, it can join allocations from resource providers in the same tree.
To keep the behavior of microversion before 1.29, it filters nested providers [1]
This function "_exclude_nested_providers()" is skipped on microversion >= 1.29 but is heavy on microversion < 1.29.
This is executed and still heavy even if there is no nested providers in the environment when microversion < 1.29.
* Create about 6000 resource providers with some inventory and aggregates (using placeload [2])
* Query "GET /allocation_candidates?resources=VCPU:1,DISK_GB:10,MEMORY_MB:256&member_of=${SOME_AGGREGATE}&required=${SOME_TRAIT}" with microversion 1.29 and 1.25
* No performance difference with microversion 1.25 <-> 1.29
Actual (Ideal) result
==================
* __15.995s__ for microversion 1.25
* __5.541s__ for microversion 1.29
with profiler enabled,
* __32.219s__ for microversion 1.25 - Note that 24.1s(75%) is consumed in the "_exclude_nested_providers()"
* __7.871s__ for microversion 1.29 - Note that this is roughly 32.219s - 24.1s...
Description candidates' started to be aware of nested providers from microversion 1.29.
===========
In rocky cycle, 'GET /allocation_
From microversion 1.29, it can join allocations from resource providers in the same tree.
To keep the behavior of microversion before 1.29, it filters nested providers [1] nested_ providers( )" is skipped on microversion >= 1.29 but is heavy on microversion < 1.29.
This function "_exclude_
This is executed and still heavy even if there is no nested providers in the environment when microversion < 1.29.
[1] https:/ /github. com/openstack/ placement/ blob/e69366675a 2ee4532ae303910 4b1a5ee8d775083 /placement/ handlers/ allocation_ candidate. py#L207- L238
Steps to reproduce
==================
* Create about 6000 resource providers with some inventory and aggregates (using placeload [2]) candidates? resources= VCPU:1, DISK_GB: 10,MEMORY_ MB:256& member_ of=${SOME_ AGGREGATE} &required= ${SOME_ TRAIT}" with microversion 1.29 and 1.25
* Query "GET /allocation_
[2] https:/ /github. com/cdent/ placeload/ tree/master/ placeload
Expected (Ideal) result
==================
* No performance difference with microversion 1.25 <-> 1.29
Actual (Ideal) result
==================
* __15.995s__ for microversion 1.25
* __5.541s__ for microversion 1.29
with profiler enabled,
* __32.219s__ for microversion 1.25 - Note that 24.1s(75%) is consumed in the "_exclude_ nested_ providers( )"
* __7.871s__ for microversion 1.29 - Note that this is roughly 32.219s - 24.1s...