remember which server processed the analysis - closes #765

This commit is contained in:
Thibault Duplessis 2015-08-14 14:21:57 +02:00
parent 657114ff0d
commit 0645e118e3
4 changed files with 15 additions and 12 deletions

View file

@ -44,5 +44,4 @@ object Ai extends LilaController {
}
funit
}
}

View file

@ -66,7 +66,7 @@ final class Analyser(
}
}
def complete(id: String, data: String, from: String) =
def complete(id: String, data: String, fromIp: String) =
$find.byId[Game](id) zip get(id) zip (GameRepo initialFen id) flatMap {
case ((Some(game), Some(a1)), initialFen) if game.analysable =>
Info.decodeList(data, game.startedAtTurn) match {
@ -78,9 +78,9 @@ final class Analyser(
errors foreach { e => logwarn(s"[analysis UciToPgn] $id $e") }
if (analysis.valid) {
if (analysis.emptyRatio >= 1d / 10)
fufail(s"Analysis $id from $from has ${analysis.nbEmptyInfos} empty infos out of ${analysis.infos.size}")
fufail(s"Analysis $id from $fromIp has ${analysis.nbEmptyInfos} empty infos out of ${analysis.infos.size}")
indexer ! InsertGame(game)
AnalysisRepo.done(id, analysis) >>- {
AnalysisRepo.done(id, analysis, fromIp) >>- {
modActor ! actorApi.AnalysisReady(game, analysis)
} >>- GameRepo.setAnalysed(game.id) inject analysis
}
@ -93,7 +93,7 @@ final class Analyser(
_ => AnalysisRepo remove id
}
def completeErr(id: String, err: String, from: String) =
def completeErr(id: String, err: String, fromIp: String) =
$find.byId[Game](id) zip getNotDone(id) flatMap {
case (Some(game), Some(a1)) if game.analysable => AnalysisRepo remove id
}

View file

@ -10,7 +10,8 @@ case class Analysis(
infos: List[Info],
startPly: Int,
done: Boolean,
date: DateTime) {
date: DateTime,
serverIp: Option[String]) {
lazy val infoAdvices: InfoAdvices = {
(Info.start(startPly) :: infos) sliding 2 collect {
@ -58,12 +59,13 @@ object Analysis {
val id = r str "_id"
val ply = r intO "ply"
val date = r date "date"
val ip = r strO "ip"
(r strD "data", r boolD "done") match {
case ("", true) => new Analysis(id, Nil, ~ply, false, date)
case ("", true) => new Analysis(id, Nil, ~ply, false, date, ip)
case (d, true) => Info.decodeList(d, ~ply) map {
new Analysis(id, _, ~ply, true, date)
new Analysis(id, _, ~ply, true, date, ip)
} err s"Invalid analysis data $d"
case (_, false) => new Analysis(id, Nil, ~ply, false, date)
case (_, false) => new Analysis(id, Nil, ~ply, false, date, ip)
}
}
def writes(w: BSON.Writer, o: Analysis) = BSONDocument(
@ -71,7 +73,8 @@ object Analysis {
"data" -> Info.encodeList(o.infos),
"ply" -> w.intO(o.startPly),
"done" -> o.done,
"date" -> w.date(o.date))
"date" -> w.date(o.date),
"ip" -> o.serverIp)
}
private[analyse] lazy val tube = lila.db.BsTube(analysisBSONHandler)

View file

@ -12,11 +12,12 @@ object AnalysisRepo {
type ID = String
def done(id: ID, a: Analysis) = $update(
def done(id: ID, a: Analysis, serverIp: String) = $update(
$select(id),
$set(Json.obj(
"done" -> true,
"data" -> Info.encodeList(a.infos)
"data" -> Info.encodeList(a.infos),
"ip" -> serverIp
))
)