patx/mrhttp-asgi

Fix mrcache mem leak

Commit 6e40487 · Mark · 2024-03-06T16:35:26-08:00

Changeset
6e40487d20246615834085c329faa9e8277dd475
Parents
e01c5e187d5b5c1a50beaca2c58703132f8018c6

View source at this commit

Comments

No comments yet.

Log in to comment

Diff

diff --git a/bench/mcsetup.py b/bench/mcsetup.py
index 7ac2fd7..004e4e2 100644
--- a/bench/mcsetup.py
+++ b/bench/mcsetup.py
@@ -1,11 +1,12 @@
 import mrpacker
-from pymemcache.client.base import Client
-c = Client(('localhost', 11211))
-c.set( "mrsession43709dd361cc443e976b05714581a7fb",mrpacker.pack({"user":"Mark"}) )
-c = Client(('localhost', 11212))
-c.set( "mrsession43709dd361cc443e976b05714581a7fb",mrpacker.pack({"user":"Mark"}) )
+#from pymemcache.client.base import Client
+#c = Client(('localhost', 11211))
+#c.set( "mrsession43709dd361cc443e976b05714581a7fb",mrpacker.pack({"user":"Mark"}) )
+#c = Client(('localhost', 11212))
+#c.set( "mrsession43709dd361cc443e976b05714581a7fb",mrpacker.pack({"user":"Mark"}) )
 #print( c.get("mrsessionZZZZ9dd361cc443e976b05714581a7fb"))
 
+#exit()
 import asyncmrcache, asyncio
 
 def lcb(client):
@@ -16,7 +17,10 @@ async def run(loop):
 
   rc = await asyncmrcache.create_client( [("localhost",7000)], loop, lost_cb=lcb)
 
+  print("YAY")
+  print(await rc.get(b"mrsession43709dd361cc443e976b05714581a7fb"))
   await rc.set( b"mrsession43709dd361cc443e976b05714581a7fb",mrpacker.pack({"user":"Mark"}) )
+  await rc.set( b"43709dd361cc443e976b05714581a7fb",mrpacker.pack({"user":"Mark"}) )
   print(await rc.get(b"mrsession43709dd361cc443e976b05714581a7fb"))
   exit()
 
diff --git a/readme b/readme
index ca70096..dacd313 100644
--- a/readme
+++ b/readme
@@ -76,8 +76,8 @@ wrk -t4 -c32 -d1s http://localhost:8080/q/1/2/ -s tests/lua/json.lua
 wrk -t4 -c32 -d1s http://localhost:8080/q/1/2/ -s tests/lua/q-pipeline.lua
 
 MRQ test:
-curl -i --raw http://localhost:8080/q/0/0/ -H "Cookie: mrsession=43709dd361cc443e976b05714581a7fb;" -X POST -d '{"username":"xyz","type":"add"}' 
-wrk -t4 -c32 -d1s http://localhost:8080/q/1/2/ -H "Cookie: mrsession=43709dd361cc443e976b05714581a7fb;" -s tests/lua/json.lua
+curl -i --raw http://localhost:8080/mrq/0 -H "Cookie: mrsession=43709dd361cc443e976b05714581a7fb;" -X POST -d '{"username":"xyz","type":"add"}' 
+wrk -t4 -c32 -d1s http://localhost:8080/mrq/0 -H "Cookie: mrsession=43709dd361cc443e976b05714581a7fb;" -H "Content-Type: application/mrpacker" -s tests/lua/mrpacker.lua
 
 wrk -t4 -c32 -d1s http://localhost:8080/q/1/2/ -H "Content-Type: application/mrpacker" -s tests/lua/mrpacker.lua
 curl -H "Content-Type: application/mrpacker" --data-binary @tests/lua/test.mrp http://localhost:8080/
diff --git a/src/mrhttp/internals/mrcacheprotocol.c b/src/mrhttp/internals/mrcacheprotocol.c
index 8ef0672..efa5ae5 100644
--- a/src/mrhttp/internals/mrcacheprotocol.c
+++ b/src/mrhttp/internals/mrcacheprotocol.c
@@ -122,8 +122,7 @@ PyObject* MrcacheProtocol_data_received(MrcacheProtocol* self, PyObject* data)
   DBG_MEMCAC printf("mrcache protocol - data recvd\n");
   DBG_MEMCAC PyObject_Print( data, stdout, 0 ); 
   DBG_MEMCAC printf("\n");
-//                                                    50  
-//b"VALUE mrsession43709dd361cc443e976b05714581a7fb 0 19\r\n{'username':'Mark'}\r\nEND\r\nVALUE mrqsession43709dd361cc443e976b05714581a7fb 0 19\r\n{'username':'Mark'}\r\nEND\r\nVALUE mrqsession43709dd361cc443e976b05714581a7fb 0 19\r\n{'username':'Mark'}\r\nEND\r\nVALUE mrqsession43709dd361cc443e976b05714581a7fb 0 19\r\n{'username':'Mark'}\r\nEND\r\n"
+
   char *p, *start;
   Py_ssize_t l;
 
@@ -190,7 +189,8 @@ int MrcacheProtocol_asyncGet( MrcacheProtocol* self, char *key, void *fn, void *
   self->queue[self->queue_end].connection = connection;
   self->queue_end = (self->queue_end+1)%self->queue_sz;
 
-  if(!PyObject_CallFunctionObjArgs(self->write, bytes, NULL)) return 0;
+  if(!PyObject_CallFunctionObjArgs(self->write, bytes, NULL)) { Py_XDECREF(bytes); return 0; }
+  Py_DECREF(bytes);
   return 1;
 }
 
@@ -215,7 +215,6 @@ int MrcacheProtocol_asyncSet( MrcacheProtocol* self, char *key, char *val, int v
 
   char *p = self->set_cmd+8;
   memcpy(p, key, 32);
-  DBG_MEMCAC printf("MrcacheProtocol - asyncSet3.1\n");
 
   p += 32;
   // write val_sz
@@ -223,7 +222,8 @@ int MrcacheProtocol_asyncSet( MrcacheProtocol* self, char *key, char *val, int v
   PyObject *bytes = PyBytes_FromStringAndSize(self->set_cmd, 8+32+val_sz);
   //PyObject_Print(bytes,stdout,0); 
   //print_buffer( self->set_cmd, 40+val_sz ); 
-  if(!PyObject_CallFunctionObjArgs(self->write, bytes, NULL)) return 1;
+  if(!PyObject_CallFunctionObjArgs(self->write, bytes, NULL)) { Py_XDECREF(bytes); return 1; }
+  Py_DECREF(bytes);
   return 0;  
 }
 
diff --git a/tests/s_bench.py b/tests/s_bench.py
index f1b8ee0..1e3b969 100755
--- a/tests/s_bench.py
+++ b/tests/s_bench.py
@@ -12,13 +12,13 @@ engine = tenjin.Engine(path=['tests/templates'])
 
 
 app = Application()
-app.config["memcache"] = [("127.0.0.1", 11211)]
-#app.config["mrq"] =      [("127.0.0.1", 7100 )]
+#app.config["memcache"] = [("127.0.0.1", 11211)]
+app.config["mrq"] =      [("127.0.0.1", 7100 )]
 #app.config["mrq"] =      [("127.0.0.1", 7100 ),("127.0.0.1",7001)]
-#app.config["mrcache"] =  [("127.0.0.1", 7000 )]
-app.session_backend = "memcached"
+app.config["mrcache"] =  [("127.0.0.1", 7000 )]
+#app.session_backend = "memcached"
 #app.session_backend = "mrworkserver"
-#app.session_backend = "mrcache"
+app.session_backend = "mrcache"
 
 
 #@app.on('at_start')
@@ -140,9 +140,11 @@ def session(r):
     return "user"
   return "session"
 
-#@app.route('/mrq/{}',options=['session',"mrq","append_user"])
-#def mrq(r, tstid):
-  #return "ok"
[email protected]('/mrq/{}',options=['session',"mrq","append_user"])
+def mrq(r, tstid):
+  if r.user:
+    return "user"
+  return "not logged in"
 
 @app.route('/mrqget')
 async def mrqget(r):
@@ -167,5 +169,5 @@ def longresp(r):
   return "fart"*128*1000
 
 
-app.run(cores=4)
+app.run(cores=1)