diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-01-27 21:05:17 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-01-27 21:05:17 -0500 |
| commit | 07130c7a8b5c58e744c27c7b1baabeda7034f05b (patch) | |
| tree | 6d9573aa19a0113ca62f502e62934b4cdc3e8b4d /lib/sqlalchemy | |
| parent | d706a661709a2c963f8adde53959c5fc42f26d58 (diff) | |
| download | sqlalchemy-07130c7a8b5c58e744c27c7b1baabeda7034f05b.tar.gz | |
- [bug] Changed LRUCache, used by the mapper
to cache INSERT/UPDATE/DELETE statements,
to use an incrementing counter instead
of a timestamp to track entries, for greater
reliability versus using time.time(), which
can cause test failures on some platforms.
[ticket:2379]
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/util/_collections.py | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/sqlalchemy/util/_collections.py b/lib/sqlalchemy/util/_collections.py index 1b8decf59..1c407324c 100644 --- a/lib/sqlalchemy/util/_collections.py +++ b/lib/sqlalchemy/util/_collections.py @@ -769,10 +769,15 @@ class LRUCache(dict): def __init__(self, capacity=100, threshold=.5): self.capacity = capacity self.threshold = threshold + self._counter = 0 + + def _inc_counter(self): + self._counter += 1 + return self._counter def __getitem__(self, key): item = dict.__getitem__(self, key) - item[2] = time_func() + item[2] = self._inc_counter() return item[1] def values(self): @@ -788,7 +793,7 @@ class LRUCache(dict): def __setitem__(self, key, value): item = dict.get(self, key) if item is None: - item = [key, value, time_func()] + item = [key, value, self._inc_counter()] dict.__setitem__(self, key, item) else: item[1] = value @@ -796,10 +801,10 @@ class LRUCache(dict): def _manage_size(self): while len(self) > self.capacity + self.capacity * self.threshold: - bytime = sorted(dict.values(self), + by_counter = sorted(dict.values(self), key=operator.itemgetter(2), reverse=True) - for item in bytime[self.capacity:]: + for item in by_counter[self.capacity:]: try: del self[item[0]] except KeyError: |
