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-08 17:56:46 -0700
commit69083346bf439398a1a29885e1ac1c2134ccf849 (patch)
tree27069fdfffc0f861f6eea4f9b4cf5f03d02d8d3d
parentcd86421c8c262e437b607ad37a748a34760cfade (diff)
downloadextras-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.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"