Author: tack
Date: Sun Feb 3 16:17:52 2008
New Revision: 3018
Log:
Support for specifing send/receive socket buffer size. This can improve
performance when pushing large amounts of data via rpc by about 3 fold.
Modified:
trunk/base/src/rpc.py
Modified: trunk/base/src/rpc.py
==============================================================================
--- trunk/base/src/rpc.py (original)
+++ trunk/base/src/rpc.py Sun Feb 3 16:17:52 2008
@@ -149,10 +149,14 @@
class Server(object):
"""
RPC server class.
+
+ See Client documentation for explanation of bufsize.
"""
- def __init__(self, address, auth_secret = ''):
+ def __init__(self, address, auth_secret = '', bufsize = None):
self._auth_secret = auth_secret
+ self._socket_buffer_size = bufsize
+
if type(address) in types.StringTypes:
if address.find('/') == -1:
# create socket in kaa temp dir
@@ -201,7 +205,8 @@
client_sock = self.socket.accept()[0]
client_sock.setblocking(False)
log.debug("New connection %s", client_sock)
- client = Channel(socket = client_sock, auth_secret = self._auth_secret)
+ client = Channel(sock = client_sock, auth_secret = self._auth_secret,
+ bufsize = self._socket_buffer_size)
for obj in self.objects:
client.connect(obj)
client._send_auth_challenge()
@@ -230,8 +235,8 @@
Channel object for two point communication. The server creates a Channel
object for each client connection, Client itslef is a Channel.
"""
- def __init__(self, socket, auth_secret):
- self._socket = socket
+ def __init__(self, sock, auth_secret, bufsize = None):
+ self._socket = sock
self._rmon = kaa.SocketDispatcher(self._handle_read)
self._rmon.register(self._socket.fileno(), kaa.IO_READ)
@@ -246,6 +251,10 @@
self._auth_secret = auth_secret
self._pending_challenge = None
+ if bufsize:
+ self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF,
bufsize)
+ self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF,
bufsize)
+
self.signals = { 'closed': kaa.Signal() }
kaa.main.signals["shutdown"].connect_weak(self._handle_close)
@@ -773,8 +782,14 @@
class Client(Channel):
"""
RPC client to be connected to a server.
+
+ If bufsize is not None, the socket send and receive buffers will be set to
+ this size. Setting this to higher values (say 1M) improves performance
+ when sending large amounts of data via RPC. Note that the upper bound may
+ be restricted by the kernel. (Under Linux, this can be tuned by adjusting
+ /proc/sys/net/core/[rw]mem_max)
"""
- def __init__(self, address, auth_secret = ''):
+ def __init__(self, address, auth_secret = '', bufsize = None):
if type(address) in types.StringTypes:
address = '%s/%s' % (kaa.TEMP, address)
fd = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
@@ -785,7 +800,7 @@
except socket.error, e:
raise ConnectError(e)
fd.setblocking(False)
- Channel.__init__(self, fd, auth_secret)
+ Channel.__init__(self, fd, auth_secret, bufsize)
def _get_channel_type(self):
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog