patx/mrhttp-asgi
Fix mrcache mem leak
Commit 6e40487 · Mark · 2024-03-06T16:35:26-08:00
Comments
No comments yet.
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)