Skip to content

Commit

Permalink
Derive the session id from the game id and remove need for locks
Browse files Browse the repository at this point in the history
  • Loading branch information
Sheikah45 committed Nov 26, 2023
1 parent 2f5c97a commit 9911055
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ private val LOG = LoggerFactory.getLogger(IceSessionRepository::class.java)
@Singleton
class IceSessionRepository : PanacheRepository<IceSessionEntity> {

fun existsByGameId(gameId: Long) =
count("gameId = ?1", gameId) != 0L

fun findByGameId(gameId: Long) =
find("gameId = ?1", gameId).firstResult()

Expand Down
42 changes: 27 additions & 15 deletions src/main/kotlin/com/faforever/icebreaker/service/SessionService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.faforever.icebreaker.service
import com.faforever.icebreaker.config.FafProperties
import com.faforever.icebreaker.persistence.IceSessionEntity
import com.faforever.icebreaker.persistence.IceSessionRepository
import com.faforever.icebreaker.util.AsyncRunner
import io.quarkus.scheduler.Scheduled
import jakarta.enterprise.inject.Instance
import jakarta.inject.Singleton
Expand All @@ -24,31 +25,42 @@ class SessionService(

fun getServers(): List<Server> = activeSessionHandlers.flatMap { it.getIceServers() }

@Transactional
fun getSession(gameId: Long): Session {
val session: IceSessionEntity
try {
iceSessionRepository.acquireGameLock(gameId)
session = iceSessionRepository.findByGameId(gameId)
?: IceSessionEntity(gameId = gameId, createdAt = Instant.now()).also {
LOG.debug("Creating session for gameId $gameId")
iceSessionRepository.persist(it)
}
} finally {
iceSessionRepository.releaseGameLock(gameId)
}
val sessionId = "game/$gameId"

val servers = activeSessionHandlers.flatMap {
it.createSession(session.id)
it.getIceServersSession(session.id)
it.createSession(sessionId)
it.getIceServersSession(sessionId)
}

AsyncRunner.runLater {
persistSessionDetailsIfNecessary(gameId, sessionId)
}

return Session(
id = session.id,
id = gameId.toString(),
servers = servers,
)
}

@Transactional
fun persistSessionDetailsIfNecessary(gameId: Long, sessionId: String) {
if (!iceSessionRepository.existsByGameId(gameId)) {
try {
LOG.debug("Creating session for gameId $gameId")
iceSessionRepository.persist(
IceSessionEntity(
id = sessionId,
gameId = gameId,
createdAt = Instant.now(),
),
)
} catch (e: Exception) {
LOG.warn("Unable to persist session details for game id $gameId and session id $sessionId")
}
}
}

@Transactional
@Scheduled(every = "10m")
fun cleanUpSessions() {
Expand Down
10 changes: 10 additions & 0 deletions src/main/kotlin/com/faforever/icebreaker/util/AsyncRunner.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.faforever.icebreaker.util

import java.util.concurrent.CompletableFuture

object AsyncRunner {

fun runLater(runnable: Runnable) {
CompletableFuture.runAsync(runnable)
}
}

0 comments on commit 9911055

Please sign in to comment.