Opened 2 years ago
Closed 20 months ago
#34841 closed Cleanup/optimization (fixed)
Reverse migrations model state rendering slow with moderate to large migrations
| Reported by: | David Sanders | Owned by: | David Sanders |
|---|---|---|---|
| Component: | Migrations | Version: | 4.2 |
| Severity: | Normal | Keywords: | |
| Cc: | Simon Charette, Markus Holtermann, Shai Berger, Josh Smeaton | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Relevant discussion: https://forum.djangoproject.com/t/migrating-backwards-takes-orders-of-magnitude-longer-than-migrating-forwards/20873/2
Investigations revealed 2 things.
- this block of code in
db/migrations/excecutor.pywas responsible for a large portion of processing time: https://github.com/django/django/blob/b8b2f7451201f3ff60891b6ce55f177400700d7a/django/db/migrations/executor.py#L222-L232
In my small project with only a moderate number of migrations, a simple reverse migrate of the last migration on the main app took ~20s. The block below was responsible for ~16s.
# Generate the post migration state by starting from the state before
# the last migration is unapplied and mutating it to include all the
# remaining applied migrations.
last_unapplied_migration = plan[-1][0]
state = states[last_unapplied_migration]
for index, (migration, _) in enumerate(full_plan):
if migration == last_unapplied_migration:
for migration, _ in full_plan[index:]:
if migration in applied_migrations:
migration.mutate_state(state, preserve=False)
break
- these 2 lines appeared to be responsible for the slowdown, commenting them out made the block above run almost instantly: https://github.com/django/django/blob/b8b2f7451201f3ff60891b6ce55f177400700d7a/django/db/migrations/executor.py#L203-L204
if "apps" not in state.__dict__:
state.apps # Render all -- performance critical
I have a small patch to move record the unapplied state before these 2 lines and clone it, removing the state.apps attribute.
Change History (6)
comment:1 by , 2 years ago
| Has patch: | set |
|---|---|
| Owner: | changed from to |
| Status: | new → assigned |
comment:2 by , 2 years ago
| Cc: | added |
|---|
comment:3 by , 2 years ago
| Cc: | added |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
comment:4 by , 2 years ago
| Patch needs improvement: | set |
|---|
comment:5 by , 20 months ago
| Patch needs improvement: | unset |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
Note:
See TracTickets
for help on using tickets.
Tentatively accepted for the investigation.