improve speed of metadata

* don't load every possible answer, only do what is needed
 * cache instance data for a given address for a 15 seconds
   using either memcache or fake memcache (in-memory).
   This means only a single queue/db lookup for multiple calls
   to metadata service
 * add cache expirey to fake memcache (don't grow forever)
   and move it to nova.common.memorycache

Addresses Bug #851159

Change-Id: Icf794156e055b18915b8b5be9ba2ab97d2338bbe
This commit is contained in:
Jesse Andrews
2012-03-07 13:05:28 -08:00
committed by Vishvananda Ishaya
parent a8ce5c9794
commit 610df5e87d
4 changed files with 12 additions and 8 deletions

View File

@@ -96,7 +96,7 @@ LOG = logging.getLogger(__name__)
if FLAGS.memcached_servers:
import memcache
else:
from nova.testing.fake import memcache
from nova.common import memorycache as memcache
# TODO(vish): make an abstract base class with the same public methods

View File

@@ -97,7 +97,7 @@ LOG = logging.getLogger(__name__)
if FLAGS.memcached_servers:
import memcache
else:
from nova.testing.fake import memcache
from nova.common import memorycache as memcache
class AuthBase(object):

View File

@@ -29,11 +29,16 @@ class Client(object):
self.cache = {}
def get(self, key):
"""Retrieves the value for a key or None."""
(timeout, value) = self.cache.get(key, (0, None))
if timeout == 0 or utils.utcnow_ts() < timeout:
return value
return None
"""Retrieves the value for a key or None.
this expunges expired keys during each get"""
for k in self.cache.keys():
(timeout, _value) = self.cache[k]
if timeout and utils.utcnow_ts() >= timeout:
del self.cache[k]
return self.cache.get(key, (0, None))[1]
def set(self, key, value, time=0, min_compress_len=0):
"""Sets the value for a key."""

View File

@@ -1,2 +1 @@
import memcache
import rabbit