sparse_img.py: Divide NONZERO blocks into groups.
For squashfs, we currently don't have a system.map. So the whole system image will be treated as a single file. But for some unknown bug, the updater will be killed due to OOM when writing back the patched image to flash (observed on lenok-userdebug MEA49). Prior to getting a real fix, we evenly divide the non-zero blocks into smaller groups (currently 1024 blocks or 4MB per group). Bug: 23227672 Change-Id: Ifeddd8d802f01f8cd2a743a1d1217a284fb6e182
This commit is contained in:
@@ -210,6 +210,16 @@ class SparseImage(object):
|
|||||||
nonzero_blocks = []
|
nonzero_blocks = []
|
||||||
reference = '\0' * self.blocksize
|
reference = '\0' * self.blocksize
|
||||||
|
|
||||||
|
# Workaround for bug 23227672. For squashfs, we don't have a system.map. So
|
||||||
|
# the whole system image will be treated as a single file. But for some
|
||||||
|
# unknown bug, the updater will be killed due to OOM when writing back the
|
||||||
|
# patched image to flash (observed on lenok-userdebug MEA49). Prior to
|
||||||
|
# getting a real fix, we evenly divide the non-zero blocks into smaller
|
||||||
|
# groups (currently 1024 blocks or 4MB per group).
|
||||||
|
# Bug: 23227672
|
||||||
|
MAX_BLOCKS_PER_GROUP = 1024
|
||||||
|
nonzero_groups = []
|
||||||
|
|
||||||
f = self.simg_f
|
f = self.simg_f
|
||||||
for s, e in remaining:
|
for s, e in remaining:
|
||||||
for b in range(s, e):
|
for b in range(s, e):
|
||||||
@@ -232,12 +242,22 @@ class SparseImage(object):
|
|||||||
nonzero_blocks.append(b)
|
nonzero_blocks.append(b)
|
||||||
nonzero_blocks.append(b+1)
|
nonzero_blocks.append(b+1)
|
||||||
|
|
||||||
assert zero_blocks or nonzero_blocks or clobbered_blocks
|
if len(nonzero_blocks) >= MAX_BLOCKS_PER_GROUP:
|
||||||
|
nonzero_groups.append(nonzero_blocks)
|
||||||
|
# Clear the list.
|
||||||
|
nonzero_blocks = []
|
||||||
|
|
||||||
|
if nonzero_blocks:
|
||||||
|
nonzero_groups.append(nonzero_blocks)
|
||||||
|
nonzero_blocks = []
|
||||||
|
|
||||||
|
assert zero_blocks or nonzero_groups or clobbered_blocks
|
||||||
|
|
||||||
if zero_blocks:
|
if zero_blocks:
|
||||||
out["__ZERO"] = rangelib.RangeSet(data=zero_blocks)
|
out["__ZERO"] = rangelib.RangeSet(data=zero_blocks)
|
||||||
if nonzero_blocks:
|
if nonzero_groups:
|
||||||
out["__NONZERO"] = rangelib.RangeSet(data=nonzero_blocks)
|
for i, blocks in enumerate(nonzero_groups):
|
||||||
|
out["__NONZERO-%d" % i] = rangelib.RangeSet(data=blocks)
|
||||||
if clobbered_blocks:
|
if clobbered_blocks:
|
||||||
out["__COPY"] = clobbered_blocks
|
out["__COPY"] = clobbered_blocks
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user