summaryrefslogtreecommitdiffstats
path: root/event_log.py
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2019-01-14 16:02:55 -0500
committerMike Frysinger <vapier@google.com>2019-01-14 16:11:08 -0500
commit13f323b2c221db4e69e3f5a671455954b65f1fb3 (patch)
treebb1205ce8740d07edc274c1dcb1f85a21156ff04 /event_log.py
parent12ee5446e9eb8b9d0ae5425fb1e00bf05f93facd (diff)
downloadgit-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.py23
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
165def _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: 167def _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