File indexing completed on 2026-04-10 08:39:06
0001 """
0002 pool for DBProxies
0003
0004 """
0005
0006 try:
0007 from Queue import Queue
0008 except ImportError:
0009 from queue import Queue
0010
0011 import os
0012 import random
0013 import time
0014 from contextlib import contextmanager
0015 from threading import Lock
0016
0017 from pandacommon.pandalogger.PandaLogger import PandaLogger
0018
0019 from pandaserver.config import panda_config
0020 from pandaserver.taskbuffer import OraDBProxy as DBProxy
0021 from pandaserver.taskbuffer.ConBridge import ConBridge
0022
0023
0024 _logger = PandaLogger().getLogger("DBProxyPool")
0025
0026
0027 class DBProxyPool:
0028 def __init__(self, dbhost, dbpasswd, nConnection, useTimeout=False, dbProxyClass=None):
0029
0030 self.lock = Lock()
0031 self.callers = []
0032
0033 _logger.debug("init")
0034 self.proxyList = Queue(nConnection)
0035 self.connList = []
0036 for i in range(nConnection):
0037 _logger.debug(f"connect -> {i} ")
0038 if dbProxyClass is not None:
0039 proxy = dbProxyClass()
0040 elif useTimeout and hasattr(panda_config, "usedbtimeout") and panda_config.usedbtimeout is True:
0041 """
0042 ConBridge allows having database interactions in separate processes and killing them independently when interactions are stalled.
0043 This avoids clogged httpd processes due to stalled database accesses.
0044 """
0045 proxy = ConBridge()
0046 else:
0047 proxy = DBProxy.DBProxy()
0048 self.connList.append(proxy)
0049 iTry = 0
0050 while True:
0051 if proxy.connect(dbhost, dbpasswd, dbtimeout=60):
0052 break
0053 iTry += 1
0054 _logger.debug(f"failed -> {i} : try {iTry}")
0055 time.sleep(random.randint(60, 90))
0056 self.proxyList.put(proxy)
0057 time.sleep(1)
0058
0059 self.pid = os.getpid()
0060 _logger.debug("ready")
0061
0062
0063 def getProxy(self):
0064
0065 start_time = time.time()
0066
0067
0068 proxy = self.proxyList.get()
0069
0070 proxy.wakeUp()
0071
0072 end_time = time.time()
0073 elapsed_time = end_time - start_time
0074 _logger.debug(f"Getting proxy took: {elapsed_time} seconds")
0075
0076 return proxy
0077
0078
0079 def putProxy(self, proxy):
0080 self.proxyList.put(proxy)
0081
0082
0083 @contextmanager
0084 def get(self):
0085 proxy = self.getProxy()
0086 try:
0087 yield proxy
0088 finally:
0089 self.putProxy(proxy)
0090
0091
0092 def cleanup(self):
0093 _logger.debug("cleanup start")
0094 [c.cleanup() for c in self.connList]
0095 _logger.debug("cleanup done")