android-emulator: sleep after 6h idle (activity-based), fix never-sleeping
All checks were successful
ci/woodpecker/push/default Pipeline was successful
All checks were successful
ci/woodpecker/push/default Pipeline was successful
The emulator was meant to scale to zero when idle but had been up 6+ days straight despite ~5 days with no real use. Two bugs: 1. The idle check counted ESTABLISHED TCP connections to the adb/noVNC ports. A forgotten `adb connect` (no disconnect) holds that transport open forever, so every 15-min run saw "active" and reset the counter -- it never reached the sleep branch. (Right now: 4 such stale transports from pods on k8s-node3/node4.) 2. Even when it did reach the sleep branch, `kubectl scale --replicas=0` failed Forbidden -- the gate ServiceAccount can patch `deployments` but not `deployments/scale`. Switch the sleeper to measure actual use: time since last user activity (taps/keys/app-launches, incl. noVNC clicks) from `dumpsys power` vs guest uptime. No interaction for 6h -> sleep. This ignores idle/forgotten connections entirely. Scale down with a direct replicas patch on the named deployment (same path the wake gate scales up), so it needs only the existing `deployments` patch grant -- no `deployments/scale`. Now stateless (drops the idle-counter annotation; gate.py no longer sets it) and lighter on etcd. Fail-safe: any read error (e.g. mid-boot) does not sleep. Requested by Viktor: turn the dev-only emulator off when it hasn't been used for 6h. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
566447a698
commit
839fdb33c2
3 changed files with 44 additions and 33 deletions
|
|
@ -22,7 +22,6 @@ API = "https://%s:%s" % (
|
|||
)
|
||||
TOKEN_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/token"
|
||||
CA_PATH = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
|
||||
IDLE_ANNOTATION = "emulator.viktorbarzin.me/idle-checks"
|
||||
VNC_PATH = "/vnc.html?autoconnect=1&resize=scale"
|
||||
|
||||
WAKING_PAGE = """<!doctype html><html><head><title>Android emulator</title>
|
||||
|
|
@ -57,13 +56,14 @@ def deployment_state():
|
|||
|
||||
|
||||
def wake():
|
||||
# Direct replicas patch on the named deployment — same path the idle
|
||||
# sleeper uses to scale DOWN; needs only `deployments` patch, not
|
||||
# `deployments/scale`. Idle is now measured from dumpsys power, so there
|
||||
# is no idle-counter annotation to reset here.
|
||||
kube(
|
||||
"PATCH",
|
||||
f"/apis/apps/v1/namespaces/{NS}/deployments/{DEPLOY}",
|
||||
{
|
||||
"spec": {"replicas": 1},
|
||||
"metadata": {"annotations": {IDLE_ANNOTATION: "0"}},
|
||||
},
|
||||
{"spec": {"replicas": 1}},
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue