forked from GithubBackups/healthchecks
Removing temporary data migration command.
This commit is contained in:
parent
b52edd903d
commit
6c3a99e977
@ -1,75 +0,0 @@
|
||||
"""
|
||||
|
||||
Populate api_check.n_pings and api_ping.n fields.
|
||||
|
||||
- api_ping.n stores ping's serial number, counted separately for
|
||||
each check. For example, if a particular check has received 100 pings,
|
||||
its first ping will have a n=1, and the 100th ping will have a n=100.
|
||||
|
||||
- api_check.n_pings stores the last serial number assigned to a ping.
|
||||
It also is the total number of pings the check has ever received.
|
||||
|
||||
This command works by "replaying" stored pings in their primary
|
||||
key order, and counting up their serial numbers. At the very end,
|
||||
api_check.n_pings fields are updated as well.
|
||||
|
||||
Depending on the size of api_ping table, this command can potentially
|
||||
take a long time to complete.
|
||||
|
||||
Note on ping pruning: when the prunepings command is run, some of the
|
||||
pings with the lowest serial numbers get removed. This doesn't affect
|
||||
the "n" field for remaining pings, or the "n_pings" value of checks.
|
||||
The serial numbers keep going up.
|
||||
|
||||
"""
|
||||
|
||||
import gc
|
||||
from collections import Counter
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.db import connection, transaction
|
||||
from hc.api.models import Check, Ping
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Fill check.n_pings field and ping.n field'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
connection.use_debug_cursor = False
|
||||
chunksize = 2000
|
||||
|
||||
# Reset all n_pings fields to zero
|
||||
Check.objects.update(n_pings=0)
|
||||
|
||||
counts = Counter()
|
||||
|
||||
pk = 0
|
||||
last_pk = Ping.objects.order_by('-pk')[0].pk
|
||||
queryset = Ping.objects.order_by('pk')
|
||||
|
||||
while pk < last_pk:
|
||||
transaction.set_autocommit(False)
|
||||
while pk < last_pk:
|
||||
for ping in queryset.filter(pk__gt=pk)[:chunksize]:
|
||||
pk = ping.pk
|
||||
counts[ping.owner_id] += 1
|
||||
|
||||
ping.n = counts[ping.owner_id]
|
||||
ping.save(update_fields=("n", ))
|
||||
|
||||
gc.collect()
|
||||
progress = 100 * pk / last_pk
|
||||
self.stdout.write(
|
||||
"Processed ping id %d (%.2f%%)" % (pk, progress))
|
||||
|
||||
transaction.commit()
|
||||
|
||||
transaction.set_autocommit(True)
|
||||
# last_pk might have increased because of influx of new pings:
|
||||
last_pk = Ping.objects.order_by('-pk')[0].pk
|
||||
|
||||
self.stdout.write("Updating check.n_pings")
|
||||
for check_id, n_pings in counts.items():
|
||||
Check.objects.filter(pk=check_id).update(n_pings=n_pings)
|
||||
|
||||
return "Done!"
|
Loading…
x
Reference in New Issue
Block a user