diff options
author | Daniel Rosenberg <drosen@google.com> | 2021-06-07 16:49:35 -0700 |
---|---|---|
committer | Daniel Rosenberg <drosen@google.com> | 2021-06-08 17:56:46 -0700 |
commit | 69083346bf439398a1a29885e1ac1c2134ccf849 (patch) | |
tree | 27069fdfffc0f861f6eea4f9b4cf5f03d02d8d3d | |
parent | cd86421c8c262e437b607ad37a748a34760cfade (diff) | |
download | extras-69083346bf439398a1a29885e1ac1c2134ccf849.tar.gz |
Improve checkpoint_gc jank and logging
This switches over to setting gc_urgent to 2 for a lower gc setting
which will respect existing IO for lower performance impact. We skip
running if we're not using f2fs userdata. Added some more descriptive
comments and logs to make debugging any future issue easier.
2 > gc_urgent triggers GC_URGENT_LOW, which does not make use of
gc_urgent_sleep_time, so we drop that. We leave gc running at
GC_URGENT_LOW in case of a long delay between ota postinstall and
reboot. If something else disables it then, we'll rely on normal
background gc.
Test: Cause disk fragmentation, run checkpoint_gc.sh
Bug: 173524015
Change-Id: I948070fc169c0a085e4a75cb7adb8138656e99d5
-rw-r--r-- | checkpoint_gc/checkpoint_gc.sh | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/checkpoint_gc/checkpoint_gc.sh b/checkpoint_gc/checkpoint_gc.sh index a1169ec0..b3080463 100644 --- a/checkpoint_gc/checkpoint_gc.sh +++ b/checkpoint_gc/checkpoint_gc.sh @@ -28,10 +28,13 @@ SLEEP=5 TIME=0 MAX_TIME=1200 -if [ ! -d /dev/sys/fs/by-name/userdata ]; then +# We only need to run this if we're using f2fs +if [ ! -f /dev/sys/fs/by-name/userdata/gc_urgent ]; then exit 0 fi +# Ideally we want to track unusable, as it directly measures what we +# care about. If it's not present, dirty_segments is the best proxy. if [ -f /dev/sys/fs/by-name/userdata/unusable ]; then UNUSABLE=1 METRIC="unusable blocks" @@ -44,9 +47,7 @@ else fi log -pi -t checkpoint_gc Turning on GC for userdata -read OLD_SLEEP < /dev/sys/fs/by-name/userdata/gc_urgent_sleep_time || exit 1 -echo 50 > /dev/sys/fs/by-name/userdata/gc_urgent_sleep_time || exit 1 -echo 1 > /dev/sys/fs/by-name/userdata/gc_urgent || exit 1 +echo 2 > /dev/sys/fs/by-name/userdata/gc_urgent || exit 1 CURRENT=${START} @@ -66,15 +67,18 @@ while [ ${CURRENT} -gt ${THRESHOLD} ]; do sleep ${SLEEP} TIME=$((${TIME}+${SLEEP})) if [ ${TIME} -gt ${MAX_TIME} ]; then + log -pi -t checkpoint_gc Timed out with gc threshold not met. break fi # In case someone turns it off behind our back - echo 1 > /dev/sys/fs/by-name/userdata/gc_urgent + echo 2 > /dev/sys/fs/by-name/userdata/gc_urgent done -log -pi -t checkpoint_gc Turning off GC for userdata -echo 0 > /dev/sys/fs/by-name/userdata/gc_urgent -echo ${OLD_SLEEP} > /dev/sys/fs/by-name/userdata/gc_urgent_sleep_time +# It could be a while before the system reboots for the update... +# Leaving on low level GC can help ensure the boot for ota is faster +# If powerhints decides to turn it off, we'll just rely on normal GC +log -pi -t checkpoint_gc Leaving on low GC for userdata +echo 2 > /dev/sys/fs/by-name/userdata/gc_urgent sync print -u${STATUS_FD} "global_progress 1.0" |