summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2015-08-19 17:07:50 -0700
committerTao Bao <tbao@google.com>2015-08-19 17:10:23 -0700
commit7c4c6f589e846d838136de148ae7e7d680c74d91 (patch)
treedd6cf395ea1cbfe8c09f775580fd8598256fe0f8 /tools
parent58aacccb2f491decb559a6c93abb35abcc64cfef (diff)
downloadbuild-7c4c6f589e846d838136de148ae7e7d680c74d91.tar.gz
build-7c4c6f589e846d838136de148ae7e7d680c74d91.tar.bz2
build-7c4c6f589e846d838136de148ae7e7d680c74d91.zip
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.py26
1 files changed, 23 insertions, 3 deletions
diff --git a/tools/releasetools/sparse_img.py b/tools/releasetools/sparse_img.py
index 07f3c1c0f..013044f6f 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