comparison mercurial/store.py @ 51552:49faa72b994e

streamclone: stop listing files for entries that have no volatile files This will save a lot of python related time. This significantly boost performance. The following number comes from a large private repository using perf::stream-locked-section: base-line: 35.04 seconds prev-change: 24.51 seconds (-30%) prev-change: 20.88 seconds (-40%) prev-change: 14.22 seconds (-60%) this-change: 11.58 seconds (-67% from baseline; -18% from prev)
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 26 Mar 2024 13:46:44 +0000
parents 8e2a68e10f5c
children 493034cc3265
comparison
equal deleted inserted replaced
51551:6e4c8366c5ce 51552:49faa72b994e
482 class BaseStoreEntry: 482 class BaseStoreEntry:
483 """An entry in the store 483 """An entry in the store
484 484
485 This is returned by `store.walk` and represent some data in the store.""" 485 This is returned by `store.walk` and represent some data in the store."""
486 486
487 maybe_volatile = True
488
487 def files(self) -> List[StoreFile]: 489 def files(self) -> List[StoreFile]:
488 raise NotImplementedError 490 raise NotImplementedError
489 491
490 def get_streams( 492 def get_streams(
491 self, 493 self,
507 class SimpleStoreEntry(BaseStoreEntry): 509 class SimpleStoreEntry(BaseStoreEntry):
508 """A generic entry in the store""" 510 """A generic entry in the store"""
509 511
510 is_revlog = False 512 is_revlog = False
511 513
514 maybe_volatile = attr.ib()
512 _entry_path = attr.ib() 515 _entry_path = attr.ib()
513 _is_volatile = attr.ib(default=False) 516 _is_volatile = attr.ib(default=False)
514 _file_size = attr.ib(default=None) 517 _file_size = attr.ib(default=None)
515 _files = attr.ib(default=None) 518 _files = attr.ib(default=None)
516 519
523 super().__init__() 526 super().__init__()
524 self._entry_path = entry_path 527 self._entry_path = entry_path
525 self._is_volatile = is_volatile 528 self._is_volatile = is_volatile
526 self._file_size = file_size 529 self._file_size = file_size
527 self._files = None 530 self._files = None
531 self.maybe_volatile = is_volatile
528 532
529 def files(self) -> List[StoreFile]: 533 def files(self) -> List[StoreFile]:
530 if self._files is None: 534 if self._files is None:
531 self._files = [ 535 self._files = [
532 StoreFile( 536 StoreFile(
544 548
545 is_revlog = True 549 is_revlog = True
546 550
547 revlog_type = attr.ib(default=None) 551 revlog_type = attr.ib(default=None)
548 target_id = attr.ib(default=None) 552 target_id = attr.ib(default=None)
553 maybe_volatile = attr.ib(default=True)
549 _path_prefix = attr.ib(default=None) 554 _path_prefix = attr.ib(default=None)
550 _details = attr.ib(default=None) 555 _details = attr.ib(default=None)
551 _files = attr.ib(default=None) 556 _files = attr.ib(default=None)
552 557
553 def __init__( 558 def __init__(
560 super().__init__() 565 super().__init__()
561 self.revlog_type = revlog_type 566 self.revlog_type = revlog_type
562 self.target_id = target_id 567 self.target_id = target_id
563 self._path_prefix = path_prefix 568 self._path_prefix = path_prefix
564 assert b'.i' in details, (path_prefix, details) 569 assert b'.i' in details, (path_prefix, details)
570 for ext in details:
571 if ext.endswith(REVLOG_FILES_VOLATILE_EXT):
572 self.maybe_volatile = True
573 break
574 else:
575 self.maybe_volatile = False
565 self._details = details 576 self._details = details
566 self._files = None 577 self._files = None
567 578
568 @property 579 @property
569 def is_changelog(self): 580 def is_changelog(self):