Fossil SCM
Added high-level logging for memory tracing to the code breaking the preliminary changesets. First runs indicate that the DEPC array becomes so very large, caused by a high amount of indirect dependencies (several hundred).
Commit
c2ad73ed9243ac9497046fa8eae19f904b56bc77
Parent
f46458d5bdc2218…
1 file changed
+31
-3
+31
-3
| --- tools/cvs2fossil/lib/c2f_prev.tcl | ||
| +++ tools/cvs2fossil/lib/c2f_prev.tcl | ||
| @@ -203,11 +203,17 @@ | ||
| 203 | 203 | # Data structures: |
| 204 | 204 | # Map: POS revision id -> position in list. |
| 205 | 205 | # CROSS position in list -> number of dependencies crossing it |
| 206 | 206 | # DEPC dependency -> positions it crosses |
| 207 | 207 | # List: RANGE Of the positions itself. |
| 208 | + # Map: DELTA position in list -> time delta between its revision | |
| 209 | + # and the next, if any. | |
| 208 | 210 | # A dependency is a single-element map parent -> child |
| 211 | + | |
| 212 | + # InitializeBreakState initializes their contents after | |
| 213 | + # upvar'ing them from this scope. It uses the information in | |
| 214 | + # DEPENDENCIES to do so. | |
| 209 | 215 | |
| 210 | 216 | InitializeBreakState $myitems |
| 211 | 217 | |
| 212 | 218 | set fragments {} |
| 213 | 219 | set new [list $range] |
| @@ -799,10 +805,13 @@ | ||
| 799 | 805 | dependencies dependencies |
| 800 | 806 | |
| 801 | 807 | # First we create a map of positions to make it easier to |
| 802 | 808 | # determine whether a dependency crosses a particular index. |
| 803 | 809 | |
| 810 | + log write 14 csets {IBS: #rev [llength $revisions]} | |
| 811 | + log write 14 csets {IBS: pos map, cross counter} | |
| 812 | + | |
| 804 | 813 | array set pos {} |
| 805 | 814 | array set cross {} |
| 806 | 815 | array set depc {} |
| 807 | 816 | set range {} |
| 808 | 817 | set n 0 |
| @@ -810,10 +819,12 @@ | ||
| 810 | 819 | lappend range $n |
| 811 | 820 | set pos($rev) $n |
| 812 | 821 | set cross($n) 0 |
| 813 | 822 | incr n |
| 814 | 823 | } |
| 824 | + | |
| 825 | + log write 14 csets {IBS: pos/[array size pos], cross/[array size cross]} | |
| 815 | 826 | |
| 816 | 827 | # Secondly we count the crossings per position, by iterating |
| 817 | 828 | # over the recorded internal dependencies. |
| 818 | 829 | |
| 819 | 830 | # Note: If the timestamps are badly out of order it is |
| @@ -823,10 +834,12 @@ | ||
| 823 | 834 | # |
| 824 | 835 | # Note 2: start == end is not possible. It indicates a |
| 825 | 836 | # self-dependency due to the uniqueness of positions, |
| 826 | 837 | # and that is something we have ruled out already, see |
| 827 | 838 | # 'rev internalsuccessors'. |
| 839 | + | |
| 840 | + log write 14 csets {IBS: cross counter filling, pos/cross map} | |
| 828 | 841 | |
| 829 | 842 | foreach {rid children} [array get dependencies] { |
| 830 | 843 | foreach child $children { |
| 831 | 844 | set dkey [list $rid $child] |
| 832 | 845 | set start $pos($rid) |
| @@ -848,11 +861,16 @@ | ||
| 848 | 861 | } |
| 849 | 862 | set depc($dkey) $crosses |
| 850 | 863 | } |
| 851 | 864 | } |
| 852 | 865 | |
| 866 | + log write 14 csets {IBS: pos/[array size pos], cross/[array size cross], depc/[array size depc] (for [llength $revisions])} | |
| 867 | + log write 14 csets {IBS: timestamps, deltas} | |
| 868 | + | |
| 853 | 869 | InitializeDeltas $revisions |
| 870 | + | |
| 871 | + log write 14 csets {IBS: delta [array size delta]} | |
| 854 | 872 | return |
| 855 | 873 | } |
| 856 | 874 | |
| 857 | 875 | proc InitializeDeltas {revisions} { |
| 858 | 876 | upvar 1 delta delta |
| @@ -869,10 +887,12 @@ | ||
| 869 | 887 | FROM revision R |
| 870 | 888 | WHERE R.rid IN $theset |
| 871 | 889 | }]] { |
| 872 | 890 | set stamp($rid) $time |
| 873 | 891 | } |
| 892 | + | |
| 893 | + log write 14 csets {IBS: stamp [array size stamp]} | |
| 874 | 894 | |
| 875 | 895 | set n 0 |
| 876 | 896 | foreach rid [lrange $revisions 0 end-1] rnext [lrange $revisions 1 end] { |
| 877 | 897 | set delta($n) [expr {$stamp($rnext) - $stamp($rid)}] |
| 878 | 898 | incr n |
| @@ -1081,11 +1101,11 @@ | ||
| 1081 | 1101 | # var(dv) = dict (revision -> list (revision)) |
| 1082 | 1102 | typemethod internalsuccessors {dv revisions} { |
| 1083 | 1103 | upvar 1 $dv dependencies |
| 1084 | 1104 | set theset ('[join $revisions {','}]') |
| 1085 | 1105 | |
| 1086 | - log write 14 cset internalsuccessors | |
| 1106 | + log write 14 csets internalsuccessors | |
| 1087 | 1107 | |
| 1088 | 1108 | # See 'successors' below for the main explanation of |
| 1089 | 1109 | # the various cases. This piece is special in that it |
| 1090 | 1110 | # restricts the successors we look for to the same set of |
| 1091 | 1111 | # revisions we start from. Sensible as we are looking for |
| @@ -1144,19 +1164,22 @@ | ||
| 1144 | 1164 | |
| 1145 | 1165 | # We allow revisions to be far apart in time in the same |
| 1146 | 1166 | # changeset, but in turn need the pseudo-dependencies to |
| 1147 | 1167 | # handle this. |
| 1148 | 1168 | |
| 1149 | - log write 14 cset pseudo-internalsuccessors | |
| 1169 | + log write 14 csets {internal [array size dep]} | |
| 1170 | + log write 14 csets {collected [array size dependencies]} | |
| 1171 | + log write 14 csets pseudo-internalsuccessors | |
| 1150 | 1172 | |
| 1151 | 1173 | array set fids {} |
| 1152 | 1174 | foreach {rid fid} [state run [subst -nocommands -nobackslashes { |
| 1153 | 1175 | SELECT R.rid, R.fid |
| 1154 | 1176 | FROM revision R |
| 1155 | 1177 | WHERE R.rid IN $theset |
| 1156 | 1178 | }]] { lappend fids($fid) $rid } |
| 1157 | 1179 | |
| 1180 | + set groups {} | |
| 1158 | 1181 | foreach {fid rids} [array get fids] { |
| 1159 | 1182 | if {[llength $rids] < 2} continue |
| 1160 | 1183 | foreach a $rids { |
| 1161 | 1184 | foreach b $rids { |
| 1162 | 1185 | if {$a == $b} continue |
| @@ -1165,13 +1188,18 @@ | ||
| 1165 | 1188 | lappend dependencies($a) $b |
| 1166 | 1189 | set dep($a,$b) . |
| 1167 | 1190 | set dep($b,$a) . |
| 1168 | 1191 | } |
| 1169 | 1192 | } |
| 1193 | + set n [llength $rids] | |
| 1194 | + lappend groups [list $n [expr {($n*$n-$n)/2}]] | |
| 1170 | 1195 | } |
| 1171 | 1196 | |
| 1172 | - log write 14 cset complete | |
| 1197 | + log write 14 csets {pseudo [array size fids] ([lsort -index 0 -decreasing -integer $groups])} | |
| 1198 | + log write 14 csets {internal [array size dep]} | |
| 1199 | + log write 14 csets {collected [array size dependencies]} | |
| 1200 | + log write 14 csets complete | |
| 1173 | 1201 | return |
| 1174 | 1202 | } |
| 1175 | 1203 | |
| 1176 | 1204 | # result = 4-list (itemtype itemid nextitemtype nextitemid ...) |
| 1177 | 1205 | typemethod loops {revisions} { |
| 1178 | 1206 |
| --- tools/cvs2fossil/lib/c2f_prev.tcl | |
| +++ tools/cvs2fossil/lib/c2f_prev.tcl | |
| @@ -203,11 +203,17 @@ | |
| 203 | # Data structures: |
| 204 | # Map: POS revision id -> position in list. |
| 205 | # CROSS position in list -> number of dependencies crossing it |
| 206 | # DEPC dependency -> positions it crosses |
| 207 | # List: RANGE Of the positions itself. |
| 208 | # A dependency is a single-element map parent -> child |
| 209 | |
| 210 | InitializeBreakState $myitems |
| 211 | |
| 212 | set fragments {} |
| 213 | set new [list $range] |
| @@ -799,10 +805,13 @@ | |
| 799 | dependencies dependencies |
| 800 | |
| 801 | # First we create a map of positions to make it easier to |
| 802 | # determine whether a dependency crosses a particular index. |
| 803 | |
| 804 | array set pos {} |
| 805 | array set cross {} |
| 806 | array set depc {} |
| 807 | set range {} |
| 808 | set n 0 |
| @@ -810,10 +819,12 @@ | |
| 810 | lappend range $n |
| 811 | set pos($rev) $n |
| 812 | set cross($n) 0 |
| 813 | incr n |
| 814 | } |
| 815 | |
| 816 | # Secondly we count the crossings per position, by iterating |
| 817 | # over the recorded internal dependencies. |
| 818 | |
| 819 | # Note: If the timestamps are badly out of order it is |
| @@ -823,10 +834,12 @@ | |
| 823 | # |
| 824 | # Note 2: start == end is not possible. It indicates a |
| 825 | # self-dependency due to the uniqueness of positions, |
| 826 | # and that is something we have ruled out already, see |
| 827 | # 'rev internalsuccessors'. |
| 828 | |
| 829 | foreach {rid children} [array get dependencies] { |
| 830 | foreach child $children { |
| 831 | set dkey [list $rid $child] |
| 832 | set start $pos($rid) |
| @@ -848,11 +861,16 @@ | |
| 848 | } |
| 849 | set depc($dkey) $crosses |
| 850 | } |
| 851 | } |
| 852 | |
| 853 | InitializeDeltas $revisions |
| 854 | return |
| 855 | } |
| 856 | |
| 857 | proc InitializeDeltas {revisions} { |
| 858 | upvar 1 delta delta |
| @@ -869,10 +887,12 @@ | |
| 869 | FROM revision R |
| 870 | WHERE R.rid IN $theset |
| 871 | }]] { |
| 872 | set stamp($rid) $time |
| 873 | } |
| 874 | |
| 875 | set n 0 |
| 876 | foreach rid [lrange $revisions 0 end-1] rnext [lrange $revisions 1 end] { |
| 877 | set delta($n) [expr {$stamp($rnext) - $stamp($rid)}] |
| 878 | incr n |
| @@ -1081,11 +1101,11 @@ | |
| 1081 | # var(dv) = dict (revision -> list (revision)) |
| 1082 | typemethod internalsuccessors {dv revisions} { |
| 1083 | upvar 1 $dv dependencies |
| 1084 | set theset ('[join $revisions {','}]') |
| 1085 | |
| 1086 | log write 14 cset internalsuccessors |
| 1087 | |
| 1088 | # See 'successors' below for the main explanation of |
| 1089 | # the various cases. This piece is special in that it |
| 1090 | # restricts the successors we look for to the same set of |
| 1091 | # revisions we start from. Sensible as we are looking for |
| @@ -1144,19 +1164,22 @@ | |
| 1144 | |
| 1145 | # We allow revisions to be far apart in time in the same |
| 1146 | # changeset, but in turn need the pseudo-dependencies to |
| 1147 | # handle this. |
| 1148 | |
| 1149 | log write 14 cset pseudo-internalsuccessors |
| 1150 | |
| 1151 | array set fids {} |
| 1152 | foreach {rid fid} [state run [subst -nocommands -nobackslashes { |
| 1153 | SELECT R.rid, R.fid |
| 1154 | FROM revision R |
| 1155 | WHERE R.rid IN $theset |
| 1156 | }]] { lappend fids($fid) $rid } |
| 1157 | |
| 1158 | foreach {fid rids} [array get fids] { |
| 1159 | if {[llength $rids] < 2} continue |
| 1160 | foreach a $rids { |
| 1161 | foreach b $rids { |
| 1162 | if {$a == $b} continue |
| @@ -1165,13 +1188,18 @@ | |
| 1165 | lappend dependencies($a) $b |
| 1166 | set dep($a,$b) . |
| 1167 | set dep($b,$a) . |
| 1168 | } |
| 1169 | } |
| 1170 | } |
| 1171 | |
| 1172 | log write 14 cset complete |
| 1173 | return |
| 1174 | } |
| 1175 | |
| 1176 | # result = 4-list (itemtype itemid nextitemtype nextitemid ...) |
| 1177 | typemethod loops {revisions} { |
| 1178 |
| --- tools/cvs2fossil/lib/c2f_prev.tcl | |
| +++ tools/cvs2fossil/lib/c2f_prev.tcl | |
| @@ -203,11 +203,17 @@ | |
| 203 | # Data structures: |
| 204 | # Map: POS revision id -> position in list. |
| 205 | # CROSS position in list -> number of dependencies crossing it |
| 206 | # DEPC dependency -> positions it crosses |
| 207 | # List: RANGE Of the positions itself. |
| 208 | # Map: DELTA position in list -> time delta between its revision |
| 209 | # and the next, if any. |
| 210 | # A dependency is a single-element map parent -> child |
| 211 | |
| 212 | # InitializeBreakState initializes their contents after |
| 213 | # upvar'ing them from this scope. It uses the information in |
| 214 | # DEPENDENCIES to do so. |
| 215 | |
| 216 | InitializeBreakState $myitems |
| 217 | |
| 218 | set fragments {} |
| 219 | set new [list $range] |
| @@ -799,10 +805,13 @@ | |
| 805 | dependencies dependencies |
| 806 | |
| 807 | # First we create a map of positions to make it easier to |
| 808 | # determine whether a dependency crosses a particular index. |
| 809 | |
| 810 | log write 14 csets {IBS: #rev [llength $revisions]} |
| 811 | log write 14 csets {IBS: pos map, cross counter} |
| 812 | |
| 813 | array set pos {} |
| 814 | array set cross {} |
| 815 | array set depc {} |
| 816 | set range {} |
| 817 | set n 0 |
| @@ -810,10 +819,12 @@ | |
| 819 | lappend range $n |
| 820 | set pos($rev) $n |
| 821 | set cross($n) 0 |
| 822 | incr n |
| 823 | } |
| 824 | |
| 825 | log write 14 csets {IBS: pos/[array size pos], cross/[array size cross]} |
| 826 | |
| 827 | # Secondly we count the crossings per position, by iterating |
| 828 | # over the recorded internal dependencies. |
| 829 | |
| 830 | # Note: If the timestamps are badly out of order it is |
| @@ -823,10 +834,12 @@ | |
| 834 | # |
| 835 | # Note 2: start == end is not possible. It indicates a |
| 836 | # self-dependency due to the uniqueness of positions, |
| 837 | # and that is something we have ruled out already, see |
| 838 | # 'rev internalsuccessors'. |
| 839 | |
| 840 | log write 14 csets {IBS: cross counter filling, pos/cross map} |
| 841 | |
| 842 | foreach {rid children} [array get dependencies] { |
| 843 | foreach child $children { |
| 844 | set dkey [list $rid $child] |
| 845 | set start $pos($rid) |
| @@ -848,11 +861,16 @@ | |
| 861 | } |
| 862 | set depc($dkey) $crosses |
| 863 | } |
| 864 | } |
| 865 | |
| 866 | log write 14 csets {IBS: pos/[array size pos], cross/[array size cross], depc/[array size depc] (for [llength $revisions])} |
| 867 | log write 14 csets {IBS: timestamps, deltas} |
| 868 | |
| 869 | InitializeDeltas $revisions |
| 870 | |
| 871 | log write 14 csets {IBS: delta [array size delta]} |
| 872 | return |
| 873 | } |
| 874 | |
| 875 | proc InitializeDeltas {revisions} { |
| 876 | upvar 1 delta delta |
| @@ -869,10 +887,12 @@ | |
| 887 | FROM revision R |
| 888 | WHERE R.rid IN $theset |
| 889 | }]] { |
| 890 | set stamp($rid) $time |
| 891 | } |
| 892 | |
| 893 | log write 14 csets {IBS: stamp [array size stamp]} |
| 894 | |
| 895 | set n 0 |
| 896 | foreach rid [lrange $revisions 0 end-1] rnext [lrange $revisions 1 end] { |
| 897 | set delta($n) [expr {$stamp($rnext) - $stamp($rid)}] |
| 898 | incr n |
| @@ -1081,11 +1101,11 @@ | |
| 1101 | # var(dv) = dict (revision -> list (revision)) |
| 1102 | typemethod internalsuccessors {dv revisions} { |
| 1103 | upvar 1 $dv dependencies |
| 1104 | set theset ('[join $revisions {','}]') |
| 1105 | |
| 1106 | log write 14 csets internalsuccessors |
| 1107 | |
| 1108 | # See 'successors' below for the main explanation of |
| 1109 | # the various cases. This piece is special in that it |
| 1110 | # restricts the successors we look for to the same set of |
| 1111 | # revisions we start from. Sensible as we are looking for |
| @@ -1144,19 +1164,22 @@ | |
| 1164 | |
| 1165 | # We allow revisions to be far apart in time in the same |
| 1166 | # changeset, but in turn need the pseudo-dependencies to |
| 1167 | # handle this. |
| 1168 | |
| 1169 | log write 14 csets {internal [array size dep]} |
| 1170 | log write 14 csets {collected [array size dependencies]} |
| 1171 | log write 14 csets pseudo-internalsuccessors |
| 1172 | |
| 1173 | array set fids {} |
| 1174 | foreach {rid fid} [state run [subst -nocommands -nobackslashes { |
| 1175 | SELECT R.rid, R.fid |
| 1176 | FROM revision R |
| 1177 | WHERE R.rid IN $theset |
| 1178 | }]] { lappend fids($fid) $rid } |
| 1179 | |
| 1180 | set groups {} |
| 1181 | foreach {fid rids} [array get fids] { |
| 1182 | if {[llength $rids] < 2} continue |
| 1183 | foreach a $rids { |
| 1184 | foreach b $rids { |
| 1185 | if {$a == $b} continue |
| @@ -1165,13 +1188,18 @@ | |
| 1188 | lappend dependencies($a) $b |
| 1189 | set dep($a,$b) . |
| 1190 | set dep($b,$a) . |
| 1191 | } |
| 1192 | } |
| 1193 | set n [llength $rids] |
| 1194 | lappend groups [list $n [expr {($n*$n-$n)/2}]] |
| 1195 | } |
| 1196 | |
| 1197 | log write 14 csets {pseudo [array size fids] ([lsort -index 0 -decreasing -integer $groups])} |
| 1198 | log write 14 csets {internal [array size dep]} |
| 1199 | log write 14 csets {collected [array size dependencies]} |
| 1200 | log write 14 csets complete |
| 1201 | return |
| 1202 | } |
| 1203 | |
| 1204 | # result = 4-list (itemtype itemid nextitemtype nextitemid ...) |
| 1205 | typemethod loops {revisions} { |
| 1206 |