Mercurial > hg
annotate hgdemandimport/tracing.py @ 45074:797ef6f8295e
fix: prefetch file contents
This prevents the worker subprocesses from contacting the server individually,
which is either inefficient, or leads to problems if the connection is shared
among them.
Differential Revision: https://phab.mercurial-scm.org/D8723
author | Rodrigo Damazio Bovendorp <rdamazio@google.com> |
---|---|
date | Thu, 09 Jul 2020 20:46:52 -0700 |
parents | 2372284d9457 |
children | 6000f5b25c9b |
rev | line source |
---|---|
39254
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 # Support code for event tracing in Mercurial. Lives in demandimport |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 # so it can also be used in demandimport. |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 # |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 # Copyright 2018 Google LLC. |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 # |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 # GNU General Public License version 2 or any later version. |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 from __future__ import absolute_import |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 import contextlib |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 import os |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 _pipe = None |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 _checked = False |
42709
978c9a0c5974
demandimport: explicitly declare `_session` at the module level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42477
diff
changeset
|
15 _session = 'none' |
39254
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42709
diff
changeset
|
17 |
42476
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
18 def _isactive(): |
39254
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 global _pipe, _session, _checked |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 if _pipe is None: |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 if _checked: |
42476
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
22 return False |
39254
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 _checked = True |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 if 'HGCATAPULTSERVERPIPE' not in os.environ: |
42476
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
25 return False |
39254
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 _pipe = open(os.environ['HGCATAPULTSERVERPIPE'], 'w', 1) |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 _session = os.environ.get('HGCATAPULTSESSION', 'none') |
42476
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
28 return True |
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
29 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42709
diff
changeset
|
30 |
42476
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
31 @contextlib.contextmanager |
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
32 def log(whencefmt, *whenceargs): |
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
33 if not _isactive(): |
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
34 yield |
d0b8a3cfd732
tracing: extract tracing-active logic to separate function
Augie Fackler <augie@google.com>
parents:
39397
diff
changeset
|
35 return |
39254
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
36 whence = whencefmt % whenceargs |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 try: |
39397
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
38 # Both writes to the pipe are wrapped in try/except to ignore |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
39 # errors, as we can see mysterious errors in here if the pager |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
40 # is active. Presumably other conditions could trigger |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
41 # problems too. |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
42 try: |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
43 _pipe.write('START %s %s\n' % (_session, whence)) |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
44 except IOError: |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
45 pass |
39254
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
46 yield |
284440041141
tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 finally: |
39397
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
48 try: |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
49 _pipe.write('END %s %s\n' % (_session, whence)) |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
50 except IOError: |
452790284a15
tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents:
39254
diff
changeset
|
51 pass |
42477
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
52 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42709
diff
changeset
|
53 |
42477
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
54 def counter(label, amount, *labelargs): |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
55 if not _isactive(): |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
56 return |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
57 l = label % labelargs |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
58 # See above in log() for why this is in a try/except. |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
59 try: |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
60 _pipe.write('COUNTER %s %d %s\n' % (_session, amount, l)) |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
61 except IOError: |
e658ac39fe41
tracing: add support for emitting counters
Augie Fackler <augie@google.com>
parents:
42476
diff
changeset
|
62 pass |