def prepare_truncate(manifest: LocalFileManifest, size: int) -> Tuple[LocalFileManifest, Set[BlockID]]: # Prepare block, remainder = locate(size, manifest.blocksize) removed_ids = chunk_id_set(manifest.blocks[block]) # Truncate buffers blocks = manifest.blocks[:block] if remainder: chunks = manifest.blocks[block] stop_index = index_of_chunk_after_stop(chunks, size) last_chunk = chunks[stop_index - 1] chunks = chunks[:stop_index - 1] chunks += (last_chunk.evolve(stop=size), ) blocks += (chunks, ) removed_ids -= chunk_id_set(chunks) # Clean up for chunks in manifest.blocks[block + 1:]: removed_ids |= chunk_id_set(chunks) # Craft new manifest new_manifest = manifest.evolve_and_mark_updated(size=size, blocks=blocks) # Return truncate result return new_manifest, removed_ids
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