]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-daemon: do not screw up line splitting 31420/head
authorSage Weil <sage@redhat.com>
Tue, 5 Nov 2019 16:36:30 +0000 (10:36 -0600)
committerSage Weil <sage@redhat.com>
Tue, 5 Nov 2019 18:11:06 +0000 (12:11 -0600)
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 <sage@redhat.com>
src/ceph-daemon

index 3ac579e4310b15bc94cef496e9cd7ec7547b23ce..c77f0554de3ec585b5835532a07845bac17396a2 100755 (executable)
@@ -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)))