def copyToImage(dstImgPath, methodArgs): totalSize = getLengthFromArgs(methodArgs) fileObj = methodArgs['fileObj'] # Unlike copyFromImage, we don't use direct I/O when writing because: # - Images are small so using host page cache is ok. # - Images typically aligned to 512 bytes (tar), may fail on 4k storage. cmd = [ constants.EXT_DD, "of=%s" % dstImgPath, "bs=%s" % MiB, # Ensure that data reach physical storage before returning. "conv=fsync", ] log.info("Copy to image %s", dstImgPath) with utils.stopwatch("Copy %s bytes" % totalSize, level=logging.INFO, log=log): p = commands.start(cmd, stdin=subprocess.PIPE, stderr=subprocess.PIPE) with commands.terminating(p): _copyData(fileObj, p.stdin, totalSize) try: _, err = p.communicate(timeout=WAIT_TIMEOUT) except subprocess.TimeoutExpired: log.error("timeout waiting for dd process") raise se.StorageException() if p.returncode != 0: log.error("dd failed rc=%s err=%r", p.returncode, err) raise se.MiscFileWriteException()
def copyToImage(dstImgPath, methodArgs): totalSize = getLengthFromArgs(methodArgs) fileObj = methodArgs['fileObj'] cmd = [constants.EXT_DD, "of=%s" % dstImgPath, "bs=%s" % constants.MEGAB] p = commands.execCmd(cmd, sync=False) with utils.terminating(p): _copyData(fileObj, p.stdin, totalSize) p.stdin.close() if not p.wait(WAIT_TIMEOUT): log.error("timeout waiting for dd process") raise se.StorageException() if p.returncode != 0: log.error("dd error - code %s, stderr %s", p.returncode, p.stderr.read(1000)) raise se.MiscFileWriteException()