Check if obj looks valid.
(obj)
| 299 | logger.error(f"Repo object {info.name} is corrupted: {msg}") |
| 300 | |
| 301 | def check_object(obj): |
| 302 | """Check if obj looks valid.""" |
| 303 | hdr_size = RepoObj.obj_header.size |
| 304 | obj_size = len(obj) |
| 305 | if obj_size >= hdr_size: |
| 306 | hdr = RepoObj.ObjHeader(*RepoObj.obj_header.unpack(obj[:hdr_size])) |
| 307 | meta = obj[hdr_size : hdr_size + hdr.meta_size] |
| 308 | if hdr.meta_size != len(meta): |
| 309 | log_error("metadata size incorrect.") |
| 310 | elif hdr.meta_hash != xxh64(meta).digest(): |
| 311 | log_error("metadata does not match checksum.") |
| 312 | data = obj[hdr_size + hdr.meta_size : hdr_size + hdr.meta_size + hdr.data_size] |
| 313 | if hdr.data_size != len(data): |
| 314 | log_error("data size incorrect.") |
| 315 | elif hdr.data_hash != xxh64(data).digest(): |
| 316 | log_error("data does not match checksum.") |
| 317 | else: |
| 318 | log_error("too small.") |
| 319 | |
| 320 | # TODO: progress indicator, ... |
| 321 | partial = bool(max_duration) |