From b4d781ddbb9f3497561a74c9502d3381206c69e5 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 19 Feb 2026 14:35:01 -0500 Subject: [PATCH] Reduce calls to sleep for WebSocket keep alives. --- .../securesms/jobmanager/JobRunner.java | 4 ++-- .../securesms/messages/WebSocketDrainer.kt | 7 +++--- .../net/SignalWebSocketHealthMonitor.kt | 22 ++++++++----------- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java index ca3d7f7167..26d615f1cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java @@ -95,7 +95,7 @@ class JobRunner extends Thread { PowerManager.WakeLock wakeLock = null; try { - wakeLock = WakeLockUtil.acquire(application, PowerManager.PARTIAL_WAKE_LOCK, WAKE_LOCK_TIMEOUT, job.getId()); + wakeLock = WakeLockUtil.acquire(application, PowerManager.PARTIAL_WAKE_LOCK, WAKE_LOCK_TIMEOUT, job.getFactoryKey()); result = job.run(); if (job.isCanceled()) { @@ -110,7 +110,7 @@ class JobRunner extends Thread { return Job.Result.failure(); } finally { if (wakeLock != null) { - WakeLockUtil.release(wakeLock, job.getId()); + WakeLockUtil.release(wakeLock, job.getFactoryKey()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/WebSocketDrainer.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/WebSocketDrainer.kt index d90b2ff302..f005ab3bf3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/WebSocketDrainer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/WebSocketDrainer.kt @@ -27,7 +27,7 @@ object WebSocketDrainer { private val TAG = Log.tag(WebSocketDrainer::class.java) private const val KEEP_ALIVE_TOKEN = "WebsocketStrategy" - private const val WAKELOCK_PREFIX = "websocket-strategy-" + private const val WAKELOCK_TAG = "websocket-strategy" private val QUEUE_TIMEOUT = 30.seconds.inWholeMilliseconds @@ -65,13 +65,12 @@ object WebSocketDrainer { websocketDrainTimeout = NO_NETWORK_WEBSOCKET_TIMEOUT } - val wakeLockTag = WAKELOCK_PREFIX + System.currentTimeMillis() - val wakeLock = WakeLockUtil.acquire(AppDependencies.application, PowerManager.PARTIAL_WAKE_LOCK, websocketDrainTimeout + QUEUE_TIMEOUT, wakeLockTag) + val wakeLock = WakeLockUtil.acquire(AppDependencies.application, PowerManager.PARTIAL_WAKE_LOCK, websocketDrainTimeout + QUEUE_TIMEOUT, WAKELOCK_TAG) return try { drainAndProcess(websocketDrainTimeout, keepAliveToken) } finally { - WakeLockUtil.release(wakeLock, wakeLockTag) + WakeLockUtil.release(wakeLock, WAKELOCK_TAG) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/SignalWebSocketHealthMonitor.kt b/app/src/main/java/org/thoughtcrime/securesms/net/SignalWebSocketHealthMonitor.kt index cd5bf653f0..4ca847964b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/net/SignalWebSocketHealthMonitor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/net/SignalWebSocketHealthMonitor.kt @@ -174,25 +174,21 @@ class SignalWebSocketHealthMonitor( Log.d(TAG, "[KeepAliveSender($id)] started") lastKeepAliveReceived = System.currentTimeMillis().milliseconds - var keepAliveSendTime = System.currentTimeMillis().milliseconds + var keepAliveSentTime = System.currentTimeMillis().milliseconds + var hasSentKeepAlive = false while (shouldKeepRunning && sendKeepAlives()) { try { - val nextKeepAliveSendTime: Duration = keepAliveSendTime + KEEP_ALIVE_SEND_CADENCE - sleepUntil(nextKeepAliveSendTime) + sleepUntil(keepAliveSentTime + KEEP_ALIVE_SEND_CADENCE) if (shouldKeepRunning && sendKeepAlives()) { - keepAliveSendTime = System.currentTimeMillis().milliseconds - webSocket?.sendKeepAlive() - } - - val responseRequiredTime: Duration = keepAliveSendTime + KEEP_ALIVE_TIMEOUT - sleepUntil(responseRequiredTime) - - if (shouldKeepRunning && sendKeepAlives()) { - if (lastKeepAliveReceived < keepAliveSendTime) { - Log.w(TAG, "Missed keep alive, last: ${lastKeepAliveReceived.inWholeMilliseconds} needed by: ${responseRequiredTime.inWholeMilliseconds}") + if (hasSentKeepAlive && lastKeepAliveReceived < keepAliveSentTime) { + Log.w(TAG, "Missed keep alive, last: ${lastKeepAliveReceived.inWholeMilliseconds} needed by: ${(keepAliveSentTime + KEEP_ALIVE_TIMEOUT).inWholeMilliseconds}") webSocket?.forceNewWebSocket() } + + keepAliveSentTime = System.currentTimeMillis().milliseconds + webSocket?.sendKeepAlive() + hasSentKeepAlive = true } } catch (e: Throwable) { Log.w(TAG, e)