Skip to content

Commit 4c05ab1

Browse files
Database-level rollbacks (copy-on-write) (#392)
* Initial VersionedModel * Fix flakeheaven config * Whooooah, a working system-wide model!!1! * TransactionManager and sync_level filtering * Register models * Fix TransactionManager registration * Cleanup * Cleanup * Cleanup task * Per-index diffs * Ignore immune tables * Rename DatabaseTransaction * Remove cleanup task * Make callbacks and transactions private in context * Cleanup if at least one index had messages in queue * Faster model update data * Use model name instead of table, codegen, rollback (except updating index level * Refresh rolled back level * Fix is_model_class, ignore reverse rekations * Fix HookContext not passed to hook * Drop single-level rollback * Logs * Drop `on_rollback` * Enforce our model class, faster model preparation * Log * Forbid bulk model methods * Changelog, fix operation batch level check * Fix log * Release notes WIP * Tag GHCR images by ref_name * Try to fix ref URLs * Again * Again... * Bump actions, use metadata one to escape chars * Build for branches? * Lint * Fix changelog * Lint, config export --full * Fix Hasura metadata generation * Fix `hasura configure` command crash when models have empty `Meta.table` * Allow customizing `server_name` and `release` tags with corresponding fields in Sentry config * Refactoring * Preprocess JSON from modelupdate * Basic insert test * Still testing * Fix updates * Lint * More tests * Fix optionals * Deferred update * Refactoring, save original data * Update docstrings * bulk_update and bulk_create * Update with prefetch * Do not save updates until queryset is awaited * Drop reverse relations form versioned data * Fix crash when adding an index with new subscriptions in runtime * Another backwards relation fix * AGEN * More optimal deserializing * Save diffs when possible * Skip empty updates, more logs * Unify index sync_level * Fix prometheus metric, rename head_level to sync_level (more correct) * Update changelog * Update release notes
1 parent 0f11563 commit 4c05ab1

File tree

44 files changed

+1239
-893
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1239
-893
lines changed

.github/workflows/build.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@ name: Build
22
on:
33
push:
44
branches:
5-
- 'master'
5+
- "**"
66
tags:
77
- '*.*.*'
8-
pull_request:
9-
branches:
10-
- 'master'
118

129
jobs:
1310
build:
@@ -17,6 +14,7 @@ jobs:
1714
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
1815
DOCKER_REGISTRY: ghcr.io
1916
DOCKER_IMAGE_NAME: ${{ github.repository }}
17+
2018
steps:
2119
- name: Check out the repo
2220
uses: actions/checkout@v2
@@ -40,11 +38,14 @@ jobs:
4038
uses: docker/metadata-action@v3
4139
with:
4240
images: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE_NAME }}
41+
tags: |
42+
type=ref,event=branch
43+
type=ref,event=tag
4344
flavor: |
4445
latest=false
4546
4647
- name: Publish image on GHCR
47-
uses: docker/build-push-action@v2
48+
uses: docker/build-push-action@v3
4849
with:
4950
context: .
5051
file: Dockerfile

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog],
66
and this project adheres to [Semantic Versioning].
77

8+
## [Unreleased]
9+
10+
### Added
11+
12+
- cli: Added `config export --full` flag to resolve templates before printing config.
13+
- config: Added `advanced.rollback_depth` field, a number of levels to keep in a database for rollback.
14+
- context: Added `rollback` method to perform database rollback.
15+
- database: Added an internal `ModelUpdate` model to store the latest database changes.
16+
17+
### Fixed
18+
19+
- prometheus: Fixed updating `dipdup_index_handlers_matched_total` metric.
20+
21+
### Changed
22+
23+
- codegen: `on_index_rollback` hook calls `ctx.rollback` by default.
24+
- database: Project models must be subclassed from `dipdup.models.Model`
25+
- database: `bulk_create` and `bulk_update` model methods are no longer supported.
26+
27+
### Removed
28+
29+
- hooks: Removed deprecated `on_rollback` hook.
30+
- index: Do not try to avoid single-level rollbacks by comparing operation hashes.
31+
832
## [5.2.5] - 2022-07-26
933

1034
### Fixed

docs/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484

8585
* [Changelog](CHANGELOG.md)
8686
* [Release notes](release-notes/README.md)
87+
* [6.0.0 (unreleased)](release-notes/6.0.0.md)
8788
* [5.1.0](release-notes/5.1.0.md)
8889
* [5.0.0](release-notes/5.0.0.md)
8990
* [4.2.0](release-notes/4.2.0.md)

docs/advanced/context/reference.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
<span class="target" id="module-dipdup.context"></span><dl class="py class">
33
<dt class="sig sig-object py" id="dipdup.context.DipDupContext">
4-
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">dipdup.context.</span></span><span class="sig-name descname"><span class="pre">DipDupContext</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">datasources</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Datasource</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.DipDupConfig" title="dipdup.config.DipDupConfig"><span class="pre">DipDupConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">callbacks</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">CallbackManager</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#dipdup.context.DipDupContext" title="Permalink to this definition">¶</a></dt>
4+
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">dipdup.context.</span></span><span class="sig-name descname"><span class="pre">DipDupContext</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">datasources</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Datasource</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.DipDupConfig" title="dipdup.config.DipDupConfig"><span class="pre">DipDupConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">callbacks</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">CallbackManager</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">transactions</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">TransactionManager</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#dipdup.context.DipDupContext" title="Permalink to this definition">¶</a></dt>
55
<dd><p>Class to store application context</p>
66
<dl class="field-list simple">
77
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
@@ -71,13 +71,13 @@
7171

7272
<dl class="py class">
7373
<dt class="sig sig-object py" id="dipdup.context.HandlerContext">
74-
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">dipdup.context.</span></span><span class="sig-name descname"><span class="pre">HandlerContext</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">datasources</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Datasource</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.DipDupConfig" title="dipdup.config.DipDupConfig"><span class="pre">DipDupConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">callbacks</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">CallbackManager</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">logger</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FormattedLogger</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">handler_config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.HandlerConfig" title="dipdup.config.HandlerConfig"><span class="pre">HandlerConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">datasource</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">TzktDatasource</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#dipdup.context.HandlerContext" title="Permalink to this definition">¶</a></dt>
74+
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">dipdup.context.</span></span><span class="sig-name descname"><span class="pre">HandlerContext</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">datasources</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Datasource</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.DipDupConfig" title="dipdup.config.DipDupConfig"><span class="pre">DipDupConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">callbacks</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">CallbackManager</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">transactions</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">TransactionManager</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">logger</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FormattedLogger</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">handler_config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.HandlerConfig" title="dipdup.config.HandlerConfig"><span class="pre">HandlerConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">datasource</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">TzktDatasource</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#dipdup.context.HandlerContext" title="Permalink to this definition">¶</a></dt>
7575
<dd><p>Common handler context.</p>
7676
</dd></dl>
7777

7878
<dl class="py class">
7979
<dt class="sig sig-object py" id="dipdup.context.HookContext">
80-
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">dipdup.context.</span></span><span class="sig-name descname"><span class="pre">HookContext</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">datasources</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Datasource</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.DipDupConfig" title="dipdup.config.DipDupConfig"><span class="pre">DipDupConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">callbacks</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">CallbackManager</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">logger</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FormattedLogger</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hook_config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.HookConfig" title="dipdup.config.HookConfig"><span class="pre">HookConfig</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#dipdup.context.HookContext" title="Permalink to this definition">¶</a></dt>
80+
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">dipdup.context.</span></span><span class="sig-name descname"><span class="pre">HookContext</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">datasources</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Dict</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">Datasource</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.DipDupConfig" title="dipdup.config.DipDupConfig"><span class="pre">DipDupConfig</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">callbacks</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">CallbackManager</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">transactions</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">TransactionManager</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">logger</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FormattedLogger</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hook_config</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="config-reference.html#dipdup.config.HookConfig" title="dipdup.config.HookConfig"><span class="pre">HookConfig</span></a></span></em><span class="sig-paren">)</span><a class="headerlink" href="#dipdup.context.HookContext" title="Permalink to this definition">¶</a></dt>
8181
<dd><p>Hook callback context.</p>
8282
</dd></dl>
8383

docs/cli-reference.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
</section>
7777
<section id="dipdup-config-export">
7878
<h3>export<a class="headerlink" href="#dipdup-config-export" title="Permalink to this heading">¶</a></h3>
79-
<p>Print config after resolving all links and templates.</p>
79+
<p>Print config after resolving all links and, optionally, templates.</p>
8080
<p>WARNING: Avoid sharing output with 3rd-parties when <cite>–unsafe</cite> flag set - it may contain secrets!</p>
8181
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>dipdup config <span class="nb">export</span> <span class="o">[</span>OPTIONS<span class="o">]</span>
8282
</pre></div>
@@ -88,6 +88,12 @@
8888
<dd><p>Resolve environment variables or use default values from config.</p>
8989
</dd></dl>
9090

91+
<dl class="std option">
92+
<dt class="sig sig-object std" id="cmdoption-dipdup-config-export-full">
93+
<span class="sig-name descname"><span class="pre">--full</span></span><span class="sig-prename descclassname"></span><a class="headerlink" href="#cmdoption-dipdup-config-export-full" title="Permalink to this definition">¶</a></dt>
94+
<dd><p>Resolve index templates.</p>
95+
</dd></dl>
96+
9197
</section>
9298
</section>
9399
<section id="dipdup-hasura">

0 commit comments

Comments
 (0)