Skip to content

Commit eb6509f

Browse files
committed
Fix setting configured socket options
We forget to update the code that sets socket options while doing hazelcast#219. The code now handles the given socket options tuple correctly. Also, added some tests that verifies this.
1 parent 03b9f1d commit eb6509f

File tree

2 files changed

+52
-8
lines changed

2 files changed

+52
-8
lines changed

hazelcast/reactor.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ def connection_factory(self, connection_manager, connection_id, address, network
351351

352352
class AsyncoreConnection(Connection, asyncore.dispatcher):
353353
sent_protocol_bytes = False
354-
read_buffer_size = _BUFFER_SIZE
354+
receive_buffer_size = _BUFFER_SIZE
355355

356356
def __init__(self, reactor, connection_manager, connection_id, address,
357357
config, message_callback):
@@ -375,11 +375,11 @@ def __init__(self, reactor, connection_manager, connection_id, address,
375375
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, _BUFFER_SIZE)
376376
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, _BUFFER_SIZE)
377377

378-
for socket_option in config.socket_options:
379-
if socket_option.option is socket.SO_RCVBUF:
380-
self.read_buffer_size = socket_option.value
378+
for level, option_name, value in config.socket_options:
379+
if option_name is socket.SO_RCVBUF:
380+
self.receive_buffer_size = value
381381

382-
self.socket.setsockopt(socket_option.level, socket_option.option, socket_option.value)
382+
self.socket.setsockopt(level, option_name, value)
383383

384384
self.connect((address.host, address.port))
385385

@@ -434,10 +434,10 @@ def handle_connect(self):
434434
def handle_read(self):
435435
reader = self._reader
436436
while True:
437-
data = self.recv(self.read_buffer_size)
437+
data = self.recv(self.receive_buffer_size)
438438
reader.read(data)
439439
self.last_read_time = time.time()
440-
if len(data) < self.read_buffer_size:
440+
if len(data) < self.receive_buffer_size:
441441
break
442442

443443
if reader.length:

tests/reactor_test.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
from parameterized import parameterized
99

1010
from hazelcast import six
11-
from hazelcast.reactor import AsyncoreReactor, _WakeableLoop, _SocketedWaker, _PipedWaker, _BasicLoop
11+
from hazelcast.config import _Config
12+
from hazelcast.reactor import AsyncoreReactor, _WakeableLoop, _SocketedWaker, _PipedWaker, _BasicLoop, \
13+
AsyncoreConnection
1214
from hazelcast.util import AtomicInteger
1315
from tests.base import HazelcastTestCase
1416

@@ -259,3 +261,45 @@ def test_close(self):
259261

260262
with self.assertRaises(OSError):
261263
os.read(r_fd, 1)
264+
265+
266+
class AsyncoreConnectionTest(HazelcastTestCase):
267+
@classmethod
268+
def setUpClass(cls):
269+
cls.rc = cls.create_rc()
270+
cls.cluster = cls.create_cluster(cls.rc)
271+
cls.member = cls.cluster.start_member()
272+
273+
@classmethod
274+
def tearDownClass(cls):
275+
cls.rc.terminateCluster(cls.cluster.id)
276+
cls.rc.exit()
277+
278+
def test_socket_options(self):
279+
config = _Config()
280+
config.socket_options = [
281+
(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
282+
]
283+
conn = AsyncoreConnection(MagicMock(map=dict()), None, None, self.member.address, config, None)
284+
285+
try:
286+
# By default this is set to 0
287+
self.assertEqual(1, conn.socket.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR))
288+
finally:
289+
conn._inner_close()
290+
291+
def test_receive_buffer_size(self):
292+
# When the SO_RCVBUF option is set, we should try
293+
# to use that value while trying to read something.
294+
config = _Config()
295+
size = 64 * 1024
296+
config.socket_options = [
297+
(socket.SOL_SOCKET, socket.SO_RCVBUF, size)
298+
]
299+
conn = AsyncoreConnection(MagicMock(map=dict()), None, None, self.member.address, config, None)
300+
301+
try:
302+
# By default this is set to 128000
303+
self.assertEqual(size, conn.receive_buffer_size)
304+
finally:
305+
conn._inner_close()

0 commit comments

Comments
 (0)