bug 574271, garbage collection for collections
This commit is contained in:
Родитель
678e19257d
Коммит
b8423263c0
|
@ -412,9 +412,9 @@ CONTRIB_CHOICES = {
|
|||
}
|
||||
|
||||
# Personas
|
||||
PERSONAS_ADDON_ID = 10900 # Add-on ID of the Personas Plus Add-on
|
||||
PERSONAS_FIREFOX_MIN = '3.6' # First Firefox version to support Personas
|
||||
PERSONAS_THUNDERBIRD_MIN = '3.1' # Ditto for Thunderbird
|
||||
PERSONAS_ADDON_ID = 10900 # Add-on ID of the Personas Plus Add-on
|
||||
PERSONAS_FIREFOX_MIN = '3.6' # First Firefox version to support Personas
|
||||
PERSONAS_THUNDERBIRD_MIN = '3.1' # Ditto for Thunderbird
|
||||
|
||||
# Collections.
|
||||
COLLECTION_NORMAL = 0
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
import calendar
|
||||
from datetime import datetime, timedelta
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
import cronjobs
|
||||
import commonware.log
|
||||
|
||||
import amo
|
||||
from bandwagon.models import Collection
|
||||
from cake.models import Session
|
||||
from devhub.models import AddonLog, LOG as ADDONLOG
|
||||
from files.models import TestResult, TestResultCache
|
||||
from sharing.models import SERVICES
|
||||
from stats.models import ShareCount, Contribution
|
||||
|
||||
log = commonware.log.getLogger('z.cron')
|
||||
|
||||
|
||||
@cronjobs.register
|
||||
def gc(test_result=True):
|
||||
"Site-wide garbage collections."
|
||||
|
||||
three_months_ago = datetime.today() - timedelta(days=90)
|
||||
six_days_ago = datetime.today() - timedelta(days=6)
|
||||
two_days_ago = datetime.today() - timedelta(days=2)
|
||||
one_hour_ago = datetime.today() - timedelta(hours=1)
|
||||
|
||||
log.debug('Cleaning up sessions table.')
|
||||
# cake.Session is stupid so...
|
||||
two_days_ago_unixtime = calendar.timegm(two_days_ago.utctimetuple())
|
||||
Session.objects.filter(expires__lt=two_days_ago_unixtime).delete()
|
||||
|
||||
log.debug('Cleaning up sharing services.')
|
||||
ShareCount.objects.exclude(
|
||||
service__in=[s.shortname for s in SERVICES]).delete()
|
||||
|
||||
# XXX(davedash): I can't seem to run this during testing without triggering
|
||||
# an error: "test_remora.nose_c doesn't exist"
|
||||
# for some reason a ForeignKey attaches itself to TestResult during testing
|
||||
# I suspect it's the name, but I don't have time to really figure this out.
|
||||
if test_result:
|
||||
log.debug('Cleaning up test results.')
|
||||
TestResult.objects.filter(created__lt=one_hour_ago).delete()
|
||||
|
||||
log.debug('Cleaning up test results cache.')
|
||||
TestResultCache.objects.filter(date__lt=one_hour_ago).delete()
|
||||
|
||||
log.debug('Cleaning up test results extraction cache.')
|
||||
if settings.NETAPP_STORAGE:
|
||||
cmd = ('find', settings.NETAPP_STORAGE, '-maxdepth', '1', '-name',
|
||||
'validate-*', '-mtime', '+7', '-type', 'd',
|
||||
'-exec', 'rm', '-rf', "{}", ';')
|
||||
|
||||
output = Popen(cmd, stdout=PIPE).communicate()[0]
|
||||
|
||||
for line in output.split("\n"):
|
||||
log.debug(line)
|
||||
|
||||
else:
|
||||
log.warning('NETAPP_STORAGE not defined.')
|
||||
|
||||
# Paypal only keeps retrying to verify transactions for up to 3 days. If we
|
||||
# still have an unverified transaction after 6 days, we might as well get
|
||||
# rid of it.
|
||||
log.debug('Cleaning up outdated contributions statistics.')
|
||||
Contribution.objects.filter(transaction_id__isnull=True,
|
||||
created__lt=six_days_ago).delete()
|
||||
|
||||
log.debug('Removing old entries from add-on news feeds.')
|
||||
keep = (
|
||||
ADDONLOG['Create Add-on'],
|
||||
ADDONLOG['Add User with Role'],
|
||||
ADDONLOG['Remove User with Role'],
|
||||
ADDONLOG['Set Inactive'],
|
||||
ADDONLOG['Unset Inactive'],
|
||||
ADDONLOG['Change Status'],
|
||||
ADDONLOG['Add Version'],
|
||||
ADDONLOG['Delete Version'],
|
||||
ADDONLOG['Approve Version'],
|
||||
ADDONLOG['Retain Version'],
|
||||
ADDONLOG['Escalate Version'],
|
||||
ADDONLOG['Request Version'],
|
||||
ADDONLOG['Add Recommended'],
|
||||
ADDONLOG['Remove Recommended'],
|
||||
)
|
||||
AddonLog.objects.filter(created__lt=three_months_ago).exclude(
|
||||
type__in=keep).delete()
|
||||
|
||||
log.debug('Cleaning up anonymous collections.')
|
||||
Collection.objects.filter(created__lt=two_days_ago,
|
||||
type=amo.COLLECTION_ANONYMOUS).delete()
|
|
@ -0,0 +1,84 @@
|
|||
[
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "files.testgroup",
|
||||
"fields": {
|
||||
"category": "general",
|
||||
"created": null,
|
||||
"modified": null,
|
||||
"critical": true,
|
||||
"tier": 1,
|
||||
"types": 127
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 11,
|
||||
"model": "files.testcase",
|
||||
"fields": {
|
||||
"function": "all_general_verifyExtension",
|
||||
"test_group": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 2,
|
||||
"model": "cake.session",
|
||||
"fields": {
|
||||
"session_id": "17f051c99f083244bf653d5798111216",
|
||||
"expires": 1,
|
||||
"data": "User|a:1:{s:2:\"id\";s:1:\"1\";}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 2567,
|
||||
"model": "stats.sharecount",
|
||||
"fields": {
|
||||
"count": 1,
|
||||
"date": "2009-07-27",
|
||||
"service": "fakebook",
|
||||
"addon": 59
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "stats.contribution",
|
||||
"fields": {
|
||||
"created": "2009-07-27",
|
||||
"addon": 59
|
||||
}
|
||||
|
||||
},
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "files.testresult",
|
||||
"fields": {
|
||||
"created": "2000-01-01",
|
||||
"file": 56975,
|
||||
"test_case": 11
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "files.testresultcache",
|
||||
"fields": {
|
||||
"date": "2000-01-01",
|
||||
"test_case": 11
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "devhub.addonlog",
|
||||
"fields": {
|
||||
"created": "2000-01-01",
|
||||
"addon": 59,
|
||||
"type": 99
|
||||
}
|
||||
},
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "bandwagon.collection",
|
||||
"fields": {
|
||||
"created": "2000-01-01",
|
||||
"type": 6
|
||||
}
|
||||
}
|
||||
]
|
|
@ -0,0 +1,32 @@
|
|||
from nose.tools import eq_
|
||||
import test_utils
|
||||
|
||||
from bandwagon.models import Collection
|
||||
from cake.models import Session
|
||||
from devhub.models import AddonLog
|
||||
from files.models import TestResult, TestResultCache
|
||||
from stats.models import ShareCount, Contribution
|
||||
from amo.cron import gc
|
||||
|
||||
|
||||
class GarbageTest(test_utils.TestCase):
|
||||
fixtures = ['base/addon_59', 'base/garbage']
|
||||
|
||||
def test_garbage_collection(self):
|
||||
"This fixture is expired data that should just get cleaned up."
|
||||
eq_(Collection.objects.all().count(), 1)
|
||||
eq_(Session.objects.all().count(), 1)
|
||||
eq_(AddonLog.objects.all().count(), 1)
|
||||
eq_(TestResult.objects.all().count(), 1)
|
||||
eq_(TestResultCache.objects.all().count(), 1)
|
||||
eq_(ShareCount.objects.all().count(), 1)
|
||||
eq_(Contribution.objects.all().count(), 1)
|
||||
gc(test_result=False)
|
||||
eq_(Collection.objects.all().count(), 0)
|
||||
eq_(Session.objects.all().count(), 0)
|
||||
eq_(AddonLog.objects.all().count(), 0)
|
||||
# XXX(davedash): this isn't working in testing.
|
||||
# eq_(TestResult.objects.all().count(), 0)
|
||||
eq_(TestResultCache.objects.all().count(), 0)
|
||||
eq_(ShareCount.objects.all().count(), 0)
|
||||
eq_(Contribution.objects.all().count(), 0)
|
|
@ -41,11 +41,9 @@ class File(amo.models.ModelBase):
|
|||
url.append('addon-%s-latest%s' % (addon, self.extension))
|
||||
return remora_url(os.path.join(*url))
|
||||
|
||||
|
||||
def eula_url(self):
|
||||
return reverse('addons.eula', args=[self.version.addon_id, self.id])
|
||||
|
||||
|
||||
@property
|
||||
def extension(self):
|
||||
return os.path.splitext(self.filename)[-1]
|
||||
|
|
|
@ -1,7 +1,3 @@
|
|||
from django.db.models import Sum
|
||||
|
||||
import caching
|
||||
|
||||
from tower import ugettext_lazy as _, ungettext as ngettext
|
||||
from stats.models import ShareCountTotal
|
||||
|
||||
|
@ -82,3 +78,6 @@ class EMAIL(ServiceBase):
|
|||
@staticmethod
|
||||
def count_term(count):
|
||||
return ngettext('{0} email', '{0} emails', count).format(count)
|
||||
|
||||
|
||||
SERVICES = [DIGG, FACEBOOK, DELICIOUS, MYSPACE, FRIENDFEED, TWITTER, EMAIL]
|
||||
|
|
Загрузка…
Ссылка в новой задаче