mirror of
https://github.com/ansible/awx.git
synced 2026-02-28 00:08:44 -03:30
first draft of db partitioning
This commit is contained in:
63
awx/main/migrations/0124_event_partitions.py
Normal file
63
awx/main/migrations/0124_event_partitions.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# Generated by Django 2.2.8 on 2020-02-21 16:31
|
||||
|
||||
from django.db import migrations, models, connection
|
||||
|
||||
|
||||
def migrate_event_data(apps, schema_editor):
|
||||
# see: https://github.com/ansible/awx/issues/9039
|
||||
#
|
||||
# the goal of this function is to:
|
||||
# - [ ] create a parent partition table, main_jobevent_parent
|
||||
# - [ ] .. with a single partition
|
||||
# - [ ] .. that includes all existing job events
|
||||
#
|
||||
# the new main_jobevent_parent table should have a new
|
||||
# denormalized column, job_created, this is used as a
|
||||
# basis for partitioning job event rows
|
||||
#
|
||||
# The initial partion will be a unique case. After
|
||||
# the migration is completed, awx should create
|
||||
# new partitions on an hourly basis, as needed.
|
||||
# All events for a given job should be placed in
|
||||
# a partition based on the job's _created time_.
|
||||
|
||||
# Only partitioning main_jobevent on first pass
|
||||
#
|
||||
#for tblname in (
|
||||
# 'main_jobevent', 'main_inventoryupdateevent',
|
||||
# 'main_projectupdateevent', 'main_adhoccommandevent',
|
||||
# 'main_systemjobevent'
|
||||
#):
|
||||
for tblname in ('main_jobevent',):
|
||||
with connection.cursor() as cursor:
|
||||
# hacky creation of parent table for partition
|
||||
cursor.execute(
|
||||
f'CREATE TABLE {tblname}_parent '
|
||||
f'(LIKE {tblname}, job_created TIMESTAMP WITH TIME ZONE NOT NULL) '
|
||||
f'PARTITION BY RANGE(job_created);'
|
||||
)
|
||||
|
||||
# .. as well as initial partition containing all existing events
|
||||
cursor.execute(
|
||||
f'CREATE TABLE {tblname}_part0 '
|
||||
f'PARTITION OF {tblname}_parent '
|
||||
f'FOR VALUES FROM (\'2000-01-01 00:00:00.000000+00\') to (\'2021-02-01 00:00:00.000000+00\');'
|
||||
)
|
||||
|
||||
# copy over all job events into partitioned table
|
||||
cursor.execute(
|
||||
f'INSERT INTO {tblname}_parent '
|
||||
f'SELECT {tblname}.*, main_unifiedjob.created '
|
||||
f'FROM {tblname} '
|
||||
f'INNER JOIN main_unifiedjob ON {tblname}.job_id = main_unifiedjob.id;'
|
||||
)
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0123_drop_hg_support'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(migrate_event_data),
|
||||
]
|
||||
Reference in New Issue
Block a user