Revision: 15465 http://trac.calendarserver.org//changeset/15465 Author: cdaboo@apple.com Date: 2016-03-01 11:40:29 -0800 (Tue, 01 Mar 2016) Log Message: ----------- Add TxnTimeoutSeconds options to config.Postgres settings. Modified Paths: -------------- CalendarServer/trunk/calendarserver/tap/util.py CalendarServer/trunk/twistedcaldav/stdconfig.py CalendarServer/trunk/txdav/base/datastore/dbapiclient.py CalendarServer/trunk/txdav/base/datastore/subpostgres.py Modified: CalendarServer/trunk/calendarserver/tap/util.py =================================================================== --- CalendarServer/trunk/calendarserver/tap/util.py 2016-02-15 19:56:54 UTC (rev 15464) +++ CalendarServer/trunk/calendarserver/tap/util.py 2016-03-01 19:40:29 UTC (rev 15465) @@ -151,6 +151,7 @@ socketDir=config.Postgres.SocketDirectory, socketName=config.Postgres.SocketName, listenAddresses=config.Postgres.ListenAddresses, + txnTimeoutSeconds=config.Postgres.TxnTimeoutSeconds, sharedBuffers=config.Postgres.SharedBuffers, maxConnections=config.Postgres.MaxConnections, options=config.Postgres.Options, Modified: CalendarServer/trunk/twistedcaldav/stdconfig.py =================================================================== --- CalendarServer/trunk/twistedcaldav/stdconfig.py 2016-02-15 19:56:54 UTC (rev 15464) +++ CalendarServer/trunk/twistedcaldav/stdconfig.py 2016-03-01 19:40:29 UTC (rev 15465) @@ -1017,6 +1017,7 @@ "SocketDirectory": "", "SocketName": "", "ListenAddresses": [], + "TxnTimeoutSeconds": 30, # Time out transactions "SharedBuffers": 0, # BuffersToConnectionsRatio * MaxConnections # Note: don't set this, it will be computed dynamically # See _updateMultiProcess( ) below for details Modified: CalendarServer/trunk/txdav/base/datastore/dbapiclient.py =================================================================== --- CalendarServer/trunk/txdav/base/datastore/dbapiclient.py 2016-02-15 19:56:54 UTC (rev 15464) +++ CalendarServer/trunk/txdav/base/datastore/dbapiclient.py 2016-03-01 19:40:29 UTC (rev 15465) @@ -199,7 +199,7 @@ are then used to create the actual parameters for each module. """ - def __init__(self, endpoint=None, user=None, password=None, database=None): + def __init__(self, endpoint=None, user=None, password=None, database=None, **kwargs): """ @param endpoint: endpoint string describing the connection @type endpoint: L{str} @@ -250,7 +250,7 @@ def connect(self, label="<unlabeled>"): connection = self.dbModule.connect(*self.connectArgs, **self.connectKw) w = self.wrapper(connection, label) - self.preflight(w) + self.preflight(w, **self.connectKw) return w @@ -289,6 +289,8 @@ dbkwargs = {} if params.port: dbkwargs["host"] = "{}:{}".format(params.host, params.port) + if "txnTimeoutSeconds" in kwargs: + dbkwargs["txnTimeoutSeconds"] = kwargs["txnTimeoutSeconds"] return DBAPIConnector(postgres, postgresPreflight, dsn, **dbkwargs) @@ -322,6 +324,8 @@ dbkwargs["host"] = params.host if params.port: dbkwargs["port"] = int(params.port) + if "txnTimeoutSeconds" in kwargs: + dbkwargs["txnTimeoutSeconds"] = kwargs["txnTimeoutSeconds"] return DBAPIConnector(dbmodule, pg8000Preflight, **dbkwargs) @@ -358,7 +362,7 @@ -def oraclePreflight(connection): +def oraclePreflight(connection, **kwargs): """ Pre-flight function for Oracle connections: set the timestamp format to be something closely resembling our default assumption from Postgres. @@ -377,7 +381,7 @@ -def postgresPreflight(connection): +def postgresPreflight(connection, **kwargs): """ Pre-flight function for PostgreSQL connections: enable standard conforming strings, and set a non-infinite statement timeout. @@ -390,14 +394,14 @@ # vulnerable to certain types of SQL injection. c.execute("set standard_conforming_strings=on") - # Abort any second that takes more than 30 seconds (30000ms) to + # Abort any second that takes more than 30 seconds (default) to # execute. This is necessary as a temporary workaround since it's # hypothetically possible that different database operations could # block each other, while executing SQL in the same process (in the # same thread, since SQL executes in the main thread now). It's # preferable to see some exceptions while we're in this state than to # have the entire worker process hang. - c.execute("set statement_timeout=30000") + c.execute("set statement_timeout={}".format(kwargs.get("txnTimeoutSeconds", 30) * 1000)) # pgdb (as per DB-API 2.0) automatically puts the connection into a # 'executing a transaction' state when _any_ statement is executed on @@ -409,14 +413,14 @@ -def pg8000Preflight(connection): +def pg8000Preflight(connection, **kwargs): """ Pre-flight function for pg8000/PostgreSQL connections: setup type mappings in addition to the normal postgres preflight. """ # Do the base PostgreSQL preflight - postgresPreflight(connection) + postgresPreflight(connection, **kwargs) # Patch pg8000 behavior to match what we need wrt text processing def my_text_out(v): Modified: CalendarServer/trunk/txdav/base/datastore/subpostgres.py =================================================================== --- CalendarServer/trunk/txdav/base/datastore/subpostgres.py 2016-02-15 19:56:54 UTC (rev 15464) +++ CalendarServer/trunk/txdav/base/datastore/subpostgres.py 2016-03-01 19:40:29 UTC (rev 15465) @@ -182,8 +182,11 @@ logDirectory="", socketDir="", socketName="", - listenAddresses=[], sharedBuffers=30, - maxConnections=20, options=[], + listenAddresses=[], + txnTimeoutSeconds=30, + sharedBuffers=30, + maxConnections=20, + options=[], testMode=False, uid=None, gid=None, spawnedDBUser="caldav", @@ -259,6 +262,8 @@ self.port = None self.listenAddresses = [] + self.txnTimeoutSeconds = txnTimeoutSeconds + self.testMode = testMode self.sharedBuffers = max(sharedBuffers if not testMode else 16, 16) self.maxConnections = maxConnections if not testMode else 8 @@ -342,6 +347,7 @@ kwargs["user"] = self.spawnedDBUser elif self.uid is not None: kwargs["user"] = pwd.getpwuid(self.uid).pw_name + kwargs["txnTimeoutSeconds"] = self.txnTimeoutSeconds return DBAPIConnector.connectorFor("postgres", **kwargs)
participants (1)
-
source_changes@macosforge.org