From: Sage Weil Date: Sat, 20 Feb 2021 16:58:47 +0000 (-0500) Subject: ceph: print command output to stdout even on error X-Git-Tag: v14.2.22~25^2~16^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=2a27cb276057ec30e0238e7d3519aadce0b5e1d9;p=ceph.git ceph: print command output to stdout even on error Currently in the case where the mon returns a command error code, we print the error stream and Error ... message but not the command output. Usually there isn't any, so we haven't noticed until now, but there is not reason why shouldn't return both an error code and some output. Restructure the code so that the error message goes *after* the JSON output, where it will be a bit more obvious to the user (if the stdout scrolled the terminal, for instance). (This is not a change in behavior since previously we weren't seeing the stdout at all.) Signed-off-by: Sage Weil (cherry picked from commit 9425eee579adc2408602fb1734dc5aecf58ee4f2) Conflicts: src/ceph.in - nautilus has to support Python 2, so preserve the "u" prefix on the string literal --- diff --git a/src/ceph.in b/src/ceph.in index 28562eccb3219..f281aa18a9215 100755 --- a/src/ceph.in +++ b/src/ceph.in @@ -1213,18 +1213,6 @@ def main(): errno.errorcode.get(ret, 'Unknown'), outs), file=sys.stderr) - if ret < 0: - ret = -ret - errstr = errno.errorcode.get(ret, 'Unknown') - print(u'Error {0}: {1}'.format(errstr, outs), file=sys.stderr) - if len(targets) > 1: - final_ret = ret - else: - return ret - - if outs: - print(prefix + outs, file=sys.stderr) - sys.stdout.flush() if parsed_args.output_file: @@ -1250,12 +1238,23 @@ def main(): except IOError as e: if e.errno != errno.EPIPE: raise e + final_e = None try: sys.stdout.flush() except IOError as e: if e.errno != errno.EPIPE: - raise e + final_e = e + + if ret < 0: + ret = -ret + errstr = errno.errorcode.get(ret, 'Unknown') + print(u'Error {0}: {1}'.format(errstr, outs), file=sys.stderr) + final_ret = ret + elif outs: + print(prefix + outs, file=sys.stderr) + if final_e: + raise final_e # Block until command completion (currently scrub and deep_scrub only) if block: