mirror of https://git.48k.eu/ogclient
Revert "live: improve lzop and partclone error handling"
This reverts commit 57787dab54
.
Read from stderr is blocking if no data is available, revert this patch since
ogClient hangs indefinitely in lzop invocations due to races in process
execution through Popen.
master
parent
474183ab71
commit
1aba9d0923
|
@ -190,28 +190,14 @@ class OgLiveOperations:
|
|||
if not os.path.exists(image_path):
|
||||
raise RuntimeError(f'Image not found at {image_path} during image restore')
|
||||
|
||||
proc_lzop = subprocess.Popen(cmd_lzop,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
proc_pc = subprocess.Popen(cmd_pc,
|
||||
stdin=proc_lzop.stdout,
|
||||
stderr=subprocess.PIPE)
|
||||
|
||||
pc_stderr = proc_pc.communicate()[1]
|
||||
lzop_stderr = proc_lzop.stderr.read()
|
||||
proc_lzop.poll() # update returncode
|
||||
|
||||
with open('/tmp/command.log', 'wb', 0) as logfile:
|
||||
logfile.write(lzop_stderr)
|
||||
logfile.write(pc_stderr)
|
||||
|
||||
if proc_lzop.returncode != 0:
|
||||
raise OSError(f'lzop subprocess failed: {lzop_stderr.decode("utf-8")}')
|
||||
|
||||
if proc_pc.returncode != 0:
|
||||
raise OSError(f'partclone subprocess failed: {pc_stderr.decode("utf-8")}')
|
||||
|
||||
logging.info('Image restore successful')
|
||||
proc_lzop = subprocess.Popen(cmd_lzop,
|
||||
stdout=subprocess.PIPE)
|
||||
proc_pc = subprocess.Popen(cmd_pc,
|
||||
stdin=proc_lzop.stdout,
|
||||
stderr=logfile)
|
||||
proc_lzop.stdout.close()
|
||||
proc_pc.communicate()
|
||||
|
||||
def _ogbrowser_clear_logs(self):
|
||||
logfiles = ['/tmp/command.log', '/tmp/session.log']
|
||||
|
@ -465,37 +451,32 @@ class OgLiveOperations:
|
|||
if ogReduceFs(disk, partition) == -1:
|
||||
raise ValueError(f'Failed to shrink {fstype} filesystem in {padev}')
|
||||
|
||||
cmd1 = shlex.split(f'partclone.{fstype} -I -C --clone -s {padev} -O -')
|
||||
cmd2 = shlex.split(f'lzop -1 -fo {image_path}')
|
||||
|
||||
logfile = open('/tmp/command.log', 'wb', 0)
|
||||
|
||||
if os.path.exists(image_path) and backup:
|
||||
shutil.move(image_path, f'{image_path}.ant')
|
||||
|
||||
p1 = Popen(cmd1, stdout=PIPE, stderr=logfile)
|
||||
p2 = Popen(cmd2, stdin=p1.stdout)
|
||||
p1.stdout.close()
|
||||
|
||||
logging.info(f'Creating image at {image_path} from {padev} using {fstype}')
|
||||
logging.info('*DO NOT REBOOT OR POWEROFF* the client during this time')
|
||||
|
||||
cmd_pc = shlex.split(f'partclone.{fstype} -I -C --clone -s {padev} -O -')
|
||||
cmd_lzop = shlex.split(f'lzop -1 -fo {image_path}')
|
||||
try:
|
||||
retdata = p2.communicate()
|
||||
except OSError as e:
|
||||
raise OSError(f'Unexpected error when running partclone and lzop commands: {e}') from e
|
||||
finally:
|
||||
logfile.close()
|
||||
p2.terminate()
|
||||
p1.poll()
|
||||
|
||||
proc_pc = subprocess.Popen(cmd_pc,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
proc_lzop = subprocess.Popen(cmd_lzop,
|
||||
stdin=proc_pc.stdout,
|
||||
stderr=subprocess.PIPE)
|
||||
|
||||
lzop_stderr = proc_lzop.communicate()[1]
|
||||
pc_stderr = proc_pc.stderr.read()
|
||||
proc_pc.poll() # update returncode
|
||||
|
||||
with open('/tmp/command.log', 'wb', 0) as logfile:
|
||||
logfile.write(pc_stderr)
|
||||
logfile.write(lzop_stderr)
|
||||
|
||||
if proc_pc.returncode != 0:
|
||||
raise OSError(f'partclone subprocess failed: {pc_stderr.decode("utf-8")}')
|
||||
|
||||
if proc_lzop.returncode != 0:
|
||||
raise OSError(f'lzop subprocess failed: {lzop_stderr.decode("utf-8")}')
|
||||
|
||||
logging.info('Image creation successful')
|
||||
logging.info(f'partclone process exited with code {p1.returncode}')
|
||||
logging.info(f'lzop process exited with code {p2.returncode}')
|
||||
|
||||
ogExtendFs(disk, partition)
|
||||
|
||||
|
|
Loading…
Reference in New Issue