18
18
import queue
19
19
20
20
from google .cloud .exceptions import NotFound
21
+ from google .cloud .spanner_v1 import BatchCreateSessionsRequest
22
+ from google .cloud .spanner_v1 import Session
21
23
from google .cloud .spanner_v1 ._helpers import _metadata_with_prefix
22
24
23
25
@@ -30,14 +32,18 @@ class AbstractSessionPool(object):
30
32
:type labels: dict (str -> str) or None
31
33
:param labels: (Optional) user-assigned labels for sessions created
32
34
by the pool.
35
+
36
+ :type database_role: str
37
+ :param database_role: (Optional) user-assigned database_role for the session.
33
38
"""
34
39
35
40
_database = None
36
41
37
- def __init__ (self , labels = None ):
42
+ def __init__ (self , labels = None , database_role = None ):
38
43
if labels is None :
39
44
labels = {}
40
45
self ._labels = labels
46
+ self ._database_role = database_role
41
47
42
48
@property
43
49
def labels (self ):
@@ -48,6 +54,15 @@ def labels(self):
48
54
"""
49
55
return self ._labels
50
56
57
+ @property
58
+ def database_role (self ):
59
+ """User-assigned database_role for sessions created by the pool.
60
+
61
+ :rtype: str
62
+ :returns: database_role assigned by the user
63
+ """
64
+ return self ._database_role
65
+
51
66
def bind (self , database ):
52
67
"""Associate the pool with a database.
53
68
@@ -104,9 +119,9 @@ def _new_session(self):
104
119
:rtype: :class:`~google.cloud.spanner_v1.session.Session`
105
120
:returns: new session instance.
106
121
"""
107
- if self .labels :
108
- return self ._database . session ( labels = self .labels )
109
- return self . _database . session ( )
122
+ return self ._database . session (
123
+ labels = self .labels , database_role = self .database_role
124
+ )
110
125
111
126
def session (self , ** kwargs ):
112
127
"""Check out a session from the pool.
@@ -146,13 +161,22 @@ class FixedSizePool(AbstractSessionPool):
146
161
:type labels: dict (str -> str) or None
147
162
:param labels: (Optional) user-assigned labels for sessions created
148
163
by the pool.
164
+
165
+ :type database_role: str
166
+ :param database_role: (Optional) user-assigned database_role for the session.
149
167
"""
150
168
151
169
DEFAULT_SIZE = 10
152
170
DEFAULT_TIMEOUT = 10
153
171
154
- def __init__ (self , size = DEFAULT_SIZE , default_timeout = DEFAULT_TIMEOUT , labels = None ):
155
- super (FixedSizePool , self ).__init__ (labels = labels )
172
+ def __init__ (
173
+ self ,
174
+ size = DEFAULT_SIZE ,
175
+ default_timeout = DEFAULT_TIMEOUT ,
176
+ labels = None ,
177
+ database_role = None ,
178
+ ):
179
+ super (FixedSizePool , self ).__init__ (labels = labels , database_role = database_role )
156
180
self .size = size
157
181
self .default_timeout = default_timeout
158
182
self ._sessions = queue .LifoQueue (size )
@@ -167,9 +191,14 @@ def bind(self, database):
167
191
self ._database = database
168
192
api = database .spanner_api
169
193
metadata = _metadata_with_prefix (database .name )
194
+ self ._database_role = self ._database_role or self ._database .database_role
195
+ request = BatchCreateSessionsRequest (
196
+ session_template = Session (creator_role = self .database_role ),
197
+ )
170
198
171
199
while not self ._sessions .full ():
172
200
resp = api .batch_create_sessions (
201
+ request = request ,
173
202
database = database .name ,
174
203
session_count = self .size - self ._sessions .qsize (),
175
204
metadata = metadata ,
@@ -243,10 +272,13 @@ class BurstyPool(AbstractSessionPool):
243
272
:type labels: dict (str -> str) or None
244
273
:param labels: (Optional) user-assigned labels for sessions created
245
274
by the pool.
275
+
276
+ :type database_role: str
277
+ :param database_role: (Optional) user-assigned database_role for the session.
246
278
"""
247
279
248
- def __init__ (self , target_size = 10 , labels = None ):
249
- super (BurstyPool , self ).__init__ (labels = labels )
280
+ def __init__ (self , target_size = 10 , labels = None , database_role = None ):
281
+ super (BurstyPool , self ).__init__ (labels = labels , database_role = database_role )
250
282
self .target_size = target_size
251
283
self ._database = None
252
284
self ._sessions = queue .LifoQueue (target_size )
@@ -259,6 +291,7 @@ def bind(self, database):
259
291
when needed.
260
292
"""
261
293
self ._database = database
294
+ self ._database_role = self ._database_role or self ._database .database_role
262
295
263
296
def get (self ):
264
297
"""Check a session out from the pool.
@@ -340,10 +373,20 @@ class PingingPool(AbstractSessionPool):
340
373
:type labels: dict (str -> str) or None
341
374
:param labels: (Optional) user-assigned labels for sessions created
342
375
by the pool.
376
+
377
+ :type database_role: str
378
+ :param database_role: (Optional) user-assigned database_role for the session.
343
379
"""
344
380
345
- def __init__ (self , size = 10 , default_timeout = 10 , ping_interval = 3000 , labels = None ):
346
- super (PingingPool , self ).__init__ (labels = labels )
381
+ def __init__ (
382
+ self ,
383
+ size = 10 ,
384
+ default_timeout = 10 ,
385
+ ping_interval = 3000 ,
386
+ labels = None ,
387
+ database_role = None ,
388
+ ):
389
+ super (PingingPool , self ).__init__ (labels = labels , database_role = database_role )
347
390
self .size = size
348
391
self .default_timeout = default_timeout
349
392
self ._delta = datetime .timedelta (seconds = ping_interval )
@@ -360,9 +403,15 @@ def bind(self, database):
360
403
api = database .spanner_api
361
404
metadata = _metadata_with_prefix (database .name )
362
405
created_session_count = 0
406
+ self ._database_role = self ._database_role or self ._database .database_role
407
+
408
+ request = BatchCreateSessionsRequest (
409
+ session_template = Session (creator_role = self .database_role ),
410
+ )
363
411
364
412
while created_session_count < self .size :
365
413
resp = api .batch_create_sessions (
414
+ request = request ,
366
415
database = database .name ,
367
416
session_count = self .size - created_session_count ,
368
417
metadata = metadata ,
@@ -470,13 +519,27 @@ class TransactionPingingPool(PingingPool):
470
519
:type labels: dict (str -> str) or None
471
520
:param labels: (Optional) user-assigned labels for sessions created
472
521
by the pool.
522
+
523
+ :type database_role: str
524
+ :param database_role: (Optional) user-assigned database_role for the session.
473
525
"""
474
526
475
- def __init__ (self , size = 10 , default_timeout = 10 , ping_interval = 3000 , labels = None ):
527
+ def __init__ (
528
+ self ,
529
+ size = 10 ,
530
+ default_timeout = 10 ,
531
+ ping_interval = 3000 ,
532
+ labels = None ,
533
+ database_role = None ,
534
+ ):
476
535
self ._pending_sessions = queue .Queue ()
477
536
478
537
super (TransactionPingingPool , self ).__init__ (
479
- size , default_timeout , ping_interval , labels = labels
538
+ size ,
539
+ default_timeout ,
540
+ ping_interval ,
541
+ labels = labels ,
542
+ database_role = database_role ,
480
543
)
481
544
482
545
self .begin_pending_transactions ()
@@ -489,6 +552,7 @@ def bind(self, database):
489
552
when needed.
490
553
"""
491
554
super (TransactionPingingPool , self ).bind (database )
555
+ self ._database_role = self ._database_role or self ._database .database_role
492
556
self .begin_pending_transactions ()
493
557
494
558
def put (self , session ):
0 commit comments