Skip to content

Commit 7de1d3d

Browse files
committed
Do not lock around writing to stdout, do not flush
1 parent ca0df81 commit 7de1d3d

File tree

1 file changed

+31
-38
lines changed

1 file changed

+31
-38
lines changed

src/ansible_runner/display_callback/callback/awx_display.py

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
# Python
2323
import json
2424
import stat
25-
import multiprocessing
2625
import threading
2726
import base64
2827
import functools
@@ -127,7 +126,6 @@ class EventContext:
127126
'''
128127

129128
def __init__(self):
130-
self.display_lock = multiprocessing.RLock()
131129
self._global_ctx = {}
132130
self._local = threading.local()
133131
if os.getenv('AWX_ISOLATED_DATA_DIR'):
@@ -224,24 +222,21 @@ def get_end_dict(self):
224222

225223
def dump(self, fileobj, data, max_width=78, flush=False):
226224
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')
237232

238233
def dump_begin(self, fileobj):
239234
begin_dict = self.get_begin_dict()
240235
self.cache.set(f":1:ev-{begin_dict['uuid']}", begin_dict)
241236
self.dump(fileobj, {'uuid': begin_dict['uuid']})
242237

243238
def dump_end(self, fileobj):
244-
self.dump(fileobj, self.get_end_dict(), flush=True)
239+
self.dump(fileobj, self.get_end_dict())
245240

246241

247242
event_context = EventContext()
@@ -294,19 +289,18 @@ def wrapper(*args, **kwargs):
294289
log_only = args[5] if len(args) >= 6 else kwargs.get('log_only', False)
295290
stderr = args[3] if len(args) >= 4 else kwargs.get('stderr', False)
296291
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)
310304

311305
return wrapper
312306

@@ -370,18 +364,17 @@ def capture_event_data(self, event, **event_data):
370364
if isinstance(item, dict) and item.get('_ansible_no_log', False):
371365
event_data['res']['results'][i] = {'censored': CENSORED}
372366

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)
385378

386379
def set_playbook(self, playbook):
387380
file_name = getattr(playbook, '_file_name', '???')

0 commit comments

Comments
 (0)