def prepare_read(manifest: LocalFileManifest, size: int, offset: int) -> Chunks: # Prepare chunks: List[Chunk] = [] offset = min(offset, manifest.size) size = min(size, manifest.size - offset) # Loop over blocks for block, length, start in split_read(size, offset, manifest.blocksize): # Loop over chunks block_chunks = manifest.get_chunks(block) chunks += block_read(block_chunks, length, start) # Return read result return tuple(chunks)
def prepare_write( manifest: LocalFileManifest, size: int, offset: int, timestamp: DateTime ) -> Tuple[LocalFileManifest, WriteOperationList, ChunkIDSet]: # Prepare padding = 0 removed_ids: ChunkIDSet = set() write_operations: WriteOperationList = [] # Padding if offset > manifest.size: padding = offset - manifest.size size += padding offset = manifest.size # Copy buffers blocks = list(manifest.blocks) # Loop over blocks for block, subsize, start, content_offset in split_write( size, offset, manifest.blocksize): # Prepare new chunk new_chunk = Chunk.new(start, start + subsize) write_operations.append((new_chunk, content_offset - padding)) # Lazy block write chunks = manifest.get_chunks(block) new_chunks, more_removed_ids = block_write(chunks, subsize, start, new_chunk) # Update data structures removed_ids |= more_removed_ids if len(blocks) == block: blocks.append(new_chunks) else: blocks[block] = new_chunks # Evolve manifest new_size = max(manifest.size, offset + size) new_manifest = manifest.evolve_and_mark_updated(size=new_size, blocks=tuple(blocks), timestamp=timestamp) # Return write result return new_manifest, write_operations, removed_ids