From 83b072f3cc5255590d5aa096f784bc99d2409e49 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 5 Nov 2019 10:36:30 -0600 Subject: [PATCH] ceph-daemon: do not screw up line splitting When we log stdout and stderr, we were artificially adding line splits due to reading 1024 bytes at a time and assuming it was aligned with a newline. Fix by keeping partial lines buffered and only log them once they are complete (or the call finishes). Signed-off-by: Sage Weil --- src/ceph-daemon | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/ceph-daemon b/src/ceph-daemon index 3ac579e4310..c77f0554de3 100755 --- a/src/ceph-daemon +++ b/src/ceph-daemon @@ -115,6 +115,8 @@ def call(command, desc=None, verbose=False, **kwargs): err = '' reads = None stop = False + out_buffer = '' # partial line (no newline yet) + err_buffer = '' # partial line (no newline yet) while not stop: if reads and process.poll() is not None: # we want to stop, but first read off anything remaining @@ -132,14 +134,20 @@ def call(command, desc=None, verbose=False, **kwargs): message = message.decode('utf-8') if fd == process.stdout.fileno(): out += message - for line in message.splitlines(): + message = out_buffer + message + lines = message.split('\n') + out_buffer = lines.pop() + for line in lines: if verbose: logger.info(desc + ':stdout ' + line) else: logger.debug(desc + ':stdout ' + line) elif fd == process.stderr.fileno(): err += message - for line in message.splitlines(): + message = err_buffer + message + lines = message.split('\n') + err_buffer = lines.pop() + for line in lines: if verbose: logger.info(desc + ':stderr ' + line) else: @@ -151,6 +159,17 @@ def call(command, desc=None, verbose=False, **kwargs): returncode = process.wait() + if out_buffer != '': + if verbose: + logger.info(desc + ':stdout ' + out_buffer) + else: + logger.debug(desc + ':stdout ' + out_buffer) + if err_buffer != '': + if verbose: + logger.info(desc + ':stderr ' + err_buffer) + else: + logger.debug(desc + ':stderr ' + err_buffer) + if returncode != 0 and verbose_on_failure and not verbose: # dump stdout + stderr logger.info('Non-zero exit code %d from %s' % (returncode, ' '.join(command))) -- 2.39.5