in alibabacloud_oss_v2/checkpoint.py [0:0]
def _is_valid(self) -> bool:
try:
dcp_info = {}
with open(self.cp_filepath, 'rb') as f:
dcp_info = json.loads(f.read())
if not isinstance(dcp_info, Dict):
return False
js = json.dumps(dcp_info.get("Data", {})).encode()
h = hashlib.md5()
h.update(js)
md5sum = h.hexdigest()
if (CHECKPOINT_MAGIC != dcp_info.get("Magic") or
md5sum != dcp_info.get("MD5")):
return False
cpid = self.cp_info["Data"]
dcpid = dcp_info["Data"]
#compare
if (cpid["ObjectInfo"] != dcpid["ObjectInfo"] or
cpid["ObjectMeta"] != dcpid["ObjectMeta"] or
cpid["FilePath"] != dcpid["FilePath"] or
cpid["PartSize"] != dcpid["PartSize"]):
return False
#download info
offset = dcpid["DownloadInfo"].get('Offset', 0)
crc64 = dcpid["DownloadInfo"].get('CRC64', 0)
if (not isinstance(offset, int) or
not isinstance(crc64, int)):
return False
if offset == 0 and crc64 != 0:
return False
roffset = 0
if len(cpid["ObjectInfo"]["Range"]) > 0:
range_header = parse_http_range(cpid["ObjectInfo"]["Range"])
if offset < range_header[0]:
return False
roffset = range_header[0]
remains = (offset - roffset) % dcpid["PartSize"]
if remains != 0:
return False
#valid data
if self.verify_data and crc64 != 0:
try:
with open(dcpid["FilePath"], 'rb') as f:
chash = Crc64(0)
limitn = offset - roffset
r = LimitReader(f, limitn)
chunk = 32 * 1024
for _ in range(0, limitn, chunk):
chash.write(r.read(chunk))
if chash.sum64() != crc64:
return False
except Exception:
return False
self.doffset = offset
self.dcrc64 = crc64
return True
except Exception:
#print(f"err = {err}")
pass
return False