Return object iterator for *segment*. See the _read() docstring about confidence in the returned data. The iterator returns five-tuples of (tag, key, offset, size, data).
(self, segment, read_data=True)
| 1477 | return fd.read(MAGIC_LEN) |
| 1478 | |
| 1479 | def iter_objects(self, segment, read_data=True): |
| 1480 | """ |
| 1481 | Return object iterator for *segment*. |
| 1482 | |
| 1483 | See the _read() docstring about confidence in the returned data. |
| 1484 | |
| 1485 | The iterator returns five-tuples of (tag, key, offset, size, data). |
| 1486 | """ |
| 1487 | fd = self.get_fd(segment) |
| 1488 | offset = 0 |
| 1489 | fd.seek(offset) |
| 1490 | if fd.read(MAGIC_LEN) != MAGIC: |
| 1491 | raise IntegrityError(f"Invalid segment magic [segment {segment}, offset {offset}]") |
| 1492 | offset = MAGIC_LEN |
| 1493 | header = fd.read(self.header_fmt.size) |
| 1494 | while header: |
| 1495 | size, tag, key, data = self._read( |
| 1496 | fd, header, segment, offset, (TAG_PUT2, TAG_DELETE, TAG_COMMIT, TAG_PUT), read_data=read_data |
| 1497 | ) |
| 1498 | # tuple[3]: corresponds to len(data) == length of the full chunk payload (meta_len+enc_meta+enc_data) |
| 1499 | # tuple[4]: data will be None if read_data is False. |
| 1500 | yield tag, key, offset, size - header_size(tag), data |
| 1501 | assert size >= 0 |
| 1502 | offset += size |
| 1503 | # we must get the fd via get_fd() here again as we yielded to our caller and it might |
| 1504 | # have triggered closing of the fd we had before (e.g. by calling io.read() for |
| 1505 | # different segment(s)). |
| 1506 | # by calling get_fd() here again we also make our fd "recently used" so it likely |
| 1507 | # does not get kicked out of self.fds LRUcache. |
| 1508 | fd = self.get_fd(segment) |
| 1509 | fd.seek(offset) |
| 1510 | header = fd.read(self.header_fmt.size) |
| 1511 | |
| 1512 | def recover_segment(self, segment, filename): |
| 1513 | logger.info("Attempting to recover " + filename) |