Django app that resets django.contrib.postgres caches that store postgres extensions OIDs
Project description
django-postgres-hot-upgrade
Let Django clear its PostgreSQL extensions OIDs cache, making it possible to update the PostgreSQL version to a new major version on the fly.
The how
$ pip install django-postgres-hot-upgrade
INSTALLED_APPS = [
...,
# Warning: django_postgres_hot_upgrade requires to be placed before
# django.contrib.postgres otherwise it will not work.
'django_postgres_hot_upgrade',
'django.contrib.postgres',
...,
]
The why
PostgreSQL keeps internal ids of for various objects (OIDs). This includes loaded extentions. In order to interact with those extensions, Django needs to know these IODs, so it loads them and, in order to avoid unneeded requests, it caches them in memory for the duration of the process.
Several PostgreSQL servers running the same version of PostgreSQL will have consistent OIDs but when you upgrade, OIDs can change. If one uses a PostgreSQL load balancer such as pgbouncer or pgpool, one could be tempted to migrate between major PostgreSQL versions on the fly, avoinding downtime. Indeed, for sufficiently recent versions of PostgreSQL, this would work, apart from the OID problem: if OIDs change, Django needs to update its cache.
django_postgres_hot_upgrade
memorizes the postgres version of the server after each
connection. When the version is updated, it clears the internal Django OIDs cache,
forcing Django to fetch the new values.
The rest
Compatibility: Please refer to versions of Python and Django tested in tox.ini.
License: MIT
Code of Conduct: This project is placed under the Contributor
Coveneant. Please
report any abuse to joachim.jablon at people-doc.com
.
[Maintainers] The ugly part
Apart from its unit tests, this package has an integration test. In order to test the feature, we need to simulate a change of OIDs caused by a live update from PG10 to PG12 in a controlled CI environment. This is the most fragile part of the lib, and the most likely to break in the future. Here's what you need to know:
docker-compose.yml
define two databasespostgres10
andpostgres12
listening on 5432 and 5433 respectively.tests/django_settings.py
define adefault
database using libpq envvars. Note that in the settings, we requests the tests to run on the normal database instead of dedicatedtest_<foo>
database.- The OIDs are created by Postgres when installing the extensions. This happens in
tests/migrations/0001_initial.py
. TheDJANGO_REVERSE_OPERATIONS
env var controls the order of the 2 extensions creation. Running the PG10 migration in normal order and the PG12 migration in reverse order ensures the OIDs will be different. - The
runtests
script ensure the migrations run on both databases in the decided order, then launches the test. Without this, the integration test would likely fail because the OIDs would be the same in the two databases. tox
callsruntests
.- GitHub Actions call
tox
.
The following work to launch tests locally:
- run
tox
orruntests
on fresh databases - run
pytests
if you know the OIDs are already properly set on the 2 databases
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-postgres-hot-upgrade-1.1.0.tar.gz
.
File metadata
- Download URL: django-postgres-hot-upgrade-1.1.0.tar.gz
- Upload date:
- Size: 7.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cdf511e286273ccf3a537099c0f1a8c54b2b800b977f56fb8ec1b017d597595f |
|
MD5 | f48a57717d002102f787954e6ce4d961 |
|
BLAKE2b-256 | c404f180cf9343e5a610d53b294744602580d3d00319ecae9b5c131033b53933 |
File details
Details for the file django_postgres_hot_upgrade-1.1.0-py3-none-any.whl
.
File metadata
- Download URL: django_postgres_hot_upgrade-1.1.0-py3-none-any.whl
- Upload date:
- Size: 5.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a9216705016e23feb2c7fecffbf729fb03f2bb051daf95ea5136a3c28d65a1f4 |
|
MD5 | 3fc7ed2ba6d2e9b41ec28d48105f41d1 |
|
BLAKE2b-256 | 81aa015ae781d202655e1f1daeeca547512884d72b74d3dd66f917b4c85a4fd3 |