|
22 | 22 | # Python
|
23 | 23 | import json
|
24 | 24 | import stat
|
25 |
| -import multiprocessing |
26 | 25 | import threading
|
27 | 26 | import base64
|
28 | 27 | import functools
|
@@ -127,7 +126,6 @@ class EventContext:
|
127 | 126 | '''
|
128 | 127 |
|
129 | 128 | def __init__(self):
|
130 |
| - self.display_lock = multiprocessing.RLock() |
131 | 129 | self._global_ctx = {}
|
132 | 130 | self._local = threading.local()
|
133 | 131 | if os.getenv('AWX_ISOLATED_DATA_DIR'):
|
@@ -224,24 +222,21 @@ def get_end_dict(self):
|
224 | 222 |
|
225 | 223 | def dump(self, fileobj, data, max_width=78, flush=False):
|
226 | 224 | b64data = base64.b64encode(json.dumps(data).encode('utf-8')).decode()
|
227 |
| - with self.display_lock: |
228 |
| - # pattern corresponding to OutputEventFilter expectation |
229 |
| - fileobj.write('\x1b[K') |
230 |
| - for offset in range(0, len(b64data), max_width): |
231 |
| - chunk = b64data[offset:offset + max_width] |
232 |
| - escaped_chunk = f'{chunk}\x1b[{len(chunk)}D' |
233 |
| - fileobj.write(escaped_chunk) |
234 |
| - fileobj.write('\x1b[K') |
235 |
| - if flush: |
236 |
| - fileobj.flush() |
| 225 | + # pattern corresponding to OutputEventFilter expectation |
| 226 | + fileobj.write('\x1b[K') |
| 227 | + for offset in range(0, len(b64data), max_width): |
| 228 | + chunk = b64data[offset:offset + max_width] |
| 229 | + escaped_chunk = f'{chunk}\x1b[{len(chunk)}D' |
| 230 | + fileobj.write(escaped_chunk) |
| 231 | + fileobj.write('\x1b[K') |
237 | 232 |
|
238 | 233 | def dump_begin(self, fileobj):
|
239 | 234 | begin_dict = self.get_begin_dict()
|
240 | 235 | self.cache.set(f":1:ev-{begin_dict['uuid']}", begin_dict)
|
241 | 236 | self.dump(fileobj, {'uuid': begin_dict['uuid']})
|
242 | 237 |
|
243 | 238 | def dump_end(self, fileobj):
|
244 |
| - self.dump(fileobj, self.get_end_dict(), flush=True) |
| 239 | + self.dump(fileobj, self.get_end_dict()) |
245 | 240 |
|
246 | 241 |
|
247 | 242 | event_context = EventContext()
|
@@ -294,19 +289,18 @@ def wrapper(*args, **kwargs):
|
294 | 289 | log_only = args[5] if len(args) >= 6 else kwargs.get('log_only', False)
|
295 | 290 | stderr = args[3] if len(args) >= 4 else kwargs.get('stderr', False)
|
296 | 291 | event_uuid = event_context.get().get('uuid', None)
|
297 |
| - with event_context.display_lock: |
298 |
| - # If writing only to a log file or there is already an event UUID |
299 |
| - # set (from a callback module method), skip dumping the event data. |
300 |
| - if log_only or event_uuid: |
301 |
| - return f(*args, **kwargs) |
302 |
| - try: |
303 |
| - fileobj = sys.stderr if stderr else sys.stdout |
304 |
| - event_context.add_local(uuid=str(uuid.uuid4())) |
305 |
| - event_context.dump_begin(fileobj) |
306 |
| - return f(*args, **kwargs) |
307 |
| - finally: |
308 |
| - event_context.dump_end(fileobj) |
309 |
| - event_context.remove_local(uuid=None) |
| 292 | + # If writing only to a log file or there is already an event UUID |
| 293 | + # set (from a callback module method), skip dumping the event data. |
| 294 | + if log_only or event_uuid: |
| 295 | + return f(*args, **kwargs) |
| 296 | + try: |
| 297 | + fileobj = sys.stderr if stderr else sys.stdout |
| 298 | + event_context.add_local(uuid=str(uuid.uuid4())) |
| 299 | + event_context.dump_begin(fileobj) |
| 300 | + return f(*args, **kwargs) |
| 301 | + finally: |
| 302 | + event_context.dump_end(fileobj) |
| 303 | + event_context.remove_local(uuid=None) |
310 | 304 |
|
311 | 305 | return wrapper
|
312 | 306 |
|
@@ -370,18 +364,17 @@ def capture_event_data(self, event, **event_data):
|
370 | 364 | if isinstance(item, dict) and item.get('_ansible_no_log', False):
|
371 | 365 | event_data['res']['results'][i] = {'censored': CENSORED}
|
372 | 366 |
|
373 |
| - with event_context.display_lock: |
374 |
| - try: |
375 |
| - event_context.add_local(event=event, **event_data) |
376 |
| - if task: |
377 |
| - self.set_task(task, local=True) |
378 |
| - event_context.dump_begin(sys.stdout) |
379 |
| - yield |
380 |
| - finally: |
381 |
| - event_context.dump_end(sys.stdout) |
382 |
| - if task: |
383 |
| - self.clear_task(local=True) |
384 |
| - event_context.remove_local(event=None, **event_data) |
| 367 | + try: |
| 368 | + event_context.add_local(event=event, **event_data) |
| 369 | + if task: |
| 370 | + self.set_task(task, local=True) |
| 371 | + event_context.dump_begin(sys.stdout) |
| 372 | + yield |
| 373 | + finally: |
| 374 | + event_context.dump_end(sys.stdout) |
| 375 | + if task: |
| 376 | + self.clear_task(local=True) |
| 377 | + event_context.remove_local(event=None, **event_data) |
385 | 378 |
|
386 | 379 | def set_playbook(self, playbook):
|
387 | 380 | file_name = getattr(playbook, '_file_name', '???')
|
|
0 commit comments