Merge "Avoid writing too much new data per transfer" into nyc-mr1-dev

This commit is contained in:
Tianjie Xu 2016-06-24 18:06:22 +00:00 committed by Android (Google) Code Review
commit 21e6dde63c
1 changed files with 12 additions and 11 deletions

View File

@ -342,19 +342,20 @@ class BlockImageDiff(object):
return ctx.hexdigest() return ctx.hexdigest()
def WriteTransfers(self, prefix): def WriteTransfers(self, prefix):
def WriteTransfersZero(out, to_zero): def WriteSplitTransfers(out, style, target_blocks):
"""Limit the number of blocks in command zero to 1024 blocks. """Limit the size of operand in command 'new' and 'zero' to 1024 blocks.
This prevents the target size of one command from being too large; and This prevents the target size of one command from being too large; and
might help to avoid fsync errors on some devices.""" might help to avoid fsync errors on some devices."""
zero_blocks_limit = 1024 assert (style == "new" or style == "zero")
blocks_limit = 1024
total = 0 total = 0
while to_zero: while target_blocks:
zero_blocks = to_zero.first(zero_blocks_limit) blocks_to_write = target_blocks.first(blocks_limit)
out.append("zero %s\n" % (zero_blocks.to_string_raw(),)) out.append("%s %s\n" % (style, blocks_to_write.to_string_raw()))
total += zero_blocks.size() total += blocks_to_write.size()
to_zero = to_zero.subtract(zero_blocks) target_blocks = target_blocks.subtract(blocks_to_write)
return total return total
out = [] out = []
@ -478,7 +479,7 @@ class BlockImageDiff(object):
if xf.style == "new": if xf.style == "new":
assert xf.tgt_ranges assert xf.tgt_ranges
out.append("%s %s\n" % (xf.style, xf.tgt_ranges.to_string_raw())) assert tgt_size == WriteSplitTransfers(out, xf.style, xf.tgt_ranges)
total += tgt_size total += tgt_size
elif xf.style == "move": elif xf.style == "move":
assert xf.tgt_ranges assert xf.tgt_ranges
@ -538,7 +539,7 @@ class BlockImageDiff(object):
elif xf.style == "zero": elif xf.style == "zero":
assert xf.tgt_ranges assert xf.tgt_ranges
to_zero = xf.tgt_ranges.subtract(xf.src_ranges) to_zero = xf.tgt_ranges.subtract(xf.src_ranges)
assert WriteTransfersZero(out, to_zero) == to_zero.size() assert WriteSplitTransfers(out, xf.style, to_zero) == to_zero.size()
total += to_zero.size() total += to_zero.size()
else: else:
raise ValueError("unknown transfer style '%s'\n" % xf.style) raise ValueError("unknown transfer style '%s'\n" % xf.style)
@ -568,7 +569,7 @@ class BlockImageDiff(object):
# Zero out extended blocks as a workaround for bug 20881595. # Zero out extended blocks as a workaround for bug 20881595.
if self.tgt.extended: if self.tgt.extended:
assert (WriteTransfersZero(out, self.tgt.extended) == assert (WriteSplitTransfers(out, "zero", self.tgt.extended) ==
self.tgt.extended.size()) self.tgt.extended.size())
total += self.tgt.extended.size() total += self.tgt.extended.size()