~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/history.py

[rs=mwhudson] Update to loggerhead to fix __getattr__ recursive error
        and bring in the LRUCache fix.

Show diffs side-by-side

added added

removed removed

Lines of Context:
168
168
 
169
169
    def __init__(self, cache):
170
170
        self._cache = cache
 
171
        # lru_cache is not thread-safe, so we need to lock all accesses.
 
172
        # It is even modified when doing a get() on it.
 
173
        self._lock = threading.RLock()
171
174
 
172
175
    def get(self, key, revid):
173
176
        """Return the data associated with `key`, subject to a revid check.
175
178
        If a value was stored under `key`, with the same revid, return it.
176
179
        Otherwise return None.
177
180
        """
178
 
        cached = self._cache.get(key)
 
181
        self._lock.acquire()
 
182
        try:
 
183
            cached = self._cache.get(key)
 
184
        finally:
 
185
            self._lock.release()
179
186
        if cached is None:
180
187
            return None
181
188
        stored_revid, data = cached
187
194
    def set(self, key, revid, data):
188
195
        """Store `data` under `key`, to be checked against `revid` on get().
189
196
        """
190
 
        self._cache[key] = (revid, data)
 
197
        self._lock.acquire()
 
198
        try:
 
199
            self._cache[key] = (revid, data)
 
200
        finally:
 
201
            self._lock.release()
191
202
 
192
203
# Used to store locks that prevent multiple threads from building a 
193
204
# revision graph for the same branch at the same time, because that can
283
294
        else:
284
295
            self._file_change_cache = None
285
296
        self._branch = branch
 
297
        self._branch_tags = None
286
298
        self._inventory_cache = {}
287
299
        self._branch_nick = self._branch.get_config().get_nickname()
288
300
        self.log = logging.getLogger('loggerhead.%s' % (self._branch_nick,))
653
665
        """
654
666
        message, short_message = clean_message(revision.message)
655
667
 
656
 
        tags = self._branch.tags.get_reverse_tag_dict()
 
668
        if self._branch_tags is None:
 
669
            self._branch_tags = self._branch.tags.get_reverse_tag_dict()
657
670
 
658
671
        revtags = None
659
 
        if tags.has_key(revision.revision_id):
660
 
          revtags = ', '.join(tags[revision.revision_id])
 
672
        if revision.revision_id in self._branch_tags:
 
673
          revtags = ', '.join(self._branch_tags[revision.revision_id])
661
674
 
662
675
        entry = {
663
676
            'revid': revision.revision_id,