scala - play framework evolutions
Play slick y Async: ¿es una condición de carrera? (2)
Leyendo el código de DBAction Play-Slick , pensé que este código podría contener una condición de carrera:
object DBAction{
// snip
def apply(r: (RequestWithDbSession) => Result)(implicit app:Application) = {
Action { implicit request =>
AsyncResult {
DB.withSession{ s:scala.slick.session.Session =>
Future(r( RequestWithDbSession(request,s) ))(executionContext)
}
}
}
}
La función r
ejecuta en un momento futuro, después de que withSession
haya devuelto un Future [Result] y se llame a session.close()
. ¿Hay una condición de carrera en este código?
Creo que tienes razón y la solución sugerida por EECOLOR parece correcta. Estamos rastreando esto en un ticket: https://github.com/freekh/play-slick/issues/81
Gracias
No estoy seguro si eso se llama una condición de carrera. Sin embargo, para mí parece que tienes razón en que algo está mal aquí. Es posible que la sesión ya no sea válida cuando el futuro ejecute el código.
Sería mejor invertir la ejecución y solicitar una sesión de base de datos en el futuro:
Async {
Future {
DB.withSession{ s:scala.slick.session.Session =>
r( RequestWithDbSession(request, s) )
}
}
}