def put_with_host(uptoken, key, f, fsize, extra, host): block_cnt = block_count(fsize) if extra.progresses is None: extra.progresses = [None] * block_cnt else: if not len(extra.progresses) == block_cnt: return None, err_invalid_put_progress, 0 if extra.try_times is None: extra.try_times = _try_times if extra.chunk_size is None: extra.chunk_size = _chunk_size for i in xrange(block_cnt): try_time = extra.try_times read_length = _block_size if (i + 1) * _block_size > fsize: read_length = fsize - i * _block_size data_slice = f.read(read_length) while True: err = resumable_block_put(data_slice, i, extra, uptoken, host) if err is None: break try_time -= 1 if try_time <= 0: return None, err_put_failed, 0 print err, ".. retry" mkfile_host = extra.progresses[-1]["host"] if block_cnt else host mkfile_client = auth_up.Client(uptoken, mkfile_host) return mkfile(mkfile_client, key, fsize, extra, host)
def resumable_block_put(block, index, extra, uptoken): block_size = len(block) mkblk_client = auth_up.Client(uptoken, conf.UP_HOST) if extra.progresses[index] is None or "ctx" not in extra.progresses[index]: crc32 = gen_crc32(block) block = bytearray(block) extra.progresses[index], err = mkblock(mkblk_client, block_size, block) if err is not None: extra.notify_err(index, block_size, err) return err if not extra.progresses[index]["crc32"] == crc32: return err_unmatched_checksum extra.notify(index, block_size, extra.progresses[index]) return
def put(uptoken, key, f, fsize, extra): """ 上传二进制流, 通过将data "切片" 分段上传 """ if not isinstance(extra, PutExtra): print("extra must the instance of PutExtra") return block_cnt = block_count(fsize) if extra.progresses is None: extra.progresses = [None] * block_cnt else: if not len(extra.progresses) == block_cnt: return None, err_invalid_put_progress if extra.try_times is None: extra.try_times = _try_times if extra.chunk_size is None: extra.chunk_size = _chunk_size for i in xrange(block_cnt): try_time = extra.try_times read_length = _block_size if (i + 1) * _block_size > fsize: read_length = fsize - i * _block_size data_slice = f.read(read_length) while True: err = resumable_block_put(data_slice, i, extra, uptoken) if err is None: break try_time -= 1 if try_time <= 0: return None, err_put_failed print err, ".. retry" mkfile_client = auth_up.Client(uptoken, extra.progresses[-1]["host"]) return mkfile(mkfile_client, key, fsize, extra)