2626
2727
2828class AbstractSessionPool (object ):
29- """Specifies required API for concrete session pool implementations."""
29+ """Specifies required API for concrete session pool implementations.
3030
31+ :type labels: dict (str -> str) or None
32+ :param labels: (Optional) user-assigned labels for sessions created
33+ by the pool.
34+ """
3135 _database = None
3236
37+ def __init__ (self , labels = None ):
38+ if labels is None :
39+ labels = {}
40+ self ._labels = labels
41+
42+ @property
43+ def labels (self ):
44+ """User-assigned labels for sesions created by the pool.
45+
46+ :rtype: dict (str -> str)
47+ :returns: labels assigned by the user
48+ """
49+ return self ._labels
50+
3351 def bind (self , database ):
3452 """Associate the pool with a database.
3553
@@ -80,6 +98,16 @@ def clear(self):
8098 """
8199 raise NotImplementedError ()
82100
101+ def _new_session (self ):
102+ """Helper for concrete methods creating session instances.
103+
104+ :rtype: :class:`~google.cloud.spanner_v1.session.Session`
105+ :returns: new session instance.
106+ """
107+ if self .labels :
108+ return self ._database .session (labels = self .labels )
109+ return self ._database .session ()
110+
83111 def session (self , ** kwargs ):
84112 """Check out a session from the pool.
85113
@@ -115,11 +143,17 @@ class FixedSizePool(AbstractSessionPool):
115143 :type default_timeout: int
116144 :param default_timeout: default timeout, in seconds, to wait for
117145 a returned session.
146+
147+ :type labels: dict (str -> str) or None
148+ :param labels: (Optional) user-assigned labels for sessions created
149+ by the pool.
118150 """
119151 DEFAULT_SIZE = 10
120152 DEFAULT_TIMEOUT = 10
121153
122- def __init__ (self , size = DEFAULT_SIZE , default_timeout = DEFAULT_TIMEOUT ):
154+ def __init__ (self , size = DEFAULT_SIZE , default_timeout = DEFAULT_TIMEOUT ,
155+ labels = None ):
156+ super (FixedSizePool , self ).__init__ (labels = labels )
123157 self .size = size
124158 self .default_timeout = default_timeout
125159 self ._sessions = queue .Queue (size )
@@ -134,7 +168,7 @@ def bind(self, database):
134168 self ._database = database
135169
136170 while not self ._sessions .full ():
137- session = database . session ()
171+ session = self . _new_session ()
138172 session .create ()
139173 self ._sessions .put (session )
140174
@@ -198,9 +232,14 @@ class BurstyPool(AbstractSessionPool):
198232
199233 :type target_size: int
200234 :param target_size: max pool size
235+
236+ :type labels: dict (str -> str) or None
237+ :param labels: (Optional) user-assigned labels for sessions created
238+ by the pool.
201239 """
202240
203- def __init__ (self , target_size = 10 ):
241+ def __init__ (self , target_size = 10 , labels = None ):
242+ super (BurstyPool , self ).__init__ (labels = labels )
204243 self .target_size = target_size
205244 self ._database = None
206245 self ._sessions = queue .Queue (target_size )
@@ -224,11 +263,11 @@ def get(self):
224263 try :
225264 session = self ._sessions .get_nowait ()
226265 except queue .Empty :
227- session = self ._database . session ()
266+ session = self ._new_session ()
228267 session .create ()
229268 else :
230269 if not session .exists ():
231- session = self ._database . session ()
270+ session = self ._new_session ()
232271 session .create ()
233272 return session
234273
@@ -290,9 +329,15 @@ class PingingPool(AbstractSessionPool):
290329
291330 :type ping_interval: int
292331 :param ping_interval: interval at which to ping sessions.
332+
333+ :type labels: dict (str -> str) or None
334+ :param labels: (Optional) user-assigned labels for sessions created
335+ by the pool.
293336 """
294337
295- def __init__ (self , size = 10 , default_timeout = 10 , ping_interval = 3000 ):
338+ def __init__ (self , size = 10 , default_timeout = 10 , ping_interval = 3000 ,
339+ labels = None ):
340+ super (PingingPool , self ).__init__ (labels = labels )
296341 self .size = size
297342 self .default_timeout = default_timeout
298343 self ._delta = datetime .timedelta (seconds = ping_interval )
@@ -308,7 +353,7 @@ def bind(self, database):
308353 self ._database = database
309354
310355 for _ in xrange (self .size ):
311- session = database . session ()
356+ session = self . _new_session ()
312357 session .create ()
313358 self .put (session )
314359
@@ -330,7 +375,7 @@ def get(self, timeout=None): # pylint: disable=arguments-differ
330375
331376 if _NOW () > ping_after :
332377 if not session .exists ():
333- session = self ._database . session ()
378+ session = self ._new_session ()
334379 session .create ()
335380
336381 return session
@@ -373,7 +418,7 @@ def ping(self):
373418 self ._sessions .put ((ping_after , session ))
374419 break
375420 if not session .exists (): # stale
376- session = self ._database . session ()
421+ session = self ._new_session ()
377422 session .create ()
378423 # Re-add to queue with new expiration
379424 self .put (session )
@@ -400,13 +445,18 @@ class TransactionPingingPool(PingingPool):
400445
401446 :type ping_interval: int
402447 :param ping_interval: interval at which to ping sessions.
448+
449+ :type labels: dict (str -> str) or None
450+ :param labels: (Optional) user-assigned labels for sessions created
451+ by the pool.
403452 """
404453
405- def __init__ (self , size = 10 , default_timeout = 10 , ping_interval = 3000 ):
454+ def __init__ (self , size = 10 , default_timeout = 10 , ping_interval = 3000 ,
455+ labels = None ):
406456 self ._pending_sessions = queue .Queue ()
407457
408458 super (TransactionPingingPool , self ).__init__ (
409- size , default_timeout , ping_interval )
459+ size , default_timeout , ping_interval , labels = labels )
410460
411461 self .begin_pending_transactions ()
412462
0 commit comments