[Checkins] SVN: zc.resumelb/trunk/src/zc/resumelb/ Fixed: Workers buffered large request bodies in memory. Now large
jim
cvs-admin at zope.org
Tue Apr 24 18:59:14 UTC 2012
Log message for revision 125279:
Fixed: Workers buffered large request bodies in memory. Now large
request bodies are buffered to disk.
Changed:
U zc.resumelb/trunk/src/zc/resumelb/README.txt
U zc.resumelb/trunk/src/zc/resumelb/tests.py
U zc.resumelb/trunk/src/zc/resumelb/worker.py
U zc.resumelb/trunk/src/zc/resumelb/worker.test
-=-
Modified: zc.resumelb/trunk/src/zc/resumelb/README.txt
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/README.txt 2012-04-24 17:38:56 UTC (rev 125278)
+++ zc.resumelb/trunk/src/zc/resumelb/README.txt 2012-04-24 18:59:10 UTC (rev 125279)
@@ -242,7 +242,7 @@
Change History
==============
-0.4.0 (2012-04-23)
+0.4.0 (2012-04-24)
------------------
- Change the load-balancing algorithm to take backlogs of
@@ -263,6 +263,9 @@
start time of the oldest request for each worker, to be used for
monitoring.
+- Fixed: Workers buffered large request bodies in memory. Now large
+ request bodies are buffered to disk.
+
0.3.0 (2012-03-28)
------------------
Modified: zc.resumelb/trunk/src/zc/resumelb/tests.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/tests.py 2012-04-24 17:38:56 UTC (rev 125278)
+++ zc.resumelb/trunk/src/zc/resumelb/tests.py 2012-04-24 18:59:10 UTC (rev 125279)
@@ -24,6 +24,7 @@
import time
import unittest
import webob
+import zc.resumelb.worker
import zc.zk.testing
import zope.testing.setupstack
import zope.testing.wait
@@ -91,6 +92,11 @@
global pid
pid = 6115
test.globs['wait'] = zope.testing.wait.Wait(getsleep=lambda : gevent.sleep)
+ old_STRING_BUFFER_SIZE = zc.resumelb.worker.STRING_BUFFER_SIZE
+ zope.testing.setupstack.register(
+ test, setattr, zc.resumelb.worker,
+ 'STRING_BUFFER_SIZE', old_STRING_BUFFER_SIZE)
+ zc.resumelb.worker.STRING_BUFFER_SIZE = 9999
def zkSetUp(test):
setUp(test)
Modified: zc.resumelb/trunk/src/zc/resumelb/worker.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/worker.py 2012-04-24 17:38:56 UTC (rev 125278)
+++ zc.resumelb/trunk/src/zc/resumelb/worker.py 2012-04-24 18:59:10 UTC (rev 125279)
@@ -10,6 +10,7 @@
import marshal
import os
import sys
+import tempfile
import time
import zc.parse_addr
import zc.resumelb.util
@@ -24,6 +25,8 @@
print >>sys.stderr, mess
traceback.print_exc()
+STRING_BUFFER_SIZE = 9999999
+
class Worker:
def __init__(self, app, addr,
@@ -197,7 +200,11 @@
env['wsgi.errors'] = sys.stderr
# XXX We're buffering input. Maybe should to have option not to.
- f = cStringIO.StringIO()
+ content_length = int(env.get('CONTENT_LENGTH', 0))
+ if content_length > STRING_BUFFER_SIZE:
+ f = tempfile.TemporaryFile(suffix='.rlbwi')
+ else:
+ f = cStringIO.StringIO()
while 1:
data = get()
if data:
Modified: zc.resumelb/trunk/src/zc/resumelb/worker.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/worker.test 2012-04-24 17:38:56 UTC (rev 125278)
+++ zc.resumelb/trunk/src/zc/resumelb/worker.test 2012-04-24 18:59:10 UTC (rev 125279)
@@ -116,9 +116,12 @@
We can have multiple outstanding requests:
- >>> write_message(worker_socket, 2, newenv('', '/hi.html'))
- >>> write_message(worker_socket, 3, newenv('1', '/hi.html'))
- >>> write_message(worker_socket, 4, newenv('1', '/hi.html'))
+ >>> write_message(worker_socket, 2, newenv('', '/hi.html', dict(
+ ... REQUEST_METHOD='POST', CONTENT_LENGTH='1000')))
+ >>> write_message(worker_socket, 3, newenv('1', '/hi.html', dict(
+ ... REQUEST_METHOD='POST', CONTENT_LENGTH='10000')))
+ >>> write_message(worker_socket, 4, newenv('1', '/hi.html', dict(
+ ... REQUEST_METHOD='POST', CONTENT_LENGTH='100000')))
At this point, we have 3 outstanding requests. Let's create 3 bodies:
More information about the checkins
mailing list