Merge lp:~stub/charms/trusty/postgresql/bug-1415490-max_prepared_transactions into lp:charms/trusty/postgresql

Proposed by Stuart Bishop
Status: Merged
Merged at revision: 118
Proposed branch: lp:~stub/charms/trusty/postgresql/bug-1415490-max_prepared_transactions
Merge into: lp:charms/trusty/postgresql
Diff against target: 665 lines (+105/-87)
7 files modified
Makefile (+3/-1)
config.yaml (+72/-64)
hooks/helpers.py (+2/-4)
hooks/hooks.py (+14/-15)
hooks/test_hooks.py (+0/-1)
templates/postgresql.conf.tmpl (+13/-0)
test.py (+1/-2)
To merge this branch: bzr merge lp:~stub/charms/trusty/postgresql/bug-1415490-max_prepared_transactions
Reviewer Review Type Date Requested Status
Barry Price Approve
Review Queue (community) automated testing Needs Fixing
charmers Pending
Review via email: mp+250611@code.launchpad.net

Description of the change

Add some tunables needed for Launchpad and Landscape deployments.

Also remove a config item that has done nothing for ages, and remove beta
comments about the no-longer beta PostgreSQL 9.4.

To post a comment you must log in.
120. By Stuart Bishop

Fix unittests

Revision history for this message
Review Queue (review-queue) wrote :

This items has failed automated testing! Results available here http://reports.vapour.ws/charm-tests/charm-bundle-test-11056-results

review: Needs Fixing (automated testing)
121. By Stuart Bishop

delint

Revision history for this message
Review Queue (review-queue) wrote :

This items has failed automated testing! Results available here http://reports.vapour.ws/charm-tests/charm-bundle-test-11057-results

review: Needs Fixing (automated testing)
122. By Stuart Bishop

delint

Revision history for this message
Review Queue (review-queue) wrote :

This items has failed automated testing! Results available here http://reports.vapour.ws/charm-tests/charm-bundle-test-11059-results

review: Needs Fixing (automated testing)
Revision history for this message
Review Queue (review-queue) wrote :

This items has failed automated testing! Results available here http://reports.vapour.ws/charm-tests/charm-bundle-test-11094-results

review: Needs Fixing (automated testing)
Revision history for this message
Review Queue (review-queue) wrote :

This items has failed automated testing! Results available here http://reports.vapour.ws/charm-tests/charm-bundle-test-11099-results

review: Needs Fixing (automated testing)
123. By Stuart Bishop

Checkpoint tuning options

Revision history for this message
Barry Price (barryprice) wrote :

Looks good to me, +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Makefile'
2--- Makefile 2014-10-24 06:31:15 +0000
3+++ Makefile 2015-03-12 10:18:52 +0000
4@@ -34,6 +34,7 @@
5 trial test.PG91Tests
6 trial test.PG92Tests
7 trial test.PG93Tests
8+ trial test.PG94Tests
9
10 integration_test_91:
11 @echo "PostgreSQL 9.1 integration tests, ${SERIES}"
12@@ -48,13 +49,14 @@
13 trial test.PG93Tests
14
15 integration_test_94:
16- @echo "PostgreSQL 9.4 (beta) integration tests, ${SERIES}"
17+ @echo "PostgreSQL 9.4 integration tests, ${SERIES}"
18 trial test.PG94Tests
19
20 lint:
21 @echo "Lint check (flake8)"
22 @flake8 -v \
23 --exclude hooks/charmhelpers,hooks/_trial_temp \
24+ --ignore=E402 \
25 hooks testing tests test.py
26
27 sync:
28
29=== modified file 'config.yaml'
30--- config.yaml 2015-02-11 21:05:42 +0000
31+++ config.yaml 2015-03-12 10:18:52 +0000
32@@ -2,7 +2,7 @@
33 admin_addresses:
34 default: ""
35 type: string
36- description: |
37+ description: >
38 A comma-separated list of IP Addresses (or single IP) admin tools like
39 pgAdmin3 will connect from, this is most useful for developers running
40 juju in local mode who need to connect tools like pgAdmin to a postgres.
41@@ -12,14 +12,14 @@
42 locale:
43 default: "C"
44 type: string
45- description: |
46+ description: >
47 Locale of service, defining language, default collation order,
48 and default formatting of numbers, currency, dates & times. Can only be
49 set when deploying the first unit of a service.
50 encoding:
51 default: "UTF-8"
52 type: string
53- description: |
54+ description: >
55 Default encoding used to store text in this service. Can only be
56 set when deploying the first unit of a service.
57 extra-packages:
58@@ -29,23 +29,12 @@
59 dumpfile_location:
60 default: "None"
61 type: string
62- description: |
63+ description: >
64 Path to a dumpfile to load into DB when service is initiated.
65- config_change_command:
66- default: "reload"
67- type: string
68- description: |
69- The command to run whenever config has changed. Accepted values
70- are "reload" or "restart" - any other value will mean neither is
71- executed after a config change (which may be desired, if you're
72- running a production server and would rather handle these out of
73- band). Note that postgresql will still need to be reloaded
74- whenever authentication and access details are updated, so
75- disabling either doesn't mean PostgreSQL will never be reloaded.
76 version:
77 default: null
78 type: string
79- description: |
80+ description: >
81 Version of PostgreSQL that we want to install. Supported versions
82 are "9.1", "9.2", "9.3". The default version for the deployed Ubuntu
83 release is used when the version is not specified.
84@@ -65,6 +54,13 @@
85 default: 100
86 type: int
87 description: Maximum number of connections to allow to the PG database
88+ max_prepared_transactions:
89+ default: 0
90+ type: int
91+ description: >
92+ Maximum number of prepared two phase commit transactions, waiting
93+ to be committed. Defaults to 0. as using two phase commit without
94+ a process to monitor and resolve lost transactions is dangerous.
95 ssl:
96 default: "True"
97 type: string
98@@ -72,7 +68,7 @@
99 log_min_duration_statement:
100 default: -1
101 type: int
102- description: |
103+ description: >
104 -1 is disabled, 0 logs all statements
105 and their durations, > 0 logs only
106 statements running at least this number
107@@ -92,7 +88,7 @@
108 log_temp_files:
109 default: "-1"
110 type: string
111- description: |
112+ description: >
113 Log creation of temporary files larger than the threshold.
114 -1 disables the feature, 0 logs all temporary files, or specify
115 the threshold size with an optional unit (eg. "512KB", default
116@@ -131,13 +127,13 @@
117 autovacuum:
118 default: True
119 type: boolean
120- description: |
121+ description: >
122 Autovacuum should almost always be running. If you want to turn this
123 off, you are probably following out of date documentation.
124 log_autovacuum_min_duration:
125 default: -1
126 type: int
127- description: |
128+ description: >
129 -1 disables, 0 logs all actions and their durations, > 0 logs only
130 actions running at least this number of milliseconds.
131 autovacuum_analyze_threshold:
132@@ -155,13 +151,13 @@
133 autovacuum_vacuum_cost_delay:
134 default: "20ms"
135 type: string
136- description: |
137+ description: >
138 Default vacuum cost delay for autovacuum, in milliseconds;
139 -1 means use vacuum_cost_delay
140 search_path:
141 default: "\"$user\",public"
142 type: string
143- description: |
144+ description: >
145 Comma separated list of schema names for
146 the default SQL search path.
147 standard_conforming_strings:
148@@ -171,22 +167,21 @@
149 hot_standby:
150 default: False
151 type: boolean
152- description: |
153- DEPRECATED.
154+ description: >
155 Hot standby or warm standby. When True, queries can be run against
156 the database when in recovery or standby mode (ie. replicated).
157 Overridden when service contains multiple units.
158 hot_standby_feedback:
159 default: False
160 type: boolean
161- description: |
162+ description: >
163 Hot standby feedback, informing a master about in progress
164 transactions on a streaming hot standby and allowing the master to
165 defer cleanup and avoid query cancelations on the hot standby.
166 wal_level:
167 default: minimal
168 type: string
169- description: |
170+ description: >
171 'minimal', 'archive' or 'hot_standby'. Defines how much information
172 is written to the WAL. Set to 'minimal' for stand alone databases
173 and 'hot_standby' for replicated setups. Overridden by juju when
174@@ -194,7 +189,7 @@
175 max_wal_senders:
176 default: 0
177 type: int
178- description: |
179+ description: >
180 Maximum number of hot standbys that can connect using
181 streaming replication. Set this to the expected maximum number of
182 hot standby units to avoid unnecessary blocking and database restarts.
183@@ -202,7 +197,7 @@
184 wal_keep_segments:
185 default: 0
186 type: int
187- description: |
188+ description: >
189 Number of old WAL files to keep, providing a larger buffer for
190 streaming hot standbys to catch up from when lagged. Each WAL file
191 is 16MB in size. The WAL files are the buffer of how far a
192@@ -212,7 +207,7 @@
193 replicated_wal_keep_segments:
194 default: 5000
195 type: int
196- description: |
197+ description: >
198 Value of wal_keep_segments used when this service is replicated.
199 This setting only exists to provide a sane default when replication
200 is requested (so it doesn't fail) and nobody bothered to change the
201@@ -220,7 +215,7 @@
202 archive_mode:
203 default: False
204 type: boolean
205- description: |
206+ description: >
207 Enable archiving of WAL files using the command specified by
208 archive_command. If archive_mode is enabled and archive_command not
209 set, then archiving is deferred until archive_command is set and the
210@@ -228,25 +223,25 @@
211 archive_command:
212 default: ""
213 type: string
214- description: |
215+ description: >
216 Command used to archive WAL files when archive_mode is set and
217 wal_level > minimal.
218 work_mem:
219 default: "1MB"
220 type: string
221- description: |
222+ description: >
223 Working Memory.
224 Ignored unless 'performance_tuning' is set to 'manual'.
225 maintenance_work_mem:
226 default: "1MB"
227 type: string
228- description: |
229+ description: >
230 Maintenance working memory.
231 Ignored unless 'performance_tuning' is set to 'manual'.
232 performance_tuning:
233 default: "Mixed"
234 type: string
235- description: |
236+ description: >
237 Possible values here are "manual", "DW" (data warehouse),
238 "OLTP" (online transaction processing), "Web" (web application),
239 "Desktop" or "Mixed". When this is set to a value other than
240@@ -267,14 +262,14 @@
241 shared_buffers:
242 default: ""
243 type: string
244- description: |
245+ description: >
246 The amount of memory the database server uses for shared memory
247 buffers. This string should be of the format '###MB'.
248 Ignored unless 'performance_tuning' is set to 'manual'.
249 effective_cache_size:
250 default: ""
251 type: string
252- description: |
253+ description: >
254 Effective cache size is an estimate of how much memory is available for
255 disk caching within the database. (50% to 75% of system memory). This
256 string should be of the format '###MB'. Ignored unless
257@@ -282,52 +277,65 @@
258 default_statistics_target:
259 default: -1
260 type: int
261- description: |
262+ description: >
263 Sets the default statistics target for table columns without a
264 column-specific target set via ALTER TABLE SET STATISTICS.
265 Leave unchanged to use the server default, which in recent
266 releases is 100. Ignored unless 'performance_tuning' is 'manual'.
267 Larger values increase the time needed to do ANALYZE, but
268 might improve the quality of the planner's estimates.
269+ collapse_limit:
270+ default: -1
271+ type: int
272+ description: >
273+ Sets the from_collapse_limit and join_collapse_limit query planner
274+ options, controlling the maximum number of tables that can be joined
275+ before the turns off the table collapse query optimization.
276 temp_buffers:
277 default: "1MB"
278 type: string
279- description: |
280+ description: >
281 The maximum number of temporary buffers used by each database session.
282 wal_buffers:
283 default: "-1"
284 type: string
285- description: |
286+ description: >
287 min 32kB, -1 sets based on shared_buffers (change requires restart).
288 Ignored unless 'performance_tuning' is set to 'manual'.
289 checkpoint_segments:
290- default: 3
291+ default: 10
292 type: int
293- description: |
294+ description: >
295 in logfile segments, min 1, 16MB each.
296 Ignored unless 'performance_tuning' is set to 'manual'.
297+ checkpoint_completion_target:
298+ default: 0.9
299+ type: float
300+ description: >
301+ checkpoint target duration time, as a fraction of checkpoint_timeout.
302+ Range [0.0, 1.0].
303 checkpoint_timeout:
304 default: ""
305 type: string
306- description: |
307+ description: >
308 Maximum time between automatic WAL checkpoints. range '30s-1h'.
309 If left empty, the default postgresql value will be used.
310 fsync:
311 type: boolean
312 default: True
313- description: |
314+ description: >
315 Turns forced synchronization on/off. If fsync is turned off, database
316 failures are likely to involve database corruption and require
317 recreating the unit
318 synchronous_commit:
319 type: boolean
320 default: True
321- description: |
322+ description: >
323 Immediate fsync after commit.
324 full_page_writes:
325 type: boolean
326 default: True
327- description: |
328+ description: >
329 Recover from partial page writes.
330 random_page_cost:
331 default: 4.0
332@@ -336,7 +344,7 @@
333 extra_pg_auth:
334 type: string
335 default: ""
336- description: |
337+ description: >
338 A comma separated extra pg_hba.conf auth rules.
339 This will be written to the pg_hba.conf file, one line per rule.
340 Note that this should not be needed as db relations already create
341@@ -348,7 +356,7 @@
342 manual_replication:
343 type: boolean
344 default: False
345- description: |
346+ description: >
347 Enable or disable charm managed replication. When manual_replication
348 is True, the operator is responsible for maintaining recovery.conf
349 and performing any necessary database mirroring. The charm will
350@@ -372,7 +380,7 @@
351 nagios_context:
352 default: "juju"
353 type: string
354- description: |
355+ description: >
356 Used by the nrpe-external-master subordinate charm.
357 A string that will be prepended to instance name to set the host name
358 in nagios. So for instance the hostname would be something like:
359@@ -382,14 +390,14 @@
360 nagios_additional_servicegroups:
361 default: ""
362 type: string
363- description: |
364+ description: >
365 Used by the nrpe-external-master subordinate charm.
366 A comma-separated list of servicegroups to include along with
367 nagios_context when generating nagios service check configs.
368 This is useful for nagios installations where servicegroups
369 are used to apply special treatment to particular checks.
370 pgdg:
371- description: |
372+ description: >
373 Enable the PostgreSQL Global Development Group APT repository
374 (https://wiki.postgresql.org/wiki/Apt). This package source provides
375 official PostgreSQL packages for Ubuntu LTS releases beyond those
376@@ -397,13 +405,13 @@
377 type: boolean
378 default: false
379 install_sources:
380- description: |
381+ description: >
382 List of extra package sources, per charm-helpers standard.
383 YAML format.
384 type: string
385 default: null
386 install_keys:
387- description: |
388+ description: >
389 List of signing keys for install_sources package sources, per
390 charmhelpers standard. YAML format.
391 type: string
392@@ -411,12 +419,12 @@
393 extra_archives:
394 default: ""
395 type: string
396- description: |
397+ description: >
398 DEPRECATED & IGNORED. Use install_sources and install_keys.
399 advisory_lock_restart_key:
400 default: 765
401 type: int
402- description: |
403+ description: >
404 An advisory lock key used internally by the charm. You do not need
405 to change it unless it happens to conflict with an advisory lock key
406 being used by your applications.
407@@ -424,7 +432,7 @@
408 swiftwal_container_prefix:
409 type: string
410 default: null
411- description: |
412+ description: >
413 EXPERIMENTAL.
414 Swift container prefix for SwiftWAL to use. Must be set if any
415 SwiftWAL features are enabled. This will become a simple
416@@ -433,13 +441,13 @@
417 swiftwal_backup_schedule:
418 type: string
419 default: null
420- description: |
421+ description: >
422 EXPERIMENTAL.
423 Cron-formatted schedule for SwiftWAL database backups.
424 swiftwal_backup_retention:
425 type: int
426 default: 2
427- description: |
428+ description: >
429 EXPERIMENTAL.
430 Number of recent base backups to retain. You need enough space in
431 Swift for this many backups plus one more, as an old backup will only
432@@ -447,7 +455,7 @@
433 swiftwal_log_shipping:
434 type: boolean
435 default: false
436- description: |
437+ description: >
438 EXPERIMENTAL.
439 Archive WAL files into Swift. If swiftwal_backup_schedule is set,
440 allows point-in-time recovery and WAL files are removed
441@@ -474,7 +482,7 @@
442 wal_e_backup_schedule:
443 type: string
444 default: "13 0 * * *"
445- description: |
446+ description: >
447 EXPERIMENTAL.
448 Cron-formatted schedule for WAL-E database backups. If
449 wal_e_backup_schedule is unset, WAL files will never be removed from
450@@ -482,7 +490,7 @@
451 wal_e_backup_retention:
452 type: int
453 default: 2
454- description: |
455+ description: >
456 EXPERIMENTAL.
457 Number of recent base backups and WAL files to retain.
458 You need enough space for this many backups plus one more, as
459@@ -491,7 +499,7 @@
460 streaming_replication:
461 type: boolean
462 default: true
463- description: |
464+ description: >
465 Enable streaming replication. Normally, streaming replication is
466 always used, and any log shipping configured is used as a fallback.
467 Turning this off without configuring log shipping is an error.
468@@ -530,7 +538,7 @@
469 package_status:
470 default: "install"
471 type: string
472- description: |
473+ description: >
474 The status of service-affecting packages will be set to this
475 value in the dpkg database. Useful valid values are "install"
476 and "hold".
477@@ -538,13 +546,13 @@
478 metrics_target:
479 default: ""
480 type: string
481- description: |
482+ description: >
483 Destination for statsd-format metrics, format "host:port". If
484 not present and valid, metrics disabled.
485 metrics_prefix:
486 default: "dev.$UNIT.postgresql"
487 type: string
488- description: |
489+ description: >
490 Prefix for metrics. Special value $UNIT can be used to include the
491 name of the unit in the prefix.
492 metrics_sample_interval:
493
494=== modified file 'hooks/helpers.py'
495--- hooks/helpers.py 2012-10-01 14:10:14 +0000
496+++ hooks/helpers.py 2015-03-12 10:18:52 +0000
497@@ -17,8 +17,7 @@
498 'wait_for_machine',
499 'wait_for_page_contents',
500 'wait_for_relation',
501- 'wait_for_unit',
502- ]
503+ 'wait_for_unit']
504
505 from contextlib import contextmanager
506 import json
507@@ -26,8 +25,7 @@
508 from shelltoolbox import (
509 command,
510 run,
511- script_name,
512- )
513+ script_name)
514 import os
515 import tempfile
516 import time
517
518=== modified file 'hooks/hooks.py'
519--- hooks/hooks.py 2015-03-08 23:51:59 +0000
520+++ hooks/hooks.py 2015-03-12 10:18:52 +0000
521@@ -22,8 +22,7 @@
522 from charmhelpers import fetch
523 from charmhelpers.core import hookenv, host
524 from charmhelpers.core.hookenv import (
525- CRITICAL, ERROR, WARNING, INFO, DEBUG,
526- )
527+ CRITICAL, ERROR, WARNING, INFO, DEBUG)
528
529 try:
530 import psycopg2
531@@ -212,8 +211,8 @@
532 log("ERROR: {}".format(p.returncode), ERROR)
533 sys.exit(p.returncode)
534
535- raise subprocess.CalledProcessError(
536- p.returncode, command, '\n'.join(lines))
537+ raise subprocess.CalledProcessError(p.returncode, command,
538+ '\n'.join(lines))
539
540
541 def postgresql_is_running():
542@@ -447,7 +446,7 @@
543 open(template_file).read()).render(config_data)
544 host.write_file(
545 config_file, pg_config,
546- owner="postgres", group="postgres", perms=0600)
547+ owner="postgres", group="postgres", perms=0600)
548
549 # Create or update files included from postgresql.conf.
550 configure_log_destination(os.path.dirname(config_file))
551@@ -963,7 +962,7 @@
552 CRITICAL)
553
554 valid_workloads = [
555- 'dw', 'oltp', 'web', 'mixed', 'desktop', 'manual', 'auto']
556+ 'dw', 'oltp', 'web', 'mixed', 'desktop', 'manual', 'auto']
557 requested_workload = config_data['performance_tuning'].lower()
558 if requested_workload not in valid_workloads:
559 valid = False
560@@ -2148,9 +2147,10 @@
561
562 # Build the set of client relations that both the master and this
563 # unit have joined.
564- active_client_relations = set(
565- hookenv.relation_ids('db') + hookenv.relation_ids('db-admin')
566- ).intersection(set(client_relations.split()))
567+ possible_client_relations = set(hookenv.relation_ids('db') +
568+ hookenv.relation_ids('db-admin'))
569+ active_client_relations = possible_client_relations.intersection(
570+ set(client_relations.split()))
571
572 for client_relation in active_client_relations:
573 # We need to pull the credentials from the master unit's
574@@ -2513,16 +2513,15 @@
575 if len(relations) == 1 and 'nagios_hostname' in relations[0]:
576 nagios_hostname = relations[0]['nagios_hostname']
577 log("update_nrpe_checks: Obtained nagios_hostname ({}) "
578- "from nrpe-external-master relation.".format(
579- nagios_hostname))
580+ "from nrpe-external-master relation.".format(nagios_hostname))
581 else:
582 unit = hookenv.local_unit()
583 unit_name = unit.replace('/', '-')
584 nagios_hostname = "%s-%s" % (config_data['nagios_context'], unit_name)
585- log("update_nrpe_checks: Deduced nagios_hostname ({}) from charm config "
586- "(nagios_hostname not found in nrpe-external-master relation, or "
587- "wrong number of relations found)".format(
588- nagios_hostname))
589+ log("update_nrpe_checks: Deduced nagios_hostname ({}) from charm "
590+ "config (nagios_hostname not found in nrpe-external-master "
591+ "relation, or wrong number of relations "
592+ "found)".format(nagios_hostname))
593
594 nrpe_service_file = \
595 '/var/lib/nagios/export/service__{}_check_pgsql.cfg'.format(
596
597=== modified file 'hooks/test_hooks.py'
598--- hooks/test_hooks.py 2015-03-09 10:30:33 +0000
599+++ hooks/test_hooks.py 2015-03-12 10:18:52 +0000
600@@ -68,7 +68,6 @@
601 "encoding": "UTF-8",
602 "extra_packages": "",
603 "dumpfile_location": "None",
604- "config_change_command": "reload",
605 "version": "9.1",
606 "cluster_name": "main",
607 "listen_ip": "*",
608
609=== modified file 'templates/postgresql.conf.tmpl'
610--- templates/postgresql.conf.tmpl 2015-02-11 21:05:42 +0000
611+++ templates/postgresql.conf.tmpl 2015-03-12 10:18:52 +0000
612@@ -41,6 +41,9 @@
613 max_connections = {{max_connections}}
614 {% endif -%}
615
616+# Broken under all versions of Ubuntu, per Bug #1018307
617+ssl_renegotiation_limit=0
618+
619
620 #------------------------------------------------------------------------------
621 # RESOURCE USAGE (except WAL)
622@@ -58,6 +61,9 @@
623 {% if maintenance_work_mem != "" -%}
624 maintenance_work_mem = {{maintenance_work_mem}}
625 {% endif -%}
626+{% if max_prepared_transactions != "" -%}
627+max_prepared_transactions = {{max_prepared_transactions}}
628+{% endif -%}
629
630
631 #------------------------------------------------------------------------------
632@@ -70,6 +76,9 @@
633 {% if checkpoint_segments != "" -%}
634 checkpoint_segments = {{checkpoint_segments}}
635 {% endif -%}
636+{% if checkpoint_completion_target != "" -%}
637+checkpoint_completion_target = {{checkpoint_completion_target}}
638+{% endif -%}
639 {% if checkpoint_timeout != "" -%}
640 checkpoint_timeout = {{checkpoint_timeout}}
641 {% endif -%}
642@@ -97,6 +106,10 @@
643 {% if default_statistics_target != -1 -%}
644 default_statistics_target = {{default_statistics_target}}
645 {% endif -%}
646+{% if collapse_limit != -1 -%}
647+from_collapse_limit = {{collapse_limit}}
648+join_collapse_limit = {{collapse_limit}}
649+{% endif -%}
650
651
652 #------------------------------------------------------------------------------
653
654=== modified file 'test.py'
655--- test.py 2014-12-04 17:49:22 +0000
656+++ test.py 2015-03-12 10:18:52 +0000
657@@ -948,8 +948,7 @@
658 class PG94Tests(
659 PostgreSQLCharmBaseTestCase,
660 testtools.TestCase, fixtures.TestWithFixtures):
661- # 9.4 is still in beta, with packages only available in the PGDG
662- # archive.
663+ # 9.4 is released, but packages are only available in the PGDG archive.
664 VERSION = '9.4'
665 PGDG = True
666

Subscribers

People subscribed via source and target branches

to all changes: