diff options
author | Tao Bao <tbao@google.com> | 2015-08-19 17:07:50 -0700 |
---|---|---|
committer | Tao Bao <tbao@google.com> | 2015-08-19 17:10:23 -0700 |
commit | 7c4c6f589e846d838136de148ae7e7d680c74d91 (patch) | |
tree | dd6cf395ea1cbfe8c09f775580fd8598256fe0f8 /tools | |
parent | 58aacccb2f491decb559a6c93abb35abcc64cfef (diff) | |
download | build-7c4c6f589e846d838136de148ae7e7d680c74d91.zip build-7c4c6f589e846d838136de148ae7e7d680c74d91.tar.gz build-7c4c6f589e846d838136de148ae7e7d680c74d91.tar.bz2 |
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
Diffstat (limited to 'tools')
-rw-r--r-- | tools/releasetools/sparse_img.py | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/tools/releasetools/sparse_img.py b/tools/releasetools/sparse_img.py index 07f3c1c..013044f 100644 --- a/tools/releasetools/sparse_img.py +++ b/tools/releasetools/sparse_img.py @@ -210,6 +210,16 @@ class SparseImage(object): nonzero_blocks = [] 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 for s, e in remaining: for b in range(s, e): @@ -232,12 +242,22 @@ class SparseImage(object): nonzero_blocks.append(b) 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: out["__ZERO"] = rangelib.RangeSet(data=zero_blocks) - if nonzero_blocks: - out["__NONZERO"] = rangelib.RangeSet(data=nonzero_blocks) + if nonzero_groups: + for i, blocks in enumerate(nonzero_groups): + out["__NONZERO-%d" % i] = rangelib.RangeSet(data=blocks) if clobbered_blocks: out["__COPY"] = clobbered_blocks |