release: 1.3.27 — Runtime performance, watchdog adaptive probes & mixed proxy DNS fix

- Perf(watchdog): Adaptive external health checks for proxy (30s) and DNS (60s)
  * Honor UCI ai_proxy_health_interval and ai_dns_interval while healthy
  * Adapt to fast retry (10-15s) upon consecutive failures, instant post-heal reset
  * Single shared observation context (tick_context) per tick eliminating redundant pgrep/proc scans
  * Throttle watchdog keepalive file writes from 5s to 30s
- Perf(ui): Read-only fast path for get_ui_state
  * Decouple refresh_action_dirs() filesystem GC from 500ms polling requests
  * Throttle action directory cleanup to once per 30s via /var/run stamp
  * Trigger immediate GC sweep on action job completion
- Perf(telegram): Long-poll 50s and eliminate redundant sleep after success
  * Increase getUpdates long-poll timeout to 50s (curl timeout 65s)
  * Remove redundant sleep after successful poll for instant command responsiveness
- Perf(torrserver): Cache detected PID and replace shell sleep with native ucode sleep(60000)
- Fix(singbox): Remove harmful hijack-dns rules from mixed proxy inbounds
  * Eliminate hijack-dns (port 53 / protocol dns) from section, direct bypass and service mixed proxies
  * Resolve 4-5s curl timeouts on component updates (api.github.com) and slow LAN DNS resolution
  * Maintain ip_is_private: true direct LAN routing bypass
- Test: Add tests/watchdog_adaptive_intervals.sh and update tests/sing_box_runtime.sh
- Version: Bump fe-app-tachyon to 1.3.27
This commit is contained in:
Dushnilin
2026-09-15 08:20:35 +03:00
parent bc0928c277
commit 1c7feb4aac
10 changed files with 337 additions and 85 deletions
+16 -2
View File
@@ -646,6 +646,7 @@ function set_running_job_pid_file(path, pid) {
}
function write_finished_action_state(path, success, message, exit_code) {
remove_file(ACTION_DIRS_REFRESH_STAMP_FILE);
return write_state_file(path, finished_action_state_value(path, success, message, exit_code, now_seconds()));
}
@@ -734,6 +735,20 @@ function refresh_action_dirs() {
refresh_pid_job_state(path, "Subscription update worker exited unexpectedly");
}
const ACTION_DIRS_REFRESH_STAMP_FILE = "/var/run/tachyon_action_dirs_refresh.stamp";
const ACTION_DIRS_REFRESH_INTERVAL_SECONDS = 30;
function maybe_refresh_action_dirs(force) {
let now = now_seconds();
if (!force) {
let stat = fs.stat(ACTION_DIRS_REFRESH_STAMP_FILE);
if (stat != null && (now - int(stat.mtime || 0)) < ACTION_DIRS_REFRESH_INTERVAL_SECONDS)
return;
}
refresh_action_dirs();
write_state_file(ACTION_DIRS_REFRESH_STAMP_FILE, as_string(now) + "\n", "action dirs refresh stamp");
}
function active_service_action_default() {
refresh_action_dirs();
active_service_action(SERVICE_ACTION_DIR);
@@ -755,7 +770,6 @@ function action_state_from_dir(dir) {
}
function action_state_from_dirs() {
refresh_action_dirs();
return {
service: action_state_from_dir(SERVICE_ACTION_DIR),
latency: action_state_from_dir(LATENCY_ACTION_DIR),
@@ -1094,7 +1108,7 @@ function process_memory_rss_mb(process_name) {
}
function current_ui_state_json() {
refresh_action_dirs();
maybe_refresh_action_dirs(false);
let capabilities = capability_flags();
let tachyon_is_running = tachyon_running() ? 1 : 0;