You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@predictionio.apache.org by ch...@apache.org on 2017/09/27 22:11:08 UTC
[33/50] [abbrv] incubator-predictionio git commit: [PIO-115]
Implement Storage app & channel name-to-ID cache
[PIO-115] Implement Storage app & channel name-to-ID cache
Closes #424
Project: http://git-wip-us.apache.org/repos/asf/incubator-predictionio/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-predictionio/commit/eb613580
Tree: http://git-wip-us.apache.org/repos/asf/incubator-predictionio/tree/eb613580
Diff: http://git-wip-us.apache.org/repos/asf/incubator-predictionio/diff/eb613580
Branch: refs/heads/master
Commit: eb6135809f66ccd2db71a3f78404a4aa0ccb16cd
Parents: bcc0afe
Author: Mars Hall <ma...@heroku.com>
Authored: Tue Aug 29 11:28:19 2017 -0700
Committer: Mars Hall <ma...@heroku.com>
Committed: Tue Aug 29 11:28:19 2017 -0700
----------------------------------------------------------------------
.../apache/predictionio/data/store/Common.scala | 43 ++++++++++++--------
1 file changed, 25 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-predictionio/blob/eb613580/data/src/main/scala/org/apache/predictionio/data/store/Common.scala
----------------------------------------------------------------------
diff --git a/data/src/main/scala/org/apache/predictionio/data/store/Common.scala b/data/src/main/scala/org/apache/predictionio/data/store/Common.scala
index 552064f..7daf19c 100644
--- a/data/src/main/scala/org/apache/predictionio/data/store/Common.scala
+++ b/data/src/main/scala/org/apache/predictionio/data/store/Common.scala
@@ -19,6 +19,7 @@
package org.apache.predictionio.data.store
import org.apache.predictionio.data.storage.Storage
+import scala.collection.mutable
import grizzled.slf4j.Logger
private[predictionio] object Common {
@@ -26,28 +27,34 @@ private[predictionio] object Common {
@transient lazy val logger = Logger[this.type]
@transient lazy private val appsDb = Storage.getMetaDataApps()
@transient lazy private val channelsDb = Storage.getMetaDataChannels()
+ // Memoize app & channel name-to-ID resolution to avoid excessive storage IO
+ @transient lazy val appNameToIdCache =
+ mutable.Map[(String, Option[String]), (Int, Option[Int])]()
/* throw exception if invalid app name or channel name */
def appNameToId(appName: String, channelName: Option[String]): (Int, Option[Int]) = {
- val appOpt = appsDb.getByName(appName)
-
- appOpt.map { app =>
- val channelMap: Map[String, Int] = channelsDb.getByAppid(app.id)
- .map(c => (c.name, c.id)).toMap
-
- val channelId: Option[Int] = channelName.map { ch =>
- if (channelMap.contains(ch)) {
- channelMap(ch)
- } else {
- logger.error(s"Invalid channel name ${ch}.")
- throw new IllegalArgumentException(s"Invalid channel name ${ch}.")
+ appNameToIdCache.getOrElseUpdate((appName, channelName), {
+ val appOpt = appsDb.getByName(appName)
+
+ appOpt.map { app =>
+ val channelMap: Map[String, Int] = channelsDb.getByAppid(app.id)
+ .map(c => (c.name, c.id)).toMap
+
+ val channelId: Option[Int] = channelName.map { ch =>
+ if (channelMap.contains(ch)) {
+ channelMap(ch)
+ } else {
+ logger.error(s"Invalid channel name ${ch}.")
+ throw new IllegalArgumentException(s"Invalid channel name ${ch}.")
+ }
}
- }
- (app.id, channelId)
- }.getOrElse {
- logger.error(s"Invalid app name ${appName}")
- throw new IllegalArgumentException(s"Invalid app name ${appName}")
- }
+ appNameToIdCache((appName, channelName)) = (app.id, channelId)
+ (app.id, channelId)
+ }.getOrElse {
+ logger.error(s"Invalid app name ${appName}")
+ throw new IllegalArgumentException(s"Invalid app name ${appName}")
+ }
+ })
}
}