Skip to content

Commit 48f03d0

Browse files
committed
Abandon resuming after failed reconnection attempt
1 parent d282cb4 commit 48f03d0

File tree

3 files changed

+21
-20
lines changed

3 files changed

+21
-20
lines changed

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package dev.arbjerg.lavalink.client
22

3+
import dev.arbjerg.lavalink.client.event.ClientEvent
34
import dev.arbjerg.lavalink.client.loadbalancing.ILoadBalancer
45
import dev.arbjerg.lavalink.client.loadbalancing.VoiceRegion
56
import dev.arbjerg.lavalink.client.loadbalancing.builtin.DefaultLoadBalancer
6-
import dev.arbjerg.lavalink.client.event.ClientEvent
77
import dev.arbjerg.lavalink.client.player.LavalinkPlayer
88
import dev.arbjerg.lavalink.internal.ReconnectTask
99
import dev.arbjerg.lavalink.protocol.v4.VoiceState
@@ -17,7 +17,6 @@ import java.util.concurrent.ConcurrentHashMap
1717
import java.util.concurrent.CopyOnWriteArrayList
1818
import java.util.concurrent.Executors
1919
import java.util.concurrent.TimeUnit
20-
import kotlin.time.toJavaDuration
2120

2221
/**
2322
* @param userId ID of the bot for authenticating with Discord
@@ -173,16 +172,14 @@ class LavalinkClient(val userId: Long) : Closeable, Disposable {
173172

174173
val session = node.cachedSession
175174
val canResume = session != null && session.resuming && session.timeoutSeconds > 0
176-
if (canResume) {
177-
node.resumeTimer = Mono.delay(Duration.ofSeconds(session!!.timeoutSeconds))
178-
.subscribe() { transferNodes(node) }
179-
} else {
175+
if (!canResume) {
176+
// If canResume is true, onNodeFirstReconnectFailed(node) may do the transfer
180177
transferNodes(node)
181178
}
182179
}
183180

184-
internal fun onNodeConnected(node: LavalinkNode) {
185-
node.resumeTimer?.dispose()
181+
internal fun onNodeFirstReconnectFailed(node: LavalinkNode) {
182+
transferNodes(node)
186183
}
187184

188185
private fun transferNodes(node: LavalinkNode) {

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ class LavalinkNode(
5959
internal val sink: Many<ClientEvent> = Sinks.many().multicast().onBackpressureBuffer()
6060
val flux: Flux<ClientEvent> = sink.asFlux()
6161
private val reference: Disposable = flux.subscribe()
62-
internal var resumeTimer: Disposable? = null
6362

6463
internal val rest = LavalinkRestClient(this)
6564
val ws = LavalinkSocket(this)

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
2626

2727
var mayReconnect = true
2828
var lastReconnectAttempt = 0L
29-
private var reconnectsAttempted = 0
29+
@Volatile
30+
private var connectionsAttempted = 0
3031
val reconnectInterval: Int
31-
get() = reconnectsAttempted * 2000 - 2000
32+
get() = connectionsAttempted * 2000 - 2000
3233
var open: Boolean = false
3334
private set
3435

@@ -39,8 +40,7 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
3940
override fun onOpen(webSocket: WebSocket, response: Response) {
4041
logger.info("${node.name} has been connected!")
4142
open = true
42-
reconnectsAttempted = 0
43-
node.lavalink.onNodeConnected(node)
43+
connectionsAttempted = 0
4444
}
4545

4646
override fun onMessage(webSocket: WebSocket, text: String) {
@@ -80,10 +80,12 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
8080
node.cachedSession = null
8181
}
8282
if (node.cachedSession == null) {
83-
node.rest.getSession().subscribe { node.cachedSession = null }
83+
node.rest.getSession().subscribe { node.cachedSession = it }
8484
}
8585

86-
node.synchronizeAfterResume()
86+
if (resumed) {
87+
node.synchronizeAfterResume()
88+
}
8789

8890
// Move players from older, unavailable nodes to ourselves.
8991
node.transferOrphansToSelf()
@@ -154,15 +156,15 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
154156
}
155157

156158
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
157-
handleFailureTrhowable(t)
159+
handleFailureThrowable(t)
158160

159161
node.available = false
160162
open = false
161163

162164
node.lavalink.onNodeDisconnected(node)
163165
}
164166

165-
private fun handleFailureTrhowable(t: Throwable) {
167+
private fun handleFailureThrowable(t: Throwable) {
166168
when(t) {
167169
is EOFException -> {
168170
logger.debug("Got disconnected from ${node.name}, trying to reconnect", t)
@@ -190,6 +192,10 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
190192
logger.error("Unknown error on ${node.name}", t)
191193
}
192194
}
195+
196+
if (connectionsAttempted == 1 && lastReconnectAttempt > 0) {
197+
node.lavalink.onNodeFirstReconnectFailed(node)
198+
}
193199
}
194200

195201
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
@@ -213,12 +219,10 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
213219
reason
214220
)
215221
}
216-
217222
}
218223

219224
fun attemptReconnect() {
220225
lastReconnectAttempt = System.currentTimeMillis()
221-
reconnectsAttempted++
222226
connect()
223227
}
224228

@@ -234,13 +238,14 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
234238
.addHeader("Client-Name", "Lavalink-Client/${CLIENT_VERSION}")
235239
.addHeader("User-Id", node.lavalink.userId.toString())
236240
.apply {
237-
if (node.sessionId != null) {
241+
if (node.sessionId != null && connectionsAttempted == 0) {
238242
addHeader("Session-Id", node.sessionId!!)
239243
}
240244
}
241245
.build()
242246

243247
mayReconnect = true
248+
connectionsAttempted++
244249
socket = node.httpClient.newWebSocket(request, this)
245250
}
246251

0 commit comments

Comments
 (0)