Changeset 369

Show
Ignore:
Timestamp:
01/19/06 11:55:31 (3 years ago)
Author:
athomas
Message:

RepoSearchPlugin:

  • Implemented a locking mechanism to avoid simultaneous indexing processes.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • reposearchplugin/0.9/tracreposearch/indexer.py

    r367 r369  
    1010from trac.core import TracError 
    1111from tracreposearch.search import TracRepoSearchPlugin 
     12from tracreposearch.lock import lock, unlock, LOCK_EX 
    1213from trac.versioncontrol.api import Node 
    1314import anydbm 
     
    4546    def sync(self): 
    4647        self.dbm.sync() 
    47          
     48 
     49index_lock = None 
     50lock_count = 0 
     51 
     52def acquire_lock(): 
     53    global index_lock, lock_count 
     54    lock_count += 1 
     55    if lock_count == 1: 
     56        index_lock = open('/tmp/repo-search.lock', 'w+') 
     57        lock(index_lock, LOCK_EX) 
     58 
     59def release_lock(): 
     60    global index_lock, lock_count 
     61    lock_count -= 1 
     62    if lock_count == 0: 
     63        index_lock.close() 
     64        index_lock = None 
     65 
     66def synchronized(f): 
     67    """ Synchronization decorator. """ 
     68 
     69    def wrap(*args, **kw): 
     70        acquire_lock() 
     71        try: 
     72            return f(*args, **kw) 
     73        finally: 
     74            release_lock() 
     75    return wrap 
    4876 
    4977class Indexer: 
     
    6391        self.index_dir = self.env.config.get('repo-search', 'index') 
    6492        self.minimum_word_length = int(self.env.config.get('repo-search', 'minimum-word-length', 3)) 
     93 
     94        if not os.path.isdir(self.index_dir): 
     95            os.mkdir(self.index_dir) 
     96 
    6597        try: 
    6698            self._open_storage('r') 
     
    69101 
    70102    def _open_storage(self, mode): 
    71         if not os.path.isdir(self.index_dir): 
    72             os.mkdir(self.index_dir) 
    73  
    74103        self.meta = anydbm.open(os.path.join(self.index_dir, 'meta.db'), mode) 
    75104        self.words = dbdict(os.path.join(self.index_dir, 'words.db'), mode) 
    76105        self.bigrams = dbdict(os.path.join(self.index_dir, 'bigrams.db'), mode) 
     106    _open_storage = synchronized(_open_storage) 
    77107 
    78108    def _bigram_word(self, word): 
     
    87117        self.words.sync() 
    88118        self.bigrams.sync() 
     119    sync = synchronized(sync) 
    89120 
    90121    def need_reindex(self, repo): 
    91         return not hasattr(self, 'meta') or \ 
     122        result = not hasattr(self, 'meta') or \ 
    92123            repo.youngest_rev != int(self.meta.get('last-repo-rev', -1)) \ 
    93124            or self.env.config.get('repo-search', 'include', '1') \ 
    94125               != self.meta.get('index-include', '') \ 
    95126            or self.env.config.get('repo-search', 'exclude', '') \ 
    96                != self.meta.get('index-exclude', '1') \ 
     127               != self.meta.get('index-exclude', '1') 
     128        return result 
     129    need_reindex = synchronized(need_reindex) 
    97130 
    98131    def _bigram_search(self, bigrams): 
     
    110143                return () 
    111144        return words 
     145    _bigram_search = synchronized(_bigram_search) 
    112146 
    113147    def reindex_node(self, node): 
     
    137171                else: 
    138172                    self.words[word] = [node.path] 
     173    reindex_node = synchronized(reindex_node) 
    139174 
    140175    def reindex(self, repo = None): 
     
    151186            self._open_storage('r') 
    152187            self.env.log.debug('Index finished') 
     188    reindex = synchronized(reindex) 
    153189 
    154190    def find_words(self, words): 
     
    177213                all_files.intersection_update(word_files) 
    178214        return all_files 
     215    find_words = synchronized(find_words)