487 # bounding it limits the amount of I/O we need to do. |
487 # bounding it limits the amount of I/O we need to do. |
488 # - 'deltainfo.compresseddeltalen' is the sum of the total size of |
488 # - 'deltainfo.compresseddeltalen' is the sum of the total size of |
489 # deltas we need to apply -- bounding it limits the amount of CPU |
489 # deltas we need to apply -- bounding it limits the amount of CPU |
490 # we consume. |
490 # we consume. |
491 |
491 |
492 if revlog._sparserevlog: |
|
493 # As sparse-read will be used, we can consider that the distance, |
|
494 # instead of being the span of the whole chunk, |
|
495 # is the span of the largest read chunk |
|
496 base = deltainfo.base |
|
497 |
|
498 if base != nullrev: |
|
499 deltachain = revlog._deltachain(base)[0] |
|
500 else: |
|
501 deltachain = [] |
|
502 |
|
503 # search for the first non-snapshot revision |
|
504 for idx, r in enumerate(deltachain): |
|
505 if not revlog.issnapshot(r): |
|
506 break |
|
507 deltachain = deltachain[idx:] |
|
508 chunks = slicechunk(revlog, deltachain, deltainfo) |
|
509 all_span = [segmentspan(revlog, revs, deltainfo) |
|
510 for revs in chunks] |
|
511 distance = max(all_span) |
|
512 else: |
|
513 distance = deltainfo.distance |
|
514 |
|
515 textlen = revinfo.textlen |
492 textlen = revinfo.textlen |
516 defaultmax = textlen * 4 |
493 defaultmax = textlen * 4 |
517 maxdist = revlog._maxdeltachainspan |
494 maxdist = revlog._maxdeltachainspan |
518 if not maxdist: |
495 if not maxdist: |
519 maxdist = distance # ensure the conditional pass |
496 maxdist = deltainfo.distance # ensure the conditional pass |
520 maxdist = max(maxdist, defaultmax) |
497 maxdist = max(maxdist, defaultmax) |
521 if revlog._sparserevlog and maxdist < revlog._srmingapsize: |
|
522 # In multiple place, we are ignoring irrelevant data range below a |
|
523 # certain size. Be also apply this tradeoff here and relax span |
|
524 # constraint for small enought content. |
|
525 maxdist = revlog._srmingapsize |
|
526 |
498 |
527 # Bad delta from read span: |
499 # Bad delta from read span: |
528 # |
500 # |
529 # If the span of data read is larger than the maximum allowed. |
501 # If the span of data read is larger than the maximum allowed. |
530 if maxdist < distance: |
502 # |
|
503 # In the sparse-revlog case, we rely on the associated "sparse reading" |
|
504 # to avoid issue related to the span of data. In theory, it would be |
|
505 # possible to build pathological revlog where delta pattern would lead |
|
506 # to too many reads. However, they do not happen in practice at all. So |
|
507 # we skip the span check entirely. |
|
508 if not revlog._sparserevlog and maxdist < deltainfo.distance: |
531 return False |
509 return False |
532 |
510 |
533 # Bad delta from new delta size: |
511 # Bad delta from new delta size: |
534 # |
512 # |
535 # If the delta size is larger than the target text, storing the |
513 # If the delta size is larger than the target text, storing the |