Skip to content

Commit 3285e93

Browse files
Gurov Ilyatseaver
authored andcommitted
fix(spanner): return sessions from pool in LIFO order (#9454)
Closes #9392.
1 parent 1d4a6f8 commit 3285e93

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

spanner/google/cloud/spanner_v1/pool.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def __init__(self, size=DEFAULT_SIZE, default_timeout=DEFAULT_TIMEOUT, labels=No
156156
super(FixedSizePool, self).__init__(labels=labels)
157157
self.size = size
158158
self.default_timeout = default_timeout
159-
self._sessions = queue.Queue(size)
159+
self._sessions = queue.LifoQueue(size)
160160

161161
def bind(self, database):
162162
"""Associate the pool with a database.
@@ -251,7 +251,7 @@ def __init__(self, target_size=10, labels=None):
251251
super(BurstyPool, self).__init__(labels=labels)
252252
self.target_size = target_size
253253
self._database = None
254-
self._sessions = queue.Queue(target_size)
254+
self._sessions = queue.LifoQueue(target_size)
255255

256256
def bind(self, database):
257257
"""Associate the pool with a database.

spanner/tests/unit/test_pool.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,16 @@ def test_bind(self):
164164
def test_get_non_expired(self):
165165
pool = self._make_one(size=4)
166166
database = _Database("name")
167-
SESSIONS = [_Session(database)] * 4
167+
SESSIONS = sorted([_Session(database) for i in range(0, 4)])
168168
database._sessions.extend(SESSIONS)
169169
pool.bind(database)
170170

171-
session = pool.get()
172-
173-
self.assertIs(session, SESSIONS[0])
174-
self.assertTrue(session._exists_checked)
175-
self.assertFalse(pool._sessions.full())
171+
# check if sessions returned in LIFO order
172+
for i in (3, 2, 1, 0):
173+
session = pool.get()
174+
self.assertIs(session, SESSIONS[i])
175+
self.assertTrue(session._exists_checked)
176+
self.assertFalse(pool._sessions.full())
176177

177178
def test_get_expired(self):
178179
pool = self._make_one(size=4)
@@ -898,7 +899,10 @@ def mock_batch_create_sessions(db, session_count=10, timeout=10, metadata=[]):
898899
self.spanner_api.batch_create_sessions.side_effect = mock_batch_create_sessions
899900

900901
def session(self):
901-
return self._sessions.pop()
902+
# always return first session in the list
903+
# to avoid reversing the order of putting
904+
# sessions into pool (important for order tests)
905+
return self._sessions.pop(0)
902906

903907

904908
class _Queue(object):

0 commit comments

Comments
 (0)