Skip to content

Commit 370db64

Browse files
Eliminate problematic _clean_rooms method
1 parent 74e9ab1 commit 370db64

File tree

2 files changed

+8
-30
lines changed

2 files changed

+8
-30
lines changed

socketio/base_manager.py

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ class BaseManager(object):
1515
def __init__(self):
1616
self.server = None
1717
self.rooms = {}
18-
self.pending_removals = []
1918
self.callbacks = {}
2019

2120
def initialize(self, server):
@@ -27,10 +26,8 @@ def get_namespaces(self):
2726

2827
def get_participants(self, namespace, room):
2928
"""Return an iterable with the active participants in a room."""
30-
for sid, active in six.iteritems(self.rooms[namespace][room]):
31-
if active:
32-
yield sid
33-
self._clean_rooms()
29+
for sid, active in six.iteritems(self.rooms[namespace][room].copy()):
30+
yield sid
3431

3532
def connect(self, sid, namespace):
3633
"""Register a client connection to a namespace."""
@@ -56,7 +53,6 @@ def disconnect(self, sid, namespace):
5653

5754
def enter_room(self, sid, namespace, room):
5855
"""Add a client to a room."""
59-
self._clean_rooms() # ensure our rooms are up to date first
6056
if namespace not in self.rooms:
6157
self.rooms[namespace] = {}
6258
if room not in self.rooms[namespace]:
@@ -66,10 +62,11 @@ def enter_room(self, sid, namespace, room):
6662
def leave_room(self, sid, namespace, room):
6763
"""Remove a client from a room."""
6864
try:
69-
# do not delete immediately, just mark the client as inactive
70-
# _clean_rooms() will do the clean up when it is safe to do so
71-
self.rooms[namespace][room][sid] = False
72-
self.pending_removals.append((namespace, room, sid))
65+
del self.rooms[namespace][room][sid]
66+
if len(self.rooms[namespace][room]) == 0:
67+
del self.rooms[namespace][room]
68+
if len(self.rooms[namespace]) == 0:
69+
del self.rooms[namespace]
7370
except KeyError:
7471
pass
7572

@@ -126,17 +123,3 @@ def _generate_ack_id(self, sid, namespace, callback):
126123
id = six.next(self.callbacks[sid][namespace][0])
127124
self.callbacks[sid][namespace][id] = callback
128125
return id
129-
130-
def _clean_rooms(self):
131-
"""Remove all the inactive room participants."""
132-
for namespace, room, sid in self.pending_removals:
133-
try:
134-
del self.rooms[namespace][room][sid]
135-
except KeyError:
136-
# failures here could mean there were duplicates so we ignore
137-
continue
138-
if len(self.rooms[namespace][room]) == 0:
139-
del self.rooms[namespace][room]
140-
if len(self.rooms[namespace]) == 0:
141-
del self.rooms[namespace]
142-
self.pending_removals = []

tests/test_base_manager.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ def test_disconnect(self):
3030
self.bm.enter_room('123', '/foo', 'bar')
3131
self.bm.enter_room('456', '/foo', 'baz')
3232
self.bm.disconnect('123', '/foo')
33-
self.bm._clean_rooms()
3433
self.assertEqual(self.bm.rooms['/foo'], {None: {'456': True},
3534
'456': {'456': True},
3635
'baz': {'456': True}})
@@ -47,7 +46,6 @@ def test_disconnect_default_namespace(self):
4746
self.assertTrue(self.bm.is_connected('123', '/foo'))
4847
self.bm.disconnect('123', '/foo')
4948
self.assertFalse(self.bm.is_connected('123', '/foo'))
50-
self.bm._clean_rooms()
5149
self.assertEqual(self.bm.rooms['/'], {None: {'456': True},
5250
'456': {'456': True}})
5351
self.assertEqual(self.bm.rooms['/foo'], {None: {'456': True},
@@ -62,7 +60,6 @@ def test_disconnect_twice(self):
6260
self.bm.disconnect('123', '/foo')
6361
self.bm.disconnect('123', '/')
6462
self.bm.disconnect('123', '/foo')
65-
self.bm._clean_rooms()
6663
self.assertEqual(self.bm.rooms['/'], {None: {'456': True},
6764
'456': {'456': True}})
6865
self.assertEqual(self.bm.rooms['/foo'], {None: {'456': True},
@@ -75,7 +72,6 @@ def test_disconnect_all(self):
7572
self.bm.enter_room('456', '/foo', 'baz')
7673
self.bm.disconnect('123', '/foo')
7774
self.bm.disconnect('456', '/foo')
78-
self.bm._clean_rooms()
7975
self.assertEqual(self.bm.rooms, {})
8076

8177
def test_disconnect_with_callbacks(self):
@@ -125,11 +121,10 @@ def test_get_participants(self):
125121
self.bm.connect('456', '/')
126122
self.bm.connect('789', '/')
127123
self.bm.disconnect('789', '/')
128-
self.assertEqual(self.bm.rooms['/'][None]['789'], False)
124+
self.assertNotIn('789', self.bm.rooms['/'][None])
129125
participants = list(self.bm.get_participants('/', None))
130126
self.assertEqual(len(participants), 2)
131127
self.assertNotIn('789', participants)
132-
self.assertNotIn('789', self.bm.rooms['/'][None])
133128

134129
def test_leave_invalid_room(self):
135130
self.bm.connect('123', '/foo')

0 commit comments

Comments
 (0)