446 partdata = (cachedata, nbchanges, pversion) |
446 partdata = (cachedata, nbchanges, pversion) |
447 return _makepartfromstream(newpart, repo, *partdata) |
447 return _makepartfromstream(newpart, repo, *partdata) |
448 |
448 |
449 @command('^debugpullbundlecacheoverlap', |
449 @command('^debugpullbundlecacheoverlap', |
450 [('', 'count', 100, _('of "client" pulling')), |
450 [('', 'count', 100, _('of "client" pulling')), |
|
451 ('', 'min-cache', 1, _('minimum size of cached bundle')), |
451 ], |
452 ], |
452 _('hg debugpullbundlecacheoverlap [--client 100] REVSET')) |
453 _('hg debugpullbundlecacheoverlap [--client 100] REVSET')) |
453 def debugpullbundlecacheoverlap(ui, repo, *revs, **opts): |
454 def debugpullbundlecacheoverlap(ui, repo, *revs, **opts): |
454 '''Display statistic on bundle cache hit |
455 '''Display statistic on bundle cache hit |
455 |
456 |
459 ''' |
460 ''' |
460 actionrevs = scmutil.revrange(repo, revs) |
461 actionrevs = scmutil.revrange(repo, revs) |
461 if not revs: |
462 if not revs: |
462 raise error.Abort('No revision selected') |
463 raise error.Abort('No revision selected') |
463 count = opts['count'] |
464 count = opts['count'] |
|
465 min_cache = opts['min_cache'] |
464 |
466 |
465 bundlehits = collections.defaultdict(lambda: 0) |
467 bundlehits = collections.defaultdict(lambda: 0) |
466 pullstats = [] |
468 pullstats = [] |
467 |
469 |
468 rlen = lambda rangeid: repo.stablerange.rangelength(repo, rangeid) |
470 rlen = lambda rangeid: repo.stablerange.rangelength(repo, rangeid) |
469 |
471 |
470 repo.ui.write("gathering %d sample pulls within %d revisions\n" |
472 repo.ui.write("gathering %d sample pulls within %d revisions\n" |
471 % (count, len(actionrevs))) |
473 % (count, len(actionrevs))) |
|
474 if 1 < min_cache: |
|
475 repo.ui.write(" not caching ranges smaller than %d changesets\n" % min_cache) |
472 for i in xrange(count): |
476 for i in xrange(count): |
473 repo.ui.progress('gathering data', i, total=count) |
477 repo.ui.progress('gathering data', i, total=count) |
474 outgoing = takeonesample(repo, actionrevs) |
478 outgoing = takeonesample(repo, actionrevs) |
475 ranges = sliceoutgoing(repo, outgoing) |
479 ranges = sliceoutgoing(repo, outgoing) |
476 hitranges = 0 |
480 hitranges = 0 |
477 hitchanges = 0 |
481 hitchanges = 0 |
478 totalchanges = 0 |
482 totalchanges = 0 |
|
483 largeranges = [] |
479 for rangeid, __ in ranges: |
484 for rangeid, __ in ranges: |
480 length = rlen(rangeid) |
485 length = rlen(rangeid) |
481 totalchanges += length |
486 totalchanges += length |
482 if bundlehits[rangeid]: |
487 if bundlehits[rangeid]: |
483 hitranges += 1 |
488 hitranges += 1 |
484 hitchanges += rlen(rangeid) |
489 hitchanges += rlen(rangeid) |
485 bundlehits[rangeid] += 1 |
490 if min_cache <= length: |
|
491 bundlehits[rangeid] += 1 |
|
492 largeranges.append(rangeid) |
|
493 |
486 stats = (len(outgoing.missing), |
494 stats = (len(outgoing.missing), |
487 totalchanges, |
495 totalchanges, |
488 hitchanges, |
496 hitchanges, |
489 len(ranges), |
497 len(largeranges), |
490 hitranges, |
498 hitranges, |
491 ) |
499 ) |
492 pullstats.append(stats) |
500 pullstats.append(stats) |
493 repo.ui.progress('gathering data', None) |
501 repo.ui.progress('gathering data', None) |
494 |
502 |
501 bundlecount = [] |
509 bundlecount = [] |
502 for entry in pullstats: |
510 for entry in pullstats: |
503 sizes.append(entry[0]) |
511 sizes.append(entry[0]) |
504 changesmissing.append(entry[1] - entry[2]) |
512 changesmissing.append(entry[1] - entry[2]) |
505 changesratio.append(entry[2] / float(entry[1])) |
513 changesratio.append(entry[2] / float(entry[1])) |
506 rangesratio.append(entry[4] / float(entry[3])) |
514 if entry[3]: |
|
515 rangesratio.append(entry[4] / float(entry[3])) |
|
516 else: |
|
517 rangesratio.append(1) |
507 bundlecount.append(entry[3]) |
518 bundlecount.append(entry[3]) |
508 totalchanges += entry[1] |
519 totalchanges += entry[1] |
509 totalcached += entry[2] |
520 totalcached += entry[2] |
510 |
521 |
511 cachedsizes = [] |
522 cachedsizes = [] |
512 cachedhits = [] |
523 cachedhits = [] |
513 for rangeid, hits in bundlehits.items(): |
524 for rangeid, hits in bundlehits.items(): |
|
525 if hits <= 0: |
|
526 continue |
514 length = rlen(rangeid) |
527 length = rlen(rangeid) |
515 cachedsizes.append(length) |
528 cachedsizes.append(length) |
516 cachedhits.append(hits) |
529 cachedhits.append(hits) |
517 |
530 |
518 sizesdist = distribution(sizes) |
531 sizesdist = distribution(sizes) |