Randomize tunnel id query to avoid contention
When networks are created rapidly, neutron-servers compete for segmentation ids which creates too much contention and may lead to inability to choose available id in hardcoded amount of attempts (11) Randomize tunnel id selection so that condition is not hit. Change-Id: I7068f90fe4927e6e693f8a62cb704213b2da2920 Related-Bug: #1382064 Closes-Bug: #1454434
This commit is contained in:
parent
0933f26b2c
commit
1d9fd2aec0
|
@ -13,6 +13,8 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import random
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_db import exception as db_exc
|
from oslo_db import exception as db_exc
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
|
@ -24,6 +26,8 @@ from neutron.plugins.ml2 import driver_api as api
|
||||||
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
IDPOOL_SELECT_SIZE = 100
|
||||||
|
|
||||||
|
|
||||||
class BaseTypeDriver(api.TypeDriver):
|
class BaseTypeDriver(api.TypeDriver):
|
||||||
"""BaseTypeDriver for functions common to Segment and flat."""
|
"""BaseTypeDriver for functions common to Segment and flat."""
|
||||||
|
@ -121,12 +125,13 @@ class SegmentTypeDriver(BaseTypeDriver):
|
||||||
filter_by(allocated=False, **filters))
|
filter_by(allocated=False, **filters))
|
||||||
|
|
||||||
# Selected segment can be allocated before update by someone else,
|
# Selected segment can be allocated before update by someone else,
|
||||||
alloc = select.first()
|
allocs = select.limit(IDPOOL_SELECT_SIZE).all()
|
||||||
|
|
||||||
if not alloc:
|
if not allocs:
|
||||||
# No resource available
|
# No resource available
|
||||||
return
|
return
|
||||||
|
|
||||||
|
alloc = random.choice(allocs)
|
||||||
raw_segment = dict((k, alloc[k]) for k in self.primary_keys)
|
raw_segment = dict((k, alloc[k]) for k in self.primary_keys)
|
||||||
LOG.debug("%(type)s segment allocate from pool "
|
LOG.debug("%(type)s segment allocate from pool "
|
||||||
"started with %(segment)s ",
|
"started with %(segment)s ",
|
||||||
|
|
Loading…
Reference in New Issue