Edgewall Software

Opened 7 years ago

Last modified 7 years ago

#12895 closed enhancement

Improve performance of sync command with many revisions — at Initial Version

Reported by: Ryan J Ollos Owned by:
Priority: normal Milestone: 1.0.17
Component: plugin/git Version:
Severity: normal Keywords: performance
Cc: Branch:
Release Notes:
API Changes:
Internal Changes:

Description

The patch was proposed in gmessage:trac-dev:2ityvgVZxsQ/KEA6IwY2CAAJ.

  • tracopt/versioncontrol/git/PyGIT.py

    diff --git a/tracopt/versioncontrol/git/PyGIT.py
    b/tracopt/versioncontrol/git/PyGIT.py
    index 47f397389..32aac9184 100644
    a b class Storage(object):  
    596596                          key=lambda (name, rev, head): (not head, name))
    597597        return [(name, rev) for name, rev, head in branches]
    598598
     599    def get_refs(self):
     600        for refname, rev in self.rev_cache.refs_dict.iteritems():
     601            if refname != 'HEAD':
     602                yield refname, rev
     603
    599604    def get_commits(self):
    600605        return self.rev_cache.rev_dict
    601606
  • tracopt/versioncontrol/git/git_fs.py

    diff --git a/tracopt/versioncontrol/git/git_fs.py
    b/tracopt/versioncontrol/git/git_fs.py
    index 031f68c2b..c33eb7a5d 100644
    a b class GitCachedRepository(CachedRepository):  
    100100                return count > 0
    101101            return False
    102102
     103        def needs_sync():
     104            max_holders = 999
     105            revs = sorted(set(rev for refname, rev in repos.git.get_refs()))
     106            for idx in xrange(0, len(revs), max_holders):
     107                revs_ = revs[idx:idx + max_holders]
     108                holders = ','.join(('%s',) * len(revs_))
     109                args = [self.id]
     110                args.extend(revs_)
     111                query = 'SELECT COUNT(*) FROM revision ' \
     112                        'WHERE repos=%s AND rev IN (' + holders + ')'
     113                for count, in self.env.db_query(query, args):
     114                    if count < len(revs_):
     115                        return True
     116            return False
     117
    103118        def traverse(rev, seen):
    104119            revs = []
    105120            merge_revs = []
    class GitCachedRepository(CachedRepository):  
    121136                    revs[idx:idx] = traverse(rev, seen)
    122137            return revs
    123138
    124         while True:
    125             repos.sync()
    126             repos_youngest = repos.youngest_rev or ''
     139        def sync_revs():
    127140            updated = False
    128141            seen = set()
    129142
    class GitCachedRepository(CachedRepository):  
    148161                    if feedback:
    149162                        feedback(rev)
    150163
    151             if updated:
    152                 continue  # sync again
     164            return updated
    153165
     166        while True:
     167            repos.sync()
     168            repos_youngest = repos.youngest_rev or ''
     169            if needs_sync() and sync_revs():
     170                continue  # sync again
    154171            if meta_youngest != repos_youngest:
    155172                with self.env.db_transaction as db:
    156173                    db("""

Change History (0)

Note: See TracTickets for help on using tickets.