Skip to content

Commit 6e8509e

Browse files
committed
Keep delivery failures longer than successfu deliveries
1 parent 18cc10e commit 6e8509e

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

tests/unit/email/ses/test_tasks.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
import datetime
1414

1515
from warehouse.email.ses.models import EmailMessage
16-
from warehouse.email.ses.tasks import CLEANUP_AFTER, cleanup
16+
from warehouse.email.ses.tasks import (
17+
CLEANUP_DELIVERED_AFTER, CLEANUP_AFTER, cleanup,
18+
)
1719

1820
from ....common.db.ses import EmailMessageFactory
1921

@@ -22,12 +24,26 @@ def test_cleanup_cleans_correctly(db_request):
2224
now = datetime.datetime.utcnow()
2325

2426
EmailMessageFactory.create(
25-
created=(now - CLEANUP_AFTER - datetime.timedelta(hours=1)),
27+
status="Delivered",
28+
created=(now - CLEANUP_DELIVERED_AFTER - datetime.timedelta(hours=1)),
2629
)
27-
to_be_kept = EmailMessageFactory.create(
28-
created=(now - CLEANUP_AFTER + datetime.timedelta(hours=1)),
30+
EmailMessageFactory.create(
31+
status="Bounced",
32+
created=(now - CLEANUP_AFTER - datetime.timedelta(hours=1)),
2933
)
3034

35+
to_be_kept = [
36+
EmailMessageFactory.create(
37+
status="Delivered",
38+
created=(now - CLEANUP_DELIVERED_AFTER +
39+
datetime.timedelta(hours=1)),
40+
),
41+
EmailMessageFactory.create(
42+
status="Bounced",
43+
created=(now - CLEANUP_AFTER + datetime.timedelta(hours=1)),
44+
),
45+
]
46+
3147
cleanup(db_request)
3248

33-
assert db_request.db.query(EmailMessage).all() == [to_be_kept]
49+
assert set(db_request.db.query(EmailMessage).all()) == set(to_be_kept)

warehouse/email/ses/tasks.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,25 @@
1616
from warehouse.email.ses.models import EmailMessage
1717

1818

19-
CLEANUP_AFTER = datetime.timedelta(days=14)
19+
CLEANUP_DELIVERED_AFTER = datetime.timedelta(days=14)
20+
21+
CLEANUP_AFTER = datetime.timedelta(days=90)
2022

2123

2224
@tasks.task(ignore_result=True, acks_late=True)
2325
def cleanup(request):
26+
# Cleanup any email message whose status is Accepted or Delivered.
27+
# We clean these up quicker than failures because we don't really
28+
# need them, and this limits the amount of data stored in the
29+
# database.
30+
(request.db.query(EmailMessage)
31+
.filter(EmailMessage.status.in_(["Accepted", "Delivered"]))
32+
.filter(EmailMessage.created <
33+
(datetime.datetime.utcnow() - CLEANUP_DELIVERED_AFTER))
34+
.delete(synchronize_session="fetch"))
35+
36+
# Cleanup *all* messages, this is our hard limit after which we
37+
# will not continue to save the email message data.
2438
(request.db.query(EmailMessage)
2539
.filter(EmailMessage.created <
2640
(datetime.datetime.utcnow() - CLEANUP_AFTER))

0 commit comments

Comments
 (0)