From dba63873f54a47e88d9426d096afc105e6da48d0 Mon Sep 17 00:00:00 2001 From: librelad Date: Tue, 26 May 2026 20:56:25 +0100 Subject: [PATCH] feat(lazy-load): flip CLI to LP_LAZY=1 by default (Phase 4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/source/load_sources.sh — when init_run_flag=false (one-shot CLI invocation), default LP_LAZY=1 before sourceCheckFiles runs. Honours an explicit `LP_LAZY=0 libreportal …` override for debugging or for working around a stale manifest. Long-running processes (init_run_flag=true → task processor, WebUI service) stay unchanged — they want eager loading because they keep running and benefit from every function being already-hot. Measured on this box, 3 runs each: EAGER (default before this commit): real 0.91s / 1.12s / 0.94s avg ~0.99s wall user 0.40s / 0.41s / 0.42s avg ~0.41s CPU LAZY (new default for CLI): real 0.63s / 0.65s / 0.66s avg ~0.65s wall user 0.26s / 0.27s / 0.26s avg ~0.26s CPU Wall: ~340ms saved per invocation (34%). User: ~150ms saved per invocation (37%). Files actually sourced at startup: 455 → 8 (the manifest itself + 7 side-effect files: setup_lock, the two crontab processors, backup_db, backup_files, swap_docker_type, migrate_url_rewrite). Safety nets: - Missing manifest auto-falls-back to eager loading (init.sh check in the lazy branch sets LP_LAZY=0 if function_manifest.sh is absent). - Stub for a function not in the manifest still produces a clean 'command not found' rather than weird behaviour, so a stale manifest surfaces immediately. `libreportal regen arrays` regenerates both files_*.sh and function_manifest.sh. Smoke-tested (lazy mode active): `libreportal help`, `peer list`, `peer` (shows full help), `restore` (shows full help), `debug load- trace peer list` (traces a lazy run and shows the 8 files loaded). All output identical to eager mode. Signed-off-by: librelad --- scripts/source/load_sources.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/scripts/source/load_sources.sh b/scripts/source/load_sources.sh index be70687..465459c 100755 --- a/scripts/source/load_sources.sh +++ b/scripts/source/load_sources.sh @@ -41,9 +41,19 @@ fi # For starting the script if [[ $init_run_flag == "true" ]]; then - # For loading LibrePortal + # For loading LibrePortal as a long-running process (task processor, + # WebUI service). Eager loading wins here — the process keeps running, + # so first call to anything should be hot. LP_LAZY stays unset. sourceCheckFiles "run"; elif [[ $init_run_flag == "false" ]]; then - # For using the CLI + # For one-shot CLI invocations. Default LP_LAZY=1 so short commands + # (`libreportal help`, `peer list`, etc.) only source the ~8 files with + # top-level side effects + the function manifest stubs, deferring the + # ~420 pure function libs until something actually calls them. ~34% + # wall-time savings on a no-op command in measurement (Phase 4 of the + # lazy-load work). Explicit `LP_LAZY=0 libreportal …` still works for + # debugging or for catching a stale manifest. + : "${LP_LAZY:=1}" + export LP_LAZY sourceCheckFiles "cli"; fi \ No newline at end of file