comparison mercurial/revlogutils/debug.py @ 51071:5b5cb6b833b0

debug-delta-chain: actually skip unrequested computation Doing quick test on mozilla-unified show we can run up to 2? faster by skipping some of these computation.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 19 Sep 2023 02:20:49 +0200
parents 752e380c5702
children df50a1592e0c
comparison
equal deleted inserted replaced
51070:752e380c5702 51071:5b5cb6b833b0
719 self._generaldelta = revlog.delta_config.general_delta 719 self._generaldelta = revlog.delta_config.general_delta
720 self._chain_size_cache = {} 720 self._chain_size_cache = {}
721 # security to avoid crash on corrupted revlogs 721 # security to avoid crash on corrupted revlogs
722 self._total_revs = len(self._index) 722 self._total_revs = len(self._index)
723 723
724 def revinfo(self, rev): 724 def revinfo(self, rev, size_info=True, dist_info=True, sparse_info=True):
725 e = self._index[rev] 725 e = self._index[rev]
726 compsize = e[constants.ENTRY_DATA_COMPRESSED_LENGTH] 726 compsize = e[constants.ENTRY_DATA_COMPRESSED_LENGTH]
727 uncompsize = e[constants.ENTRY_DATA_UNCOMPRESSED_LENGTH] 727 uncompsize = e[constants.ENTRY_DATA_UNCOMPRESSED_LENGTH]
728 728
729 base = e[constants.ENTRY_DELTA_BASE] 729 base = e[constants.ENTRY_DELTA_BASE]
786 deltatype = b'base' 786 deltatype = b'base'
787 else: 787 else:
788 deltatype = b'prev' 788 deltatype = b'prev'
789 789
790 chain = self._revlog._deltachain(rev)[0] 790 chain = self._revlog._deltachain(rev)[0]
791 chain_size = 0 791
792 for iter_rev in reversed(chain): 792 data = {
793 cached = self._chain_size_cache.get(iter_rev)
794 if cached is not None:
795 chain_size += cached
796 break
797 e = self._index[iter_rev]
798 chain_size += e[constants.ENTRY_DATA_COMPRESSED_LENGTH]
799 self._chain_size_cache[rev] = chain_size
800
801 return {
802 'p1': p1, 793 'p1': p1,
803 'p2': p2, 794 'p2': p2,
804 'compressed_size': compsize, 795 'compressed_size': compsize,
805 'uncompressed_size': uncompsize, 796 'uncompressed_size': uncompsize,
806 'deltatype': deltatype, 797 'deltatype': deltatype,
807 'chain': chain, 798 'chain': chain,
808 'chain_size': chain_size,
809 } 799 }
800
801 if size_info or dist_info or sparse_info:
802 chain_size = 0
803 for iter_rev in reversed(chain):
804 cached = self._chain_size_cache.get(iter_rev)
805 if cached is not None:
806 chain_size += cached
807 break
808 e = self._index[iter_rev]
809 chain_size += e[constants.ENTRY_DATA_COMPRESSED_LENGTH]
810 self._chain_size_cache[rev] = chain_size
811 data['chain_size'] = chain_size
812
813 return data
810 814
811 815
812 def debug_delta_chain( 816 def debug_delta_chain(
813 revlog, 817 revlog,
814 revs=None, 818 revs=None,
846 revlog_size = len(r) 850 revlog_size = len(r)
847 all_revs = sorted(rev for rev in revs if rev < revlog_size) 851 all_revs = sorted(rev for rev in revs if rev < revlog_size)
848 852
849 chainbases = {} 853 chainbases = {}
850 for rev in all_revs: 854 for rev in all_revs:
851 info = auditor.revinfo(rev) 855 info = auditor.revinfo(
856 rev,
857 size_info=size_info,
858 dist_info=dist_info,
859 sparse_info=sparse_info,
860 )
852 comp = info['compressed_size'] 861 comp = info['compressed_size']
853 uncomp = info['uncompressed_size'] 862 uncomp = info['uncompressed_size']
854 chain = info['chain'] 863 chain = info['chain']
855 chainbase = chain[0] 864 chainbase = chain[0]
856 chainid = chainbases.setdefault(chainbase, len(chainbases) + 1) 865 chainid = chainbases.setdefault(chainbase, len(chainbases) + 1)
857 basestart = start(chainbase) 866 if dist_info:
858 revstart = start(rev) 867 basestart = start(chainbase)
859 lineardist = revstart + comp - basestart 868 revstart = start(rev)
860 chainsize = info['chain_size'] 869 lineardist = revstart + comp - basestart
861 extradist = lineardist - chainsize 870 extradist = lineardist - info['chain_size']
862 try: 871 try:
863 prevrev = chain[-2] 872 prevrev = chain[-2]
864 except IndexError: 873 except IndexError:
865 prevrev = -1 874 prevrev = -1
866 875
867 if uncomp != 0: 876 if size_info:
868 chainratio = float(chainsize) / float(uncomp) 877 chainsize = info['chain_size']
869 else: 878 if uncomp != 0:
870 chainratio = chainsize 879 chainratio = float(chainsize) / float(uncomp)
871 880 else:
872 if chainsize != 0: 881 chainratio = chainsize
873 extraratio = float(extradist) / float(chainsize) 882
874 else: 883 if dist_info:
875 extraratio = extradist 884 if chainsize != 0:
885 extraratio = float(extradist) / float(chainsize)
886 else:
887 extraratio = extradist
876 888
877 # label, display-format, data-key, value 889 # label, display-format, data-key, value
878 entry = [ 890 entry = [
879 (b'rev', b'%7d', 'rev', rev), 891 (b'rev', b'%7d', 'rev', rev),
880 (b'p1', b'%7d', 'p1', info['p1']), 892 (b'p1', b'%7d', 'p1', info['p1']),
900 (b'extradist', b'%9d', 'extradist', extradist), 912 (b'extradist', b'%9d', 'extradist', extradist),
901 (b'extraratio', b'%10.5f', 'extraratio', extraratio), 913 (b'extraratio', b'%10.5f', 'extraratio', extraratio),
902 ] 914 ]
903 ) 915 )
904 if withsparseread and sparse_info: 916 if withsparseread and sparse_info:
917 chainsize = info['chain_size']
905 readsize = 0 918 readsize = 0
906 largestblock = 0 919 largestblock = 0
907 srchunks = 0 920 srchunks = 0
908 921
909 for revschunk in deltautil.slicechunk(r, chain): 922 for revschunk in deltautil.slicechunk(r, chain):