Skip to content

Commit

Permalink
Improve floating IP delete speed.
Browse files Browse the repository at this point in the history
This is similar to the change to improve bulk creation speed. Before:

./bin/nova-manage floating delete --ip_range 10.250.0.0/16
337.20user 10.22system 44:07.10elapsed 13%CPU (0avgtext+0avgdata 119536maxresident)k
400inputs+0outputs (4major+11704minor)pagefaults 0swaps

After:

./bin/nova-manage floating delete --ip_range 10.250.0.0/16
6.95user 0.16system 1:04.04elapsed 11%CPU (0avgtext+0avgdata 120016maxresident)k
0inputs+0outputs (0major+11750minor)pagefaults 0swaps

Resolves bug 1023560.

Change-Id: If4f23222025cae88576f469022e0f7d907c9c4fa
  • Loading branch information
mikalstill committed Sep 9, 2012
1 parent f348875 commit 5339141
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 9 deletions.
12 changes: 5 additions & 7 deletions bin/nova-manage
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ import optparse
import os
import sys


# If ../nova/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python...
POSSIBLE_TOPDIR = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
Expand Down Expand Up @@ -396,12 +395,11 @@ class FloatingIpCommands(object):
@args('--ip_range', dest="ip_range", metavar='<range>', help='IP range')
def delete(self, ip_range):
"""Deletes floating ips by range"""
for address in self.address_to_hosts(ip_range):
try:
db.floating_ip_destroy(context.get_admin_context(),
str(address))
except exception.FloatingIpNotFoundForAddress as ex:
print "Warning: %s" % ex
admin_context = context.get_admin_context()

ips = ({'address': str(address)}
for address in self.address_to_hosts(ip_range))
db.floating_ip_bulk_destroy(admin_context, ips)

@args('--host', dest="host", metavar='<host>', help='Host')
def list(self, host=None):
Expand Down
5 changes: 5 additions & 0 deletions nova/db/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,11 @@ def floating_ip_bulk_create(context, ips):
return IMPL.floating_ip_bulk_create(context, ips)


def floating_ip_bulk_destroy(context, ips):
"""Destroy a lot of floating ips from the values dictionary."""
return IMPL.floating_ip_bulk_destroy(context, ips)


def floating_ip_create(context, values):
"""Create a floating ip from the values dictionary."""
return IMPL.floating_ip_create(context, values)
Expand Down
34 changes: 32 additions & 2 deletions nova/db/sqlalchemy/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,35 @@ def floating_ip_bulk_create(context, ips):
session.add(model)


def _ip_range_splitter(ips):
"""Yields blocks of IPs no more than 256 elements long."""
out = []
count = 0
for ip in ips:
out.append(ip['address'])
count += 1

if count > 255:
yield out
out = []
count = 0

if out:
yield out


@require_context
def floating_ip_bulk_destroy(context, ips):
session = get_session()
with session.begin():
for ip_block in _ip_range_splitter(ips):
model_query(context, models.FloatingIp).\
filter(models.FloatingIp.address.in_(ip_block)).\
update({'deleted': True,
'deleted_at': timeutils.utcnow()},
synchronize_session='fetch')


@require_context
def floating_ip_create(context, values, session=None):
if not session:
Expand Down Expand Up @@ -838,8 +867,9 @@ def floating_ip_set_auto_assigned(context, address):
floating_ip_ref.save(session=session)


def _floating_ip_get_all(context):
return model_query(context, models.FloatingIp, read_deleted="no")
def _floating_ip_get_all(context, session=None):
return model_query(context, models.FloatingIp, read_deleted="no",
session=session)


@require_admin_context
Expand Down

0 comments on commit 5339141

Please sign in to comment.