Reduce calls to sleep for WebSocket keep alives.

This commit is contained in:
Cody Henthorne
2026-02-19 14:35:01 -05:00
parent 9c29601b55
commit b4d781ddbb
3 changed files with 14 additions and 19 deletions

View File

@@ -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());
}
}

View File

@@ -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)
}
}

View File

@@ -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)