diff options
author | Gavin Mak <gavinmak@google.com> | 2023-05-04 04:48:43 +0000 |
---|---|---|
committer | LUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-05-18 18:10:24 +0000 |
commit | 551285fa35ccd0836513e9cf64ee8d3372e5e3f4 (patch) | |
tree | 61acabd91347a510abe16976bb5be898c87c42e2 /subcmds/sync.py | |
parent | 131fc96381e112b0aa7a1012243e2ed5cfd3ec01 (diff) | |
download | git-repo-551285fa35ccd0836513e9cf64ee8d3372e5e3f4.tar.gz |
sync: Show elapsed time for the longest syncing project
"Last synced: X" is printed only after a project finishes syncing.
Replace that with a message that shows the longest actively syncing
project.
Bug: https://crbug.com/gerrit/11293
Change-Id: I84c7873539d84999772cd554f426b44921521e85
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/372674
Reviewed-by: Josip Sokcevic <sokcevic@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
Reviewed-by: Joanna Wang <jojwang@google.com>
Tested-by: Gavin Mak <gavinmak@google.com>
Diffstat (limited to 'subcmds/sync.py')
-rw-r--r-- | subcmds/sync.py | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/subcmds/sync.py b/subcmds/sync.py index 8f73d27f..da9918b9 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
@@ -66,7 +66,7 @@ from command import ( | |||
66 | from error import RepoChangedException, GitError | 66 | from error import RepoChangedException, GitError |
67 | import platform_utils | 67 | import platform_utils |
68 | from project import SyncBuffer | 68 | from project import SyncBuffer |
69 | from progress import Progress | 69 | from progress import Progress, elapsed_str |
70 | from repo_trace import Trace | 70 | from repo_trace import Trace |
71 | import ssh | 71 | import ssh |
72 | from wrapper import Wrapper | 72 | from wrapper import Wrapper |
@@ -596,7 +596,7 @@ later is required to fix a server side protocol bug. | |||
596 | The projects we're given share the same underlying git object store, so | 596 | The projects we're given share the same underlying git object store, so |
597 | we have to fetch them in serial. | 597 | we have to fetch them in serial. |
598 | 598 | ||
599 | Delegates most of the work to _FetchHelper. | 599 | Delegates most of the work to _FetchOne. |
600 | 600 | ||
601 | Args: | 601 | Args: |
602 | opt: Program options returned from optparse. See _Options(). | 602 | opt: Program options returned from optparse. See _Options(). |
@@ -615,6 +615,8 @@ later is required to fix a server side protocol bug. | |||
615 | Whether the fetch was successful. | 615 | Whether the fetch was successful. |
616 | """ | 616 | """ |
617 | start = time.time() | 617 | start = time.time() |
618 | k = f"{project.name} @ {project.relpath}" | ||
619 | self._sync_dict[k] = start | ||
618 | success = False | 620 | success = False |
619 | remote_fetched = False | 621 | remote_fetched = False |
620 | buf = io.StringIO() | 622 | buf = io.StringIO() |
@@ -660,15 +662,31 @@ later is required to fix a server side protocol bug. | |||
660 | % (project.name, type(e).__name__, str(e)), | 662 | % (project.name, type(e).__name__, str(e)), |
661 | file=sys.stderr, | 663 | file=sys.stderr, |
662 | ) | 664 | ) |
665 | del self._sync_dict[k] | ||
663 | raise | 666 | raise |
664 | 667 | ||
665 | finish = time.time() | 668 | finish = time.time() |
669 | del self._sync_dict[k] | ||
666 | return _FetchOneResult(success, project, start, finish, remote_fetched) | 670 | return _FetchOneResult(success, project, start, finish, remote_fetched) |
667 | 671 | ||
668 | @classmethod | 672 | @classmethod |
669 | def _FetchInitChild(cls, ssh_proxy): | 673 | def _FetchInitChild(cls, ssh_proxy): |
670 | cls.ssh_proxy = ssh_proxy | 674 | cls.ssh_proxy = ssh_proxy |
671 | 675 | ||
676 | def _GetLongestSyncMessage(self): | ||
677 | if len(self._sync_dict) == 0: | ||
678 | return None | ||
679 | |||
680 | earliest_time = float("inf") | ||
681 | earliest_proj = None | ||
682 | for project, t in self._sync_dict.items(): | ||
683 | if t < earliest_time: | ||
684 | earliest_time = t | ||
685 | earliest_proj = project | ||
686 | |||
687 | elapsed = time.time() - earliest_time | ||
688 | return f"{elapsed_str(elapsed)} {earliest_proj}" | ||
689 | |||
672 | def _Fetch(self, projects, opt, err_event, ssh_proxy): | 690 | def _Fetch(self, projects, opt, err_event, ssh_proxy): |
673 | ret = True | 691 | ret = True |
674 | 692 | ||
@@ -681,8 +699,22 @@ later is required to fix a server side protocol bug. | |||
681 | delay=False, | 699 | delay=False, |
682 | quiet=opt.quiet, | 700 | quiet=opt.quiet, |
683 | show_elapsed=True, | 701 | show_elapsed=True, |
702 | elide=True, | ||
684 | ) | 703 | ) |
685 | 704 | ||
705 | self._sync_dict = multiprocessing.Manager().dict() | ||
706 | sync_event = _threading.Event() | ||
707 | |||
708 | def _MonitorSyncLoop(): | ||
709 | while True: | ||
710 | pm.update(inc=0, msg=self._GetLongestSyncMessage()) | ||
711 | if sync_event.wait(timeout=1): | ||
712 | return | ||
713 | |||
714 | sync_progress_thread = _threading.Thread(target=_MonitorSyncLoop) | ||
715 | sync_progress_thread.daemon = True | ||
716 | sync_progress_thread.start() | ||
717 | |||
686 | objdir_project_map = dict() | 718 | objdir_project_map = dict() |
687 | for project in projects: | 719 | for project in projects: |
688 | objdir_project_map.setdefault(project.objdir, []).append(project) | 720 | objdir_project_map.setdefault(project.objdir, []).append(project) |
@@ -712,7 +744,7 @@ later is required to fix a server side protocol bug. | |||
712 | ret = False | 744 | ret = False |
713 | else: | 745 | else: |
714 | fetched.add(project.gitdir) | 746 | fetched.add(project.gitdir) |
715 | pm.update(msg=f"Last synced: {project.name}") | 747 | pm.update() |
716 | if not ret and opt.fail_fast: | 748 | if not ret and opt.fail_fast: |
717 | break | 749 | break |
718 | return ret | 750 | return ret |
@@ -764,6 +796,7 @@ later is required to fix a server side protocol bug. | |||
764 | # crash. | 796 | # crash. |
765 | del Sync.ssh_proxy | 797 | del Sync.ssh_proxy |
766 | 798 | ||
799 | sync_event.set() | ||
767 | pm.end() | 800 | pm.end() |
768 | self._fetch_times.Save() | 801 | self._fetch_times.Save() |
769 | 802 | ||