Skip to content

Commit afb7c20

Browse files
committed
Change how resume reconnect failure is handled
1 parent bb8c7c4 commit afb7c20

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

src/main/kotlin/dev/arbjerg/lavalink/client/LavalinkClient.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import dev.arbjerg.lavalink.internal.ReconnectTask
99
import dev.arbjerg.lavalink.protocol.v4.VoiceState
1010
import reactor.core.Disposable
1111
import reactor.core.publisher.Flux
12-
import reactor.core.publisher.Mono
1312
import reactor.core.publisher.Sinks
1413
import java.io.Closeable
1514
import java.time.Duration
@@ -172,13 +171,15 @@ class LavalinkClient(val userId: Long) : Closeable, Disposable {
172171

173172
val session = node.cachedSession
174173
val canResume = session != null && session.resuming && session.timeoutSeconds > 0
175-
if (!canResume) {
176-
// If canResume is true, onNodeFirstReconnectFailed(node) may do the transfer
174+
if (canResume) {
175+
// This causes onResumeReconnectFailed(node) to be called if the next reconnect fails
176+
node.ws.onResumableConnectionDisconnected()
177+
} else {
177178
transferNodes(node)
178179
}
179180
}
180181

181-
internal fun onNodeFirstReconnectFailed(node: LavalinkNode) {
182+
internal fun onResumeReconnectFailed(node: LavalinkNode) {
182183
transferNodes(node)
183184
}
184185

src/main/kotlin/dev/arbjerg/lavalink/internal/LavalinkSocket.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import java.io.EOFException
1818
import java.net.ConnectException
1919
import java.net.SocketException
2020
import java.net.SocketTimeoutException
21+
import java.util.concurrent.atomic.AtomicBoolean
2122

2223
class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Closeable {
2324
private val logger = LoggerFactory.getLogger(LavalinkSocket::class.java)
@@ -27,11 +28,14 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
2728
var mayReconnect = true
2829
var lastReconnectAttempt = 0L
2930
@Volatile
30-
private var connectionsAttempted = 0
31+
private var reconnectsAttempted = 0
3132
val reconnectInterval: Int
32-
get() = connectionsAttempted * 2000 - 2000
33+
get() = reconnectsAttempted * 2000 - 2000
3334
var open: Boolean = false
3435
private set
36+
@Volatile
37+
private var hasEverConnected = false
38+
private val isAttemptingResume = AtomicBoolean(node.sessionId != null)
3539

3640
init {
3741
connect()
@@ -40,7 +44,9 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
4044
override fun onOpen(webSocket: WebSocket, response: Response) {
4145
logger.info("${node.name} has been connected!")
4246
open = true
43-
connectionsAttempted = 0
47+
reconnectsAttempted = 0
48+
hasEverConnected = true
49+
isAttemptingResume.set(false)
4450
}
4551

4652
override fun onMessage(webSocket: WebSocket, text: String) {
@@ -190,8 +196,8 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
190196
}
191197
}
192198

193-
if (connectionsAttempted == 1 && lastReconnectAttempt > 0) {
194-
node.lavalink.onNodeFirstReconnectFailed(node)
199+
if (hasEverConnected && isAttemptingResume.getAndSet(false)) {
200+
node.lavalink.onResumeReconnectFailed(node)
195201
}
196202
}
197203

@@ -221,6 +227,7 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
221227

222228
fun attemptReconnect() {
223229
lastReconnectAttempt = System.currentTimeMillis()
230+
reconnectsAttempted++
224231
connect()
225232
}
226233

@@ -236,14 +243,13 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
236243
.addHeader("Client-Name", "Lavalink-Client/${CLIENT_VERSION}")
237244
.addHeader("User-Id", node.lavalink.userId.toString())
238245
.apply {
239-
if (node.sessionId != null && connectionsAttempted == 0) {
246+
if (node.sessionId != null && isAttemptingResume.get()) {
240247
addHeader("Session-Id", node.sessionId!!)
241248
}
242249
}
243250
.build()
244251

245252
mayReconnect = true
246-
connectionsAttempted++
247253
socket = node.httpClient.newWebSocket(request, this)
248254
}
249255

@@ -254,4 +260,8 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
254260
socket?.close(1000, "Client shutdown")
255261
socket?.cancel()
256262
}
263+
264+
internal fun onResumableConnectionDisconnected() {
265+
isAttemptingResume.set(true)
266+
}
257267
}

0 commit comments

Comments
 (0)