diff options
author | Mike Frysinger <vapier@google.com> | 2019-01-14 16:02:55 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@google.com> | 2019-01-14 16:11:08 -0500 |
commit | 13f323b2c221db4e69e3f5a671455954b65f1fb3 (patch) | |
tree | bb1205ce8740d07edc274c1dcb1f85a21156ff04 /event_log.py | |
parent | 12ee5446e9eb8b9d0ae5425fb1e00bf05f93facd (diff) | |
download | git-repo-13f323b2c221db4e69e3f5a671455954b65f1fb3.tar.gz |
event_log: turn id generation from a generator to a func callv1.13.2
Running lots of sync processes in parallel can hit the failure:
Fetching projects: 23% (124/523)Exception in thread Thread-201:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/local/src/repo/subcmds/sync.py", line 278, in _FetchProjectList
success = self._FetchHelper(opt, project, *args, **kwargs)
File "/usr/local/src/repo/subcmds/sync.py", line 357, in _FetchHelper
start, finish, success)
File "/usr/local/src/repo/event_log.py", line 104, in AddSync
event = self.Add(project.relpath, task_name, start, finish, success)
File "/usr/local/src/repo/event_log.py", line 74, in Add
'id': (kind, next(self._next_id)),
ValueError: generator already executing
It looks like, while we lock the multiprocessing value correctly, the
generator that wraps the value isn't parallel safe. Since we don't
have a way of doing that (as it's part of the language), turn it into
a plain function call instead.
Bug: https://crbug.com/gerrit/10293
Change-Id: I0db03601986ca0370a1699bab32adb03e7b2910a
Diffstat (limited to 'event_log.py')
-rw-r--r-- | event_log.py | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/event_log.py b/event_log.py index 508b18ee..0696df50 100644 --- a/event_log.py +++ b/event_log.py | |||
@@ -51,7 +51,6 @@ class EventLog(object): | |||
51 | def __init__(self): | 51 | def __init__(self): |
52 | """Initializes the event log.""" | 52 | """Initializes the event log.""" |
53 | self._log = [] | 53 | self._log = [] |
54 | self._next_id = _EventIdGenerator() | ||
55 | self._parent = None | 54 | self._parent = None |
56 | 55 | ||
57 | def Add(self, name, task_name, start, finish=None, success=None, | 56 | def Add(self, name, task_name, start, finish=None, success=None, |
@@ -71,7 +70,7 @@ class EventLog(object): | |||
71 | A dictionary of the event added to the log. | 70 | A dictionary of the event added to the log. |
72 | """ | 71 | """ |
73 | event = { | 72 | event = { |
74 | 'id': (kind, next(self._next_id)), | 73 | 'id': (kind, _NextEventId()), |
75 | 'name': name, | 74 | 'name': name, |
76 | 'task_name': task_name, | 75 | 'task_name': task_name, |
77 | 'start_time': start, | 76 | 'start_time': start, |
@@ -162,16 +161,16 @@ class EventLog(object): | |||
162 | f.write('\n') | 161 | f.write('\n') |
163 | 162 | ||
164 | 163 | ||
165 | def _EventIdGenerator(): | 164 | # An integer id that is unique across this invocation of the program. |
166 | """Returns multi-process safe iterator that generates locally unique id. | 165 | _EVENT_ID = multiprocessing.Value('i', 1) |
167 | 166 | ||
168 | Yields: | 167 | def _NextEventId(): |
168 | """Helper function for grabbing the next unique id. | ||
169 | |||
170 | Returns: | ||
169 | A unique, to this invocation of the program, integer id. | 171 | A unique, to this invocation of the program, integer id. |
170 | """ | 172 | """ |
171 | eid = multiprocessing.Value('i', 1) | 173 | with _EVENT_ID.get_lock(): |
172 | 174 | val = _EVENT_ID.value | |
173 | while True: | 175 | _EVENT_ID.value += 1 |
174 | with eid.get_lock(): | 176 | return val |
175 | val = eid.value | ||
176 | eid.value += 1 | ||
177 | yield val | ||