summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@yahoo.com>2010-09-11 23:51:28 -0700
committerVishvananda Ishaya <vishvananda@yahoo.com>2010-09-11 23:51:28 -0700
commitbe1b1e320c17630430cfa567d8685f8cfc5773e4 (patch)
tree89d1d26cb22ee83340a705a3c6d3090b16bb8364
parent85876fc1fa3dc7cb289e59712ab5a2b20877fc58 (diff)
make fixed_ip_get_by_address return the instance as well so we don't run into concurrency issues where it is disassociated in between
-rw-r--r--nova/db/sqlalchemy/api.py16
-rw-r--r--nova/network/manager.py4
2 files changed, 16 insertions, 4 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 4cc086006..3d3b766fc 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -19,13 +19,15 @@
Implementation of SQLAlchemy backend
"""
+import sys
+
from nova import db
from nova import exception
from nova import flags
from nova.db.sqlalchemy import models
from nova.db.sqlalchemy.session import get_session
from sqlalchemy import or_
-from sqlalchemy.orm import joinedload_all
+from sqlalchemy.orm import exc, joinedload_all
FLAGS = flags.FLAGS
@@ -243,7 +245,17 @@ def fixed_ip_disassociate(_context, address):
def fixed_ip_get_by_address(_context, address):
- return models.FixedIp.find_by_str(address)
+ session = get_session()
+ with session.begin():
+ try:
+ return session.query(models.FixedIp
+ ).options(joinedload_all('instance')
+ ).filter_by(address=address
+ ).filter_by(deleted=False
+ ).one()
+ except exc.NoResultFound:
+ new_exc = exception.NotFound("No model for address %s" % address)
+ raise new_exc.__class__, new_exc, sys.exc_info()[2]
def fixed_ip_get_instance(_context, address):
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 7a3bcfc2f..9564a3e33 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -262,7 +262,7 @@ class VlanManager(NetworkManager):
if not fixed_ip_ref['allocated']:
logging.warn("IP %s leased that was already deallocated", address)
return
- instance_ref = self.db.fixed_ip_get_instance(context, address)
+ instance_ref = fixed_ip_ref['instance']
if not instance_ref:
raise exception.Error("IP %s leased that isn't associated" %
address)
@@ -280,7 +280,7 @@ class VlanManager(NetworkManager):
if not fixed_ip_ref['leased']:
logging.warn("IP %s released that was not leased", address)
return
- instance_ref = self.db.fixed_ip_get_instance(context, address)
+ instance_ref = fixed_ip_ref['instance']
if not instance_ref:
raise exception.Error("IP %s released that isn't associated" %
address)