Merge ~cjwatson/launchpad:remove-activity-cols into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 90b2a3b6bb1961b9718e68a57b612cd2e1745fd8
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:remove-activity-cols
Merge into: launchpad:master
Diff against target: 336 lines (+34/-75)
9 files modified
database/schema/preflight.py (+8/-18)
database/schema/unautovacuumable.py (+2/-4)
lib/lp/services/database/__init__.py (+0/-6)
lib/lp/services/looptuner.py (+4/-8)
lib/lp/testing/pgsql.py (+3/-5)
test_on_merge.py (+1/-4)
utilities/pgkillactive.py (+4/-9)
utilities/pgkillidle.py (+5/-10)
utilities/pgmassacre.py (+7/-11)
Reviewer Review Type Date Requested Status
Jürgen Gmach Approve
Review via email: mp+445547@code.launchpad.net

Commit message

Remove lp.services.database.activity_cols

Description of the change

This was used to handle some changes in PostgreSQL 9.2 (https://www.postgresql.org/docs/9.2/release-9-2.html#AEN114556). Now that we require at least PostgreSQL 10, it just makes the relevant queries harder to read.

To post a comment you must log in.
Revision history for this message
Jürgen Gmach (jugmac00) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/database/schema/preflight.py b/database/schema/preflight.py
2index e05e1c8..5ac9309 100755
3--- a/database/schema/preflight.py
4+++ b/database/schema/preflight.py
5@@ -22,7 +22,6 @@ import psycopg2
6
7 import upgrade
8 from dbcontroller import DBController, streaming_sync
9-from lp.services.database import activity_cols
10 from lp.services.database.sqlbase import ISOLATION_LEVEL_AUTOCOMMIT, sqlvalues
11 from lp.services.scripts import logger, logger_options
12 from replication.helpers import Node
13@@ -142,10 +141,9 @@ class DatabasePreflight:
14 FROM pg_stat_activity
15 WHERE
16 datname=current_database()
17- AND %(pid)s <> pg_backend_pid()
18+ AND pid <> pg_backend_pid()
19 GROUP BY datname, usename
20 """
21- % activity_cols(cur)
22 )
23 for datname, usename, num_connections in cur.fetchall():
24 if usename in SYSTEM_USERS:
25@@ -177,18 +175,15 @@ class DatabasePreflight:
26 for node in self.lpmain_nodes:
27 cur = node.con.cursor()
28 cur.execute(
29- (
30- """
31+ """
32 SELECT datname, usename, COUNT(*) AS num_connections
33 FROM pg_stat_activity
34 WHERE
35 datname=current_database()
36- AND %(pid)s <> pg_backend_pid()
37- AND usename IN %%s
38+ AND pid <> pg_backend_pid()
39+ AND usename IN %s
40 GROUP BY datname, usename
41 """
42- % activity_cols(cur)
43- )
44 % sqlvalues(FRAGILE_USERS)
45 )
46 for datname, usename, num_connections in cur.fetchall():
47@@ -376,19 +371,14 @@ class KillConnectionsPreflight(DatabasePreflight):
48 for node in nodes:
49 cur = node.con.cursor()
50 cur.execute(
51- (
52- """
53- SELECT
54- %(pid)s, datname, usename,
55- pg_terminate_backend(%(pid)s)
56+ """
57+ SELECT pid, datname, usename, pg_terminate_backend(pid)
58 FROM pg_stat_activity
59 WHERE
60 datname=current_database()
61- AND %(pid)s <> pg_backend_pid()
62- AND usename NOT IN %%s
63+ AND pid <> pg_backend_pid()
64+ AND usename NOT IN %s
65 """
66- % activity_cols(cur)
67- )
68 % sqlvalues(SYSTEM_USERS)
69 )
70 for pid, datname, usename, ignored in cur.fetchall():
71diff --git a/database/schema/unautovacuumable.py b/database/schema/unautovacuumable.py
72index 69ab428..d888726 100755
73--- a/database/schema/unautovacuumable.py
74+++ b/database/schema/unautovacuumable.py
75@@ -21,7 +21,6 @@ import sys
76 import time
77 from optparse import OptionParser
78
79-from lp.services.database import activity_cols
80 from lp.services.database.sqlbase import ISOLATION_LEVEL_AUTOCOMMIT, connect
81 from lp.services.scripts import db_options, logger, logger_options
82
83@@ -69,12 +68,11 @@ def main():
84 time.sleep(0.6)
85 cur.execute(
86 """
87- SELECT %(pid)s FROM pg_stat_activity
88+ SELECT pid FROM pg_stat_activity
89 WHERE
90 datname=current_database()
91- AND %(query)s LIKE 'autovacuum: %%'
92+ AND query LIKE 'autovacuum: %'
93 """
94- % activity_cols(cur)
95 )
96 autovacuums = [row[0] for row in cur.fetchall()]
97 num_autovacuums = len(autovacuums)
98diff --git a/lib/lp/services/database/__init__.py b/lib/lp/services/database/__init__.py
99index 015a6f4..a6d4eb1 100644
100--- a/lib/lp/services/database/__init__.py
101+++ b/lib/lp/services/database/__init__.py
102@@ -4,7 +4,6 @@
103 """The lp.services.database package."""
104
105 __all__ = [
106- "activity_cols",
107 "read_transaction",
108 "write_transaction",
109 ]
110@@ -19,11 +18,6 @@ from lp.services.database.sqlbase import reset_store
111 RETRY_ATTEMPTS = 3
112
113
114-def activity_cols(cur):
115- """Adapt pg_stat_activity column names for the current DB server."""
116- return {"query": "query", "pid": "pid"}
117-
118-
119 def retry_transaction(func):
120 """Decorator used to retry database transaction failures.
121
122diff --git a/lib/lp/services/looptuner.py b/lib/lp/services/looptuner.py
123index 766a765..c6cecb0 100644
124--- a/lib/lp/services/looptuner.py
125+++ b/lib/lp/services/looptuner.py
126@@ -18,7 +18,6 @@ from six import reraise
127 from zope.interface import Interface, implementer
128
129 import lp.services.scripts
130-from lp.services.database import activity_cols
131 from lp.services.database.interfaces import IPrimaryStore
132
133
134@@ -333,21 +332,18 @@ class DBLoopTuner(LoopTuner):
135 while not self._isTimedOut():
136 results = list(
137 store.execute(
138- (
139- """
140+ """
141 SELECT
142 CURRENT_TIMESTAMP - xact_start,
143- %(pid)s,
144+ pid,
145 usename,
146 datname,
147- %(query)s
148+ query
149 FROM activity()
150- WHERE xact_start < CURRENT_TIMESTAMP - interval '%%f seconds'
151+ WHERE xact_start < CURRENT_TIMESTAMP - interval '%f seconds'
152 AND datname = current_database()
153 ORDER BY xact_start LIMIT 4
154 """
155- % activity_cols(store)
156- )
157 % self.long_running_transaction
158 ).get_all()
159 )
160diff --git a/lib/lp/testing/pgsql.py b/lib/lp/testing/pgsql.py
161index 68aa01f..4f9b92e 100644
162--- a/lib/lp/testing/pgsql.py
163+++ b/lib/lp/testing/pgsql.py
164@@ -18,7 +18,6 @@ from breezy.lock import WriteLock
165 from psycopg2.errors import InvalidCatalogName, ObjectInUse
166
167 from lp.services.config import config
168-from lp.services.database import activity_cols
169
170
171 class ConnectionWrapper:
172@@ -439,11 +438,10 @@ rw_main_standby: dbname=%s
173 cur = con.cursor()
174 cur.execute(
175 """
176- SELECT pg_terminate_backend(%(pid)s)
177+ SELECT pg_terminate_backend(pid)
178 FROM pg_stat_activity
179- WHERE %(pid)s <> pg_backend_pid() AND datname=%%s
180- """
181- % activity_cols(cur),
182+ WHERE pid <> pg_backend_pid() AND datname=%s
183+ """,
184 [self.dbname],
185 )
186 except psycopg2.DatabaseError:
187diff --git a/test_on_merge.py b/test_on_merge.py
188index 99f343d..05fe1cb 100755
189--- a/test_on_merge.py
190+++ b/test_on_merge.py
191@@ -16,8 +16,6 @@ from subprocess import PIPE, STDOUT, Popen
192
193 import psycopg2
194
195-from lp.services.database import activity_cols
196-
197 # The TIMEOUT setting (expressed in seconds) affects how long a test will run
198 # before it is deemed to be hung, and then appropriately terminated.
199 # It's principal use is preventing a PQM job from hanging indefinitely and
200@@ -71,12 +69,11 @@ def setup_test_database():
201 for loop in range(2):
202 cur.execute(
203 """
204- SELECT usename, %(query)s
205+ SELECT usename, query
206 FROM pg_stat_activity
207 WHERE datname IN (
208 'launchpad_dev', 'launchpad_ftest_template', 'launchpad_ftest')
209 """
210- % activity_cols(cur)
211 )
212 results = list(cur.fetchall())
213 if not results:
214diff --git a/utilities/pgkillactive.py b/utilities/pgkillactive.py
215index d06c481..c8e5e44 100755
216--- a/utilities/pgkillactive.py
217+++ b/utilities/pgkillactive.py
218@@ -17,8 +17,6 @@ from optparse import OptionParser
219
220 import psycopg2
221
222-from lp.services.database import activity_cols
223-
224
225 def main():
226 parser = OptionParser()
227@@ -75,15 +73,12 @@ def main():
228 con = psycopg2.connect(options.connect_string)
229 cur = con.cursor()
230 cur.execute(
231- (
232- """
233- SELECT usename, %(pid)s, backend_start, xact_start
234+ """
235+ SELECT usename, pid, backend_start, xact_start
236 FROM pg_stat_activity
237- WHERE xact_start < CURRENT_TIMESTAMP - '%%d seconds'::interval %%s
238- ORDER BY %(pid)s
239+ WHERE xact_start < CURRENT_TIMESTAMP - '%d seconds'::interval %s
240+ ORDER BY pid
241 """
242- % activity_cols(cur)
243- )
244 % (options.max_seconds, user_match_sql),
245 options.users,
246 )
247diff --git a/utilities/pgkillidle.py b/utilities/pgkillidle.py
248index 6dab70b..9985ae8 100755
249--- a/utilities/pgkillidle.py
250+++ b/utilities/pgkillidle.py
251@@ -17,8 +17,6 @@ from optparse import OptionParser
252
253 import psycopg2
254
255-from lp.services.database import activity_cols
256-
257
258 def main():
259 parser = OptionParser()
260@@ -71,16 +69,13 @@ def main():
261 con = psycopg2.connect(options.connect_string)
262 cur = con.cursor()
263 cur.execute(
264- (
265- """
266- SELECT usename, %(pid)s, backend_start, query_start
267+ """
268+ SELECT usename, pid, backend_start, query_start
269 FROM pg_stat_activity
270- WHERE %(query)s = '<IDLE> in transaction'
271- AND query_start < CURRENT_TIMESTAMP - '%%d seconds'::interval %%s
272- ORDER BY %(pid)s
273+ WHERE query = '<IDLE> in transaction'
274+ AND query_start < CURRENT_TIMESTAMP - '%d seconds'::interval %s
275+ ORDER BY pid
276 """
277- % activity_cols(cur)
278- )
279 % (options.max_idle_seconds, ignore_sql),
280 options.ignore,
281 )
282diff --git a/utilities/pgmassacre.py b/utilities/pgmassacre.py
283index deb5793..0939268 100755
284--- a/utilities/pgmassacre.py
285+++ b/utilities/pgmassacre.py
286@@ -24,7 +24,6 @@ import psycopg2
287 from psycopg2.extensions import make_dsn, parse_dsn
288
289 from lp.services.config import config, dbconfig
290-from lp.services.database import activity_cols
291
292
293 def connect(dbname="template1"):
294@@ -78,11 +77,10 @@ def still_open(database, max_wait=120):
295 """
296 SELECT TRUE FROM pg_stat_activity
297 WHERE
298- datname=%%s
299- AND %(pid)s != pg_backend_pid()
300+ datname=%s
301+ AND pid != pg_backend_pid()
302 LIMIT 1
303- """
304- % activity_cols(cur),
305+ """,
306 [database],
307 )
308 if cur.fetchone() is None:
309@@ -122,11 +120,10 @@ def massacre(database):
310 # Terminate open connections.
311 cur.execute(
312 """
313- SELECT %(pid)s, pg_terminate_backend(%(pid)s)
314+ SELECT pid, pg_terminate_backend(pid)
315 FROM pg_stat_activity
316- WHERE datname=%%s AND %(pid)s <> pg_backend_pid()
317- """
318- % activity_cols(cur),
319+ WHERE datname=%s AND pid <> pg_backend_pid()
320+ """,
321 [database],
322 )
323 for pid, success in cur.fetchall():
324@@ -212,11 +209,10 @@ def report_open_connections(database):
325 """
326 SELECT usename, datname, count(*)
327 FROM pg_stat_activity
328- WHERE %(pid)s != pg_backend_pid()
329+ WHERE pid != pg_backend_pid()
330 GROUP BY usename, datname
331 ORDER BY datname, usename
332 """
333- % activity_cols(cur)
334 )
335 for usename, datname, num_connections in cur.fetchall():
336 print(

Subscribers

People subscribed via source and target branches

to status/vote changes: