Browse Source

Nawak: add a redis variant

Erwan Ameil 11 years ago
parent
commit
00b3347d40
4 changed files with 92 additions and 1 deletions
  1. 2 0
      nawak/app.nim
  2. 22 1
      nawak/benchmark_config
  3. 24 0
      nawak/model_redis.nim
  4. 44 0
      nawak/setup_redis.py

+ 2 - 0
nawak/app.nim

@@ -3,6 +3,8 @@ import nawak_mongrel, jdump
 import fortunes_tmpl
 import fortunes_tmpl
 when defined(postgre_model):
 when defined(postgre_model):
     import model_postgre
     import model_postgre
+when defined(redis_model):
+    import model_redis
 
 
 get "/json":
 get "/json":
     var j: THello
     var j: THello

+ 22 - 1
nawak/benchmark_config

@@ -20,7 +20,28 @@
       "webserver": "mongrel2",
       "webserver": "mongrel2",
       "os": "Linux",
       "os": "Linux",
       "database_os": "Linux",
       "database_os": "Linux",
-      "display_name": "nawak",
+      "display_name": "nawak-postgresql",
+      "notes": "",
+      "versus": ""
+    },
+    "redis": {
+      "setup_file": "setup_redis",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortunes",
+      "update_url": "/updates?queries=",
+      "port": 6767,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "Redis",
+      "framework": "nawak",
+      "language": "Nimrod",
+      "orm": "Raw",
+      "platform": "Nimrod",
+      "webserver": "mongrel2",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "nawak-redis",
       "notes": "",
       "notes": "",
       "versus": ""
       "versus": ""
     }
     }

+ 24 - 0
nawak/model_redis.nim

@@ -0,0 +1,24 @@
+import strutils, redis
+import model
+export model
+
+var db {.threadvar.}: TRedis
+
+proc init_db*() {.procvar.} =
+    db = open(host="localhost")
+
+proc getWorld*(id: int): TWorld =
+    let s = redis.get(db, "world:" & $id)
+    if s == redisNil:
+        raise newException(ERedis, "World Not Found")
+    return (id, s.parseInt)
+
+proc updateWorld*(w: TWorld) =
+    db.setk("world:" & $w.id, $w.randomNumber)
+
+proc getAllFortunes*(): seq[TFortune] =
+    result = @[]
+    var i = 1
+    for s in db.lrange("fortunes", 0, -1):
+        result.add((id: i, message: s))
+        inc(i)

+ 44 - 0
nawak/setup_redis.py

@@ -0,0 +1,44 @@
+import subprocess
+import sys
+import setup_util
+import os
+from os.path import expanduser
+
+home = expanduser("~")
+
+def start(args, logfile, errfile):
+  setup_util.replace_text("nawak/model_redis.nim",
+                          'open(host=.*)',
+                          'open(host="' + args.database_host + '")')
+  # compile the app
+  subprocess.check_call(
+      "nimrod c --threads:on -d:release -d:redis_model --path:../installs/nawak/nawak -o:nawak_redis app.nim",
+      shell=True, cwd="nawak", stderr=errfile, stdout=logfile)
+  # launch mongrel2
+  subprocess.check_call("mkdir -p run logs tmp", shell=True, cwd="nawak/conf", stderr=errfile, stdout=logfile)
+  subprocess.check_call("sudo m2sh load -config mongrel2.conf", shell=True, cwd="nawak/conf", stderr=errfile, stdout=logfile)
+  subprocess.check_call("sudo m2sh start -name test", shell=True, cwd="nawak/conf", stderr=errfile, stdout=logfile)
+  
+  # launch workers
+  subprocess.Popen("./nawak_redis", shell=True, cwd="nawak", stderr=errfile, stdout=logfile)
+  return 0
+
+def stop(logfile, errfile):
+  ret = 0
+
+  try:
+    subprocess.check_call("sudo m2sh stop -every", shell=True, cwd="nawak/conf", stderr=errfile, stdout=logfile)
+  except:
+    ret = 1
+
+  p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
+  out, err = p.communicate()
+  for line in out.splitlines():
+    if 'nawak_redis' in line:
+      try:
+        pid = int(line.split(None, 2)[1])
+        os.kill(pid, 15)
+      except OSError:
+        ret = 1
+
+  return ret