comparison contrib/perf.py @ 51008:2f1967ffefb1

perf: change the way we approach revlog reading If the `reading` context manager is available, we should use it over explicit file handle management. This will help us to make file handle management a matter more internal to the revlog.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 25 Sep 2023 11:13:44 +0200
parents 12c308c55e53
children ffb393dd5999
comparison
equal deleted inserted replaced
51007:ccddd2f54013 51008:2f1967ffefb1
3742 except NotImplementedError: 3742 except NotImplementedError:
3743 pass 3743 pass
3744 3744
3745 revs = list(rl.revs(startrev, len(rl) - 1)) 3745 revs = list(rl.revs(startrev, len(rl) - 1))
3746 3746
3747 def rlfh(rl): 3747 @contextlib.contextmanager
3748 if rl._inline: 3748 def reading(rl):
3749 if getattr(rl, 'reading', None) is not None:
3750 with rl.reading():
3751 yield None
3752 elif rl._inline:
3749 indexfile = getattr(rl, '_indexfile', None) 3753 indexfile = getattr(rl, '_indexfile', None)
3750 if indexfile is None: 3754 if indexfile is None:
3751 # compatibility with <= hg-5.8 3755 # compatibility with <= hg-5.8
3752 indexfile = getattr(rl, 'indexfile') 3756 indexfile = getattr(rl, 'indexfile')
3753 return getsvfs(repo)(indexfile) 3757 yield getsvfs(repo)(indexfile)
3754 else: 3758 else:
3755 datafile = getattr(rl, 'datafile', getattr(rl, 'datafile')) 3759 datafile = getattr(rl, 'datafile', getattr(rl, 'datafile'))
3756 return getsvfs(repo)(datafile) 3760 yield getsvfs(repo)(datafile)
3757 3761
3758 def doread(): 3762 def doread():
3759 rl.clearcaches() 3763 rl.clearcaches()
3760 for rev in revs: 3764 for rev in revs:
3761 segmentforrevs(rev, rev) 3765 segmentforrevs(rev, rev)
3762 3766
3763 def doreadcachedfh(): 3767 def doreadcachedfh():
3764 rl.clearcaches() 3768 rl.clearcaches()
3765 fh = rlfh(rl) 3769 with reading(rl) as fh:
3766 for rev in revs: 3770 if fh is not None:
3767 segmentforrevs(rev, rev, df=fh) 3771 for rev in revs:
3772 segmentforrevs(rev, rev, df=fh)
3773 else:
3774 for rev in revs:
3775 segmentforrevs(rev, rev)
3768 3776
3769 def doreadbatch(): 3777 def doreadbatch():
3770 rl.clearcaches() 3778 rl.clearcaches()
3771 segmentforrevs(revs[0], revs[-1]) 3779 segmentforrevs(revs[0], revs[-1])
3772 3780
3773 def doreadbatchcachedfh(): 3781 def doreadbatchcachedfh():
3774 rl.clearcaches() 3782 rl.clearcaches()
3775 fh = rlfh(rl) 3783 with reading(rl) as fh:
3776 segmentforrevs(revs[0], revs[-1], df=fh) 3784 if fh is not None:
3785 segmentforrevs(revs[0], revs[-1], df=fh)
3786 else:
3787 segmentforrevs(revs[0], revs[-1])
3777 3788
3778 def dochunk(): 3789 def dochunk():
3779 rl.clearcaches() 3790 rl.clearcaches()
3780 fh = rlfh(rl) 3791 with reading(rl) as fh:
3781 for rev in revs: 3792 if fh is not None:
3782 rl._chunk(rev, df=fh) 3793 for rev in revs:
3794 rl._chunk(rev, df=fh)
3795 else:
3796 for rev in revs:
3797 rl._chunk(rev)
3783 3798
3784 chunks = [None] 3799 chunks = [None]
3785 3800
3786 def dochunkbatch(): 3801 def dochunkbatch():
3787 rl.clearcaches() 3802 rl.clearcaches()
3788 fh = rlfh(rl) 3803 with reading(rl) as fh:
3789 # Save chunks as a side-effect. 3804 if fh is not None:
3790 chunks[0] = rl._chunks(revs, df=fh) 3805 # Save chunks as a side-effect.
3806 chunks[0] = rl._chunks(revs, df=fh)
3807 else:
3808 # Save chunks as a side-effect.
3809 chunks[0] = rl._chunks(revs)
3791 3810
3792 def docompress(compressor): 3811 def docompress(compressor):
3793 rl.clearcaches() 3812 rl.clearcaches()
3794 3813
3795 try: 3814 try: