diff --git a/k8s_gitlab_borg/__main__.py b/k8s_gitlab_borg/__main__.py index 29f8a08..ef68990 100644 --- a/k8s_gitlab_borg/__main__.py +++ b/k8s_gitlab_borg/__main__.py @@ -459,6 +459,10 @@ def main(): stdout_logger = proc_logger.getChild("stdout") stderr_logger = proc_logger.getChild("stderr") + os.set_blocking(proc.stdin.fileno(), False) + os.set_blocking(proc.stdout.fileno(), False) + os.set_blocking(proc.stderr.fileno(), False) + poll = select.poll() poll.register( proc.stdin, select.POLLOUT | select.POLLHUP | select.POLLERR @@ -482,6 +486,8 @@ def main(): events = poll.poll() logger.debug("Done, %d event(s)", len(events)) pipe_buffer = b"" + stdout_line_buffer = bytearray(b"") + stderr_line_buffer = bytearray(b"") while pollc > 0 and len(events) > 0: for rfd, event in events: logger.debug("rfd=%d, event=%x", rfd, event) @@ -503,15 +509,33 @@ def main(): proc.stdin.close() if event & select.POLLIN or event & select.POLLPRI: if rfd == proc.stdout.fileno(): - logger.debug("Reading line from stdout...") - if line := proc.stdout.readline(): - logger.debug("Done") - stdout_logger.info(line[:-1]) + logger.debug("Reading from stdout...") + if chunk := proc.stdout.read(PIPE_BUF): + logger.debug("Done, length %d", len(chunk)) + stdout_line_buffer.append(chunk) + while True: + line, sep, rest = stdout_line_buffer.partition( + b"\n" + ) + if sep: + stdout_logger.info(line) + stdout_line_buffer = rest + else: + break if rfd == proc.stderr.fileno(): - logger.debug("Reading line from stderr...") - if line := proc.stderr.readline(): - logger.debug("Done") - stderr_logger.info(line[:-1]) + logger.debug("Reading from stderr...") + if chunk := proc.stderr.read(PIPE_BUF): + logger.debug("Done, length %d", len(chunk)) + stderr_line_buffer.append(chunk) + while True: + line, sep, rest = stderr_line_buffer.partition( + b"\n" + ) + if sep: + stderr_logger.info(line) + stderr_line_buffer = rest + else: + break if event & select.POLLERR: if rfd == proc.stdin.fileno(): logger.error("STDIN error") @@ -536,6 +560,13 @@ def main(): else: logger.debug("Nothing left to poll") + if stdout_line_buffer: + for line in stdout_line_buffer.split(b"\n"): + stdout_logger.info(line) + if stderr_line_buffer: + for line in stderr_line_buffer.split(b"\n"): + stderr_logger.info(line) + for handler in proc_logger.handlers: handler.flush()