summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Rosenberg <drosen@google.com>2021-06-07 16:49:35 -0700
committerDaniel Rosenberg <drosen@google.com>2021-06-07 16:59:23 -0700
commit62b64ae77ecd2cdca7fb75cc3f3b63eaee05623e (patch)
tree284cad72315f5bba6a707e193969e7ca35150837
parent1447e0ba0e6d92f257d5010cf2b336f5bcf73127 (diff)
downloadextras-62b64ae77ecd2cdca7fb75cc3f3b63eaee05623e.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.sh20
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"