comparison mercurial/revlogutils/deltas.py @ 50646:c84cc0ac77e4 stable

delta-fine: use the `_debug_search` attribute directly By adjusting the value at creation time, we can avoid the need to use and intermediate variable.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 08 Jun 2023 01:19:01 +0200
parents 5d210ff4b657
children 4d84b6d52e93
comparison
equal deleted inserted replaced
50645:5d210ff4b657 50646:c84cc0ac77e4
1085 debug_search=False, 1085 debug_search=False,
1086 debug_info=None, 1086 debug_info=None,
1087 ): 1087 ):
1088 self.revlog = revlog 1088 self.revlog = revlog
1089 self._write_debug = write_debug 1089 self._write_debug = write_debug
1090 self._debug_search = debug_search 1090 if write_debug is None:
1091 self._debug_search = False
1092 else:
1093 self._debug_search = debug_search
1091 self._debug_info = debug_info 1094 self._debug_info = debug_info
1092 self._snapshot_cache = SnapshotCache() 1095 self._snapshot_cache = SnapshotCache()
1093 1096
1094 @property 1097 @property
1095 def _gather_debug(self): 1098 def _gather_debug(self):
1138 return delta 1141 return delta
1139 1142
1140 def _builddeltainfo(self, revinfo, base, fh, target_rev=None): 1143 def _builddeltainfo(self, revinfo, base, fh, target_rev=None):
1141 # can we use the cached delta? 1144 # can we use the cached delta?
1142 revlog = self.revlog 1145 revlog = self.revlog
1143 debug_search = self._write_debug is not None and self._debug_search
1144 chainbase = revlog.chainbase(base) 1146 chainbase = revlog.chainbase(base)
1145 if revlog._generaldelta: 1147 if revlog._generaldelta:
1146 deltabase = base 1148 deltabase = base
1147 else: 1149 else:
1148 if target_rev is not None and base != target_rev - 1: 1150 if target_rev is not None and base != target_rev - 1:
1175 currentbase = self.revlog.deltaparent(currentbase) 1177 currentbase = self.revlog.deltaparent(currentbase)
1176 if self.revlog._lazydelta and currentbase == base: 1178 if self.revlog._lazydelta and currentbase == base:
1177 delta = revinfo.cachedelta[1] 1179 delta = revinfo.cachedelta[1]
1178 if delta is None: 1180 if delta is None:
1179 delta = self._builddeltadiff(base, revinfo, fh) 1181 delta = self._builddeltadiff(base, revinfo, fh)
1180 if debug_search: 1182 if self._debug_search:
1181 msg = b"DBG-DELTAS-SEARCH: uncompressed-delta-size=%d\n" 1183 msg = b"DBG-DELTAS-SEARCH: uncompressed-delta-size=%d\n"
1182 msg %= len(delta) 1184 msg %= len(delta)
1183 self._write_debug(msg) 1185 self._write_debug(msg)
1184 # snapshotdept need to be neither None nor 0 level snapshot 1186 # snapshotdept need to be neither None nor 0 level snapshot
1185 if revlog.upperboundcomp is not None and snapshotdepth: 1187 if revlog.upperboundcomp is not None and snapshotdepth:
1186 lowestrealisticdeltalen = len(delta) // revlog.upperboundcomp 1188 lowestrealisticdeltalen = len(delta) // revlog.upperboundcomp
1187 snapshotlimit = revinfo.textlen >> snapshotdepth 1189 snapshotlimit = revinfo.textlen >> snapshotdepth
1188 if debug_search: 1190 if self._debug_search:
1189 msg = b"DBG-DELTAS-SEARCH: projected-lower-size=%d\n" 1191 msg = b"DBG-DELTAS-SEARCH: projected-lower-size=%d\n"
1190 msg %= lowestrealisticdeltalen 1192 msg %= lowestrealisticdeltalen
1191 self._write_debug(msg) 1193 self._write_debug(msg)
1192 if snapshotlimit < lowestrealisticdeltalen: 1194 if snapshotlimit < lowestrealisticdeltalen:
1193 if debug_search: 1195 if self._debug_search:
1194 msg = b"DBG-DELTAS-SEARCH: DISCARDED (snapshot limit)\n" 1196 msg = b"DBG-DELTAS-SEARCH: DISCARDED (snapshot limit)\n"
1195 self._write_debug(msg) 1197 self._write_debug(msg)
1196 return None 1198 return None
1197 if revlog.length(base) < lowestrealisticdeltalen: 1199 if revlog.length(base) < lowestrealisticdeltalen:
1198 if debug_search: 1200 if self._debug_search:
1199 msg = b"DBG-DELTAS-SEARCH: DISCARDED (prev size)\n" 1201 msg = b"DBG-DELTAS-SEARCH: DISCARDED (prev size)\n"
1200 self._write_debug(msg) 1202 self._write_debug(msg)
1201 return None 1203 return None
1202 header, data = revlog.compress(delta) 1204 header, data = revlog.compress(delta)
1203 deltalen = len(header) + len(data) 1205 deltalen = len(header) + len(data)
1267 # not calling candelta since only one revision needs test, also to 1269 # not calling candelta since only one revision needs test, also to
1268 # avoid overhead fetching flags again. 1270 # avoid overhead fetching flags again.
1269 if revinfo.flags & REVIDX_RAWTEXT_CHANGING_FLAGS: 1271 if revinfo.flags & REVIDX_RAWTEXT_CHANGING_FLAGS:
1270 return self._fullsnapshotinfo(fh, revinfo, target_rev) 1272 return self._fullsnapshotinfo(fh, revinfo, target_rev)
1271 1273
1272 debug_search = self._write_debug is not None and self._debug_search
1273 gather_debug = self._gather_debug 1274 gather_debug = self._gather_debug
1274 1275
1275 if gather_debug: 1276 if gather_debug:
1276 start = util.timer() 1277 start = util.timer()
1277 1278
1296 p1_chain_len = -1 1297 p1_chain_len = -1
1297 if p2r != nullrev: 1298 if p2r != nullrev:
1298 p2_chain_len = revlog._chaininfo(p2r)[0] 1299 p2_chain_len = revlog._chaininfo(p2r)[0]
1299 else: 1300 else:
1300 p2_chain_len = -1 1301 p2_chain_len = -1
1301 if debug_search: 1302 if self._debug_search:
1302 msg = b"DBG-DELTAS-SEARCH: SEARCH rev=%d\n" 1303 msg = b"DBG-DELTAS-SEARCH: SEARCH rev=%d\n"
1303 msg %= target_rev 1304 msg %= target_rev
1304 self._write_debug(msg) 1305 self._write_debug(msg)
1305 1306
1306 groups = _candidategroups( 1307 groups = _candidategroups(
1314 snapshot_cache=self._snapshot_cache, 1315 snapshot_cache=self._snapshot_cache,
1315 ) 1316 )
1316 candidaterevs = next(groups) 1317 candidaterevs = next(groups)
1317 while candidaterevs is not None: 1318 while candidaterevs is not None:
1318 dbg_try_rounds += 1 1319 dbg_try_rounds += 1
1319 if debug_search: 1320 if self._debug_search:
1320 prev = None 1321 prev = None
1321 if deltainfo is not None: 1322 if deltainfo is not None:
1322 prev = deltainfo.base 1323 prev = deltainfo.base
1323 1324
1324 if ( 1325 if (
1338 msg = b"DBG-DELTAS-SEARCH: ROUND #%d - %d candidates - %s\n" 1339 msg = b"DBG-DELTAS-SEARCH: ROUND #%d - %d candidates - %s\n"
1339 msg %= (dbg_try_rounds, len(candidaterevs), round_type) 1340 msg %= (dbg_try_rounds, len(candidaterevs), round_type)
1340 self._write_debug(msg) 1341 self._write_debug(msg)
1341 nominateddeltas = [] 1342 nominateddeltas = []
1342 if deltainfo is not None: 1343 if deltainfo is not None:
1343 if debug_search: 1344 if self._debug_search:
1344 msg = ( 1345 msg = (
1345 b"DBG-DELTAS-SEARCH: CONTENDER: rev=%d - length=%d\n" 1346 b"DBG-DELTAS-SEARCH: CONTENDER: rev=%d - length=%d\n"
1346 ) 1347 )
1347 msg %= (deltainfo.base, deltainfo.deltalen) 1348 msg %= (deltainfo.base, deltainfo.deltalen)
1348 self._write_debug(msg) 1349 self._write_debug(msg)
1349 # if we already found a good delta, 1350 # if we already found a good delta,
1350 # challenge it against refined candidates 1351 # challenge it against refined candidates
1351 nominateddeltas.append(deltainfo) 1352 nominateddeltas.append(deltainfo)
1352 for candidaterev in candidaterevs: 1353 for candidaterev in candidaterevs:
1353 if debug_search: 1354 if self._debug_search:
1354 msg = b"DBG-DELTAS-SEARCH: CANDIDATE: rev=%d\n" 1355 msg = b"DBG-DELTAS-SEARCH: CANDIDATE: rev=%d\n"
1355 msg %= candidaterev 1356 msg %= candidaterev
1356 self._write_debug(msg) 1357 self._write_debug(msg)
1357 candidate_type = None 1358 candidate_type = None
1358 if candidaterev == p1: 1359 if candidaterev == p1:
1376 msg %= self.revlog.deltaparent(candidaterev) 1377 msg %= self.revlog.deltaparent(candidaterev)
1377 self._write_debug(msg) 1378 self._write_debug(msg)
1378 1379
1379 dbg_try_count += 1 1380 dbg_try_count += 1
1380 1381
1381 if debug_search: 1382 if self._debug_search:
1382 delta_start = util.timer() 1383 delta_start = util.timer()
1383 candidatedelta = self._builddeltainfo( 1384 candidatedelta = self._builddeltainfo(
1384 revinfo, 1385 revinfo,
1385 candidaterev, 1386 candidaterev,
1386 fh, 1387 fh,
1387 target_rev=target_rev, 1388 target_rev=target_rev,
1388 ) 1389 )
1389 if debug_search: 1390 if self._debug_search:
1390 delta_end = util.timer() 1391 delta_end = util.timer()
1391 msg = b"DBG-DELTAS-SEARCH: delta-search-time=%f\n" 1392 msg = b"DBG-DELTAS-SEARCH: delta-search-time=%f\n"
1392 msg %= delta_end - delta_start 1393 msg %= delta_end - delta_start
1393 self._write_debug(msg) 1394 self._write_debug(msg)
1394 if candidatedelta is not None: 1395 if candidatedelta is not None:
1395 if is_good_delta_info(self.revlog, candidatedelta, revinfo): 1396 if is_good_delta_info(self.revlog, candidatedelta, revinfo):
1396 if debug_search: 1397 if self._debug_search:
1397 msg = b"DBG-DELTAS-SEARCH: DELTA: length=%d (GOOD)\n" 1398 msg = b"DBG-DELTAS-SEARCH: DELTA: length=%d (GOOD)\n"
1398 msg %= candidatedelta.deltalen 1399 msg %= candidatedelta.deltalen
1399 self._write_debug(msg) 1400 self._write_debug(msg)
1400 nominateddeltas.append(candidatedelta) 1401 nominateddeltas.append(candidatedelta)
1401 elif debug_search: 1402 elif self._debug_search:
1402 msg = b"DBG-DELTAS-SEARCH: DELTA: length=%d (BAD)\n" 1403 msg = b"DBG-DELTAS-SEARCH: DELTA: length=%d (BAD)\n"
1403 msg %= candidatedelta.deltalen 1404 msg %= candidatedelta.deltalen
1404 self._write_debug(msg) 1405 self._write_debug(msg)
1405 elif debug_search: 1406 elif self._debug_search:
1406 msg = b"DBG-DELTAS-SEARCH: NO-DELTA\n" 1407 msg = b"DBG-DELTAS-SEARCH: NO-DELTA\n"
1407 self._write_debug(msg) 1408 self._write_debug(msg)
1408 if nominateddeltas: 1409 if nominateddeltas:
1409 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen) 1410 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen)
1410 if deltainfo is not None: 1411 if deltainfo is not None: