From daff276aa0784a2c8f66feb62cfdd312366d6bd0 Mon Sep 17 00:00:00 2001 From: Vadim Troshchinskiy Date: Thu, 14 Aug 2025 09:17:24 +0200 Subject: [PATCH] refs #2621: Redo interfaceAdmin to avoid truncating output --- src/opengnsys/workers/oglive_worker.py | 55 ++++++++++++++++++-------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index 0e538b0..537d3f5 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -299,27 +299,50 @@ class ogLiveWorker(ServerWorker): sout = serr = '' finished = False - while True: - try: - p.wait (0.05) - finished = True - except subprocess.TimeoutExpired: - pass - ready_to_read, _, _ = select.select ([p.stdout, p.stderr], [], [], 0.2) + out_finished = False + err_finished = False + + buf_size = 4096 + stdout_buf = bytes() + stderr_buf = bytes() + + while True: + ready_to_read, _, exceptions = select.select ([p.stdout, p.stderr], [], [p.stdout, p.stderr], 0.2) + if p.stdout in ready_to_read: - l = p.stdout.readline() - partial = l.decode ('utf-8', 'ignore') - if self.stdout_q: self.stdout_q.put (partial) - sout += partial + data = p.stdout.read(buf_size) + stdout_buf = stdout_buf + data + + if len(data) < buf_size: + out_finished = True + if p.stderr in ready_to_read: - l = p.stderr.readline() - partial = l.decode ('utf-8', 'ignore') - serr += partial + data = p.stdout.read(buf_size) + stderr_buf = stderr_buf + data + + if len(data) < buf_size: + err_finished = True + + if p.stdout in exceptions or p.stderr in exceptions: + # Error in either socket + finished = True + + if out_finished and err_finished: + finished = True if finished: break - sout = sout.strip() - serr = serr.strip() + + + sout = stdout_buf.decode('utf-8', 'ignore').strip() + serr = stdout_buf.decode('utf-8', 'ignore').strip() + + try: + p.wait (0.1) + finished = True + except subprocess.TimeoutExpired: + pass + ## DEBUG logger.debug (f'stdout follows:')