Handle blocking with unused input in librsync

This commit is contained in:
Kovid Goyal
2021-09-18 13:08:53 +05:30
parent cf517effb3
commit 77508bfe0d
3 changed files with 15 additions and 6 deletions

View File

@@ -5,7 +5,7 @@
import os
from typing import Iterator
from .rsync import IO_BUFFER_SIZE, begin_create_signature, iter_job
from .rsync import IO_BUFFER_SIZE, RsyncError, begin_create_signature, iter_job
def signature_of_file(path: str) -> Iterator[bytes]:
@@ -15,7 +15,16 @@ def signature_of_file(path: str) -> Iterator[bytes]:
job = begin_create_signature(fsz)
f.seek(0)
finished = False
prev_unused_input = b''
while not finished:
input_data = f.read(IO_BUFFER_SIZE)
output, finished = iter_job(job, input_data)
no_more_data = not input_data
if prev_unused_input:
input_data = prev_unused_input + input_data
prev_unused_input = b''
output, finished, sz_of_unused_input = iter_job(job, input_data)
if sz_of_unused_input > 0 and not finished:
if no_more_data:
raise RsyncError(f"{sz_of_unused_input} bytes of input data were not used")
prev_unused_input = input_data[-sz_of_unused_input:]
yield output