##// END OF EJS Templates
revlog: add function to slice chunk down to a given size...
Boris Feld -
r38664:e59e27e5 default
parent child Browse files
Show More
@@ -338,6 +338,83 b' def _slicechunk(revlog, revs):'
338 revlog._srmingapsize):
338 revlog._srmingapsize):
339 yield chunk
339 yield chunk
340
340
341 def _slicechunktosize(revlog, revs, targetsize):
342 """slice revs to match the target size
343
344 This is intended to be used on chunk that density slicing selected by that
345 are still too large compared to the read garantee of revlog. This might
346 happens when "minimal gap size" interrupted the slicing or when chain are
347 built in a way that create large blocks next to each other.
348
349 >>> revlog = _testrevlog([
350 ... 3, #0 (3)
351 ... 5, #1 (2)
352 ... 6, #2 (1)
353 ... 8, #3 (2)
354 ... 8, #4 (empty)
355 ... 11, #5 (3)
356 ... 12, #6 (1)
357 ... 13, #7 (1)
358 ... 14, #8 (1)
359 ... ])
360
361 Cases where chunk is already small enough
362 >>> list(_slicechunktosize(revlog, [0], 3))
363 [[0]]
364 >>> list(_slicechunktosize(revlog, [6, 7], 3))
365 [[6, 7]]
366 >>> list(_slicechunktosize(revlog, [0], None))
367 [[0]]
368 >>> list(_slicechunktosize(revlog, [6, 7], None))
369 [[6, 7]]
370
371 cases where we need actual slicing
372 >>> list(_slicechunktosize(revlog, [0, 1], 3))
373 [[0], [1]]
374 >>> list(_slicechunktosize(revlog, [1, 3], 3))
375 [[1], [3]]
376 >>> list(_slicechunktosize(revlog, [1, 2, 3], 3))
377 [[1, 2], [3]]
378 >>> list(_slicechunktosize(revlog, [3, 5], 3))
379 [[3], [5]]
380 >>> list(_slicechunktosize(revlog, [3, 4, 5], 3))
381 [[3], [5]]
382 >>> list(_slicechunktosize(revlog, [5, 6, 7, 8], 3))
383 [[5], [6, 7, 8]]
384 >>> list(_slicechunktosize(revlog, [0, 1, 2, 3, 4, 5, 6, 7, 8], 3))
385 [[0], [1, 2], [3], [5], [6, 7, 8]]
386
387 Case with too large individual chunk (must return valid chunk)
388 >>> list(_slicechunktosize(revlog, [0, 1], 2))
389 [[0], [1]]
390 >>> list(_slicechunktosize(revlog, [1, 3], 1))
391 [[1], [3]]
392 >>> list(_slicechunktosize(revlog, [3, 4, 5], 2))
393 [[3], [5]]
394 """
395 assert targetsize is None or 0 <= targetsize
396 if targetsize is None or _segmentspan(revlog, revs) <= targetsize:
397 yield revs
398 return
399
400 startrevidx = 0
401 startdata = revlog.start(revs[0])
402 endrevidx = 0
403 iterrevs = enumerate(revs)
404 next(iterrevs) # skip first rev.
405 for idx, r in iterrevs:
406 span = revlog.end(r) - startdata
407 if span <= targetsize:
408 endrevidx = idx
409 else:
410 chunk = _trimchunk(revlog, revs, startrevidx, endrevidx + 1)
411 if chunk:
412 yield chunk
413 startrevidx = idx
414 startdata = revlog.start(r)
415 endrevidx = idx
416 yield _trimchunk(revlog, revs, startrevidx)
417
341 def _slicechunktodensity(revlog, revs, targetdensity=0.5, mingapsize=0):
418 def _slicechunktodensity(revlog, revs, targetdensity=0.5, mingapsize=0):
342 """slice revs to reduce the amount of unrelated data to be read from disk.
419 """slice revs to reduce the amount of unrelated data to be read from disk.
343
420
General Comments 0
You need to be logged in to leave comments. Login now