From 4b8c3064e0441580d390862ad3c3bd9618c98b72 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Thu, 26 Jan 2017 12:22:53 +0100 Subject: [PATCH] preload logged in user --- app/controllers/LilaController.scala | 11 +++++++---- modules/memo/src/main/Syncache.scala | 8 ++++++++ modules/user/src/main/LightUserApi.scala | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/controllers/LilaController.scala b/app/controllers/LilaController.scala index b7b580a36b..540f7cbc8c 100644 --- a/app/controllers/LilaController.scala +++ b/app/controllers/LilaController.scala @@ -287,10 +287,13 @@ private[controllers] trait LilaController ctx.me.fold(fuccess(PageData.anon(getAssetVersion, blindMode(ctx)))) { me => val isPage = HTTPRequest.isSynchronousHttp(ctx.req) (Env.pref.api getPref me) zip { - if (isPage) getOnlineFriends(me) zip - Env.team.api.nbRequests(me.id) zip - Env.challenge.api.countInFor(me.id) zip - Env.notifyModule.api.unreadCount(Notifies(me.id)).map(_.value) + if (isPage) { + Env.user.lightUserApi preloadUser me + getOnlineFriends(me) zip + Env.team.api.nbRequests(me.id) zip + Env.challenge.api.countInFor(me.id) zip + Env.notifyModule.api.unreadCount(Notifies(me.id)).map(_.value) + } else fuccess { (((OnlineFriends.empty, 0), 0), 0) } diff --git a/modules/memo/src/main/Syncache.scala b/modules/memo/src/main/Syncache.scala index 661ecacae2..589b88b856 100644 --- a/modules/memo/src/main/Syncache.scala +++ b/modules/memo/src/main/Syncache.scala @@ -28,6 +28,7 @@ final class Syncache[K, V]( // get the value synchronously, might block depending on strategy def sync(k: K): V = Option(cache getIfPresent k) getOrElse { + println(s"*** miss $name $k") incMiss() chm.computeIfAbsent(k, loadFunction) strategy match { @@ -51,6 +52,7 @@ final class Syncache[K, V]( def preloadOne(k: K): Funit = if (cache.getIfPresent(k) == null) { + println(s"*** preload $name $k") incPreload() chm.computeIfAbsent(k, loadFunction) chm.get(k).void @@ -59,6 +61,12 @@ final class Syncache[K, V]( def preloadMany(ks: Seq[K]): Funit = ks.distinct.map(preloadOne).sequenceFu.void + def setOneIfAbsent(k: K, v: => V): Unit = + if (cache.getIfPresent(k) == null) { + incPreload() + cache.put(k, v) + } + private val loadFunction = new java.util.function.Function[K, Fu[V]] { def apply(k: K) = { compute(k).withTimeout( diff --git a/modules/user/src/main/LightUserApi.scala b/modules/user/src/main/LightUserApi.scala index 3a6852218d..a89a1b5892 100644 --- a/modules/user/src/main/LightUserApi.scala +++ b/modules/user/src/main/LightUserApi.scala @@ -19,6 +19,7 @@ final class LightUserApi(coll: Coll)(implicit system: akka.actor.ActorSystem) { def preloadOne = cache preloadOne _ def preloadMany = cache preloadMany _ + def preloadUser(user: User) = cache.setOneIfAbsent(user.id, user.light.some) def getList(ids: List[String]): List[LightUser] = ids flatMap sync