Skip to content

Commit 7ef6644

Browse files
authored
Merge pull request #4731 from alphagov/high-failure-rates-task-replica
Move "check_for_services_with_high_failure_rates_or_sending_to_tv_numbers" task to read replica
2 parents 62bcd54 + 4992b04 commit 7ef6644

File tree

3 files changed

+47
-13
lines changed

3 files changed

+47
-13
lines changed

app/celery/scheduled_tasks.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,16 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers():
456456
end_date = datetime.utcnow()
457457
message = ""
458458

459-
services_with_failures = dao_find_services_with_high_failure_rates(start_date=start_date, end_date=end_date)
460-
services_sending_to_tv_numbers = dao_find_services_sending_to_tv_numbers(start_date=start_date, end_date=end_date)
459+
services_with_failures = dao_find_services_with_high_failure_rates(
460+
start_date=start_date,
461+
end_date=end_date,
462+
retry_attempts=2,
463+
)
464+
services_sending_to_tv_numbers = dao_find_services_sending_to_tv_numbers(
465+
start_date=start_date,
466+
end_date=end_date,
467+
retry_attempts=2,
468+
)
461469

462470
if services_with_failures:
463471
message += (

app/dao/services_dao.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -494,9 +494,12 @@ def dao_fetch_active_users_for_service(service_id):
494494
return query.all()
495495

496496

497-
def dao_find_services_sending_to_tv_numbers(start_date, end_date, threshold=500):
497+
@retryable_query()
498+
def dao_find_services_sending_to_tv_numbers(
499+
start_date: datetime, end_date: datetime, threshold: int = 500, session: Session | scoped_session = db.session
500+
):
498501
return (
499-
db.session.query(
502+
session.query(
500503
Notification.service_id.label("service_id"), func.count(Notification.id).label("notification_count")
501504
)
502505
.filter(
@@ -517,9 +520,12 @@ def dao_find_services_sending_to_tv_numbers(start_date, end_date, threshold=500)
517520
)
518521

519522

520-
def dao_find_services_with_high_failure_rates(start_date, end_date, threshold=10000):
523+
@retryable_query()
524+
def dao_find_services_with_high_failure_rates(
525+
start_date: datetime, end_date: datetime, threshold: int = 10000, session: Session | scoped_session = db.session
526+
):
521527
subquery = (
522-
db.session.query(func.count(Notification.id).label("total_count"), Notification.service_id.label("service_id"))
528+
session.query(func.count(Notification.id).label("total_count"), Notification.service_id.label("service_id"))
523529
.filter(
524530
Notification.service_id == Service.id,
525531
Notification.created_at >= start_date,
@@ -538,7 +544,7 @@ def dao_find_services_with_high_failure_rates(start_date, end_date, threshold=10
538544
subquery = subquery.subquery()
539545

540546
query = (
541-
db.session.query(
547+
session.query(
542548
Notification.service_id.label("service_id"),
543549
func.count(Notification.id).label("permanent_failure_count"),
544550
subquery.c.total_count.label("total_count"),

tests/app/dao/test_services_dao.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,7 +1189,15 @@ def create_email_sms_letter_template():
11891189

11901190

11911191
@freeze_time("2019-12-02 12:00:00.000000")
1192-
def test_dao_find_services_sending_to_tv_numbers(notify_db_session, fake_uuid):
1192+
@pytest.mark.parametrize(
1193+
"session,expected_bind_key",
1194+
(
1195+
(db.session, None),
1196+
(db.session_bulk, "bulk"),
1197+
),
1198+
ids=("default", "bulk"),
1199+
)
1200+
def test_dao_find_services_sending_to_tv_numbers(notify_db_session, fake_uuid, session, expected_bind_key):
11931201
service_1 = create_service(service_name="Service 1", service_id=fake_uuid)
11941202
service_3 = create_service(service_name="Service 3", restricted=True) # restricted is excluded
11951203
service_4 = create_service(service_name="Service 4", active=False) # not active is excluded
@@ -1224,12 +1232,23 @@ def test_dao_find_services_sending_to_tv_numbers(notify_db_session, fake_uuid):
12241232
start_date = datetime.utcnow() - timedelta(days=1)
12251233
end_date = datetime.utcnow()
12261234

1227-
result = dao_find_services_sending_to_tv_numbers(start_date, end_date, threshold=4)
1235+
with QueryRecorder() as query_recorder:
1236+
result = dao_find_services_sending_to_tv_numbers(start_date, end_date, threshold=4, session=session)
1237+
1238+
assert {query_info.bind_key for query_info in query_recorder.queries} == {expected_bind_key}
12281239
assert len(result) == 1
12291240
assert str(result[0].service_id) == fake_uuid
12301241

12311242

1232-
def test_dao_find_services_with_high_failure_rates(notify_db_session, fake_uuid):
1243+
@pytest.mark.parametrize(
1244+
"session,expected_bind_key",
1245+
(
1246+
(db.session, None),
1247+
(db.session_bulk, "bulk"),
1248+
),
1249+
ids=("default", "bulk"),
1250+
)
1251+
def test_dao_find_services_with_high_failure_rates(notify_db_session, fake_uuid, session, expected_bind_key):
12331252
service_1 = create_service(service_name="Service 1", service_id=fake_uuid)
12341253
service_3 = create_service(service_name="Service 3", restricted=True) # restricted is excluded
12351254
service_4 = create_service(service_name="Service 4", active=False) # not active is excluded
@@ -1258,9 +1277,10 @@ def test_dao_find_services_with_high_failure_rates(notify_db_session, fake_uuid)
12581277
start_date = datetime.utcnow() - timedelta(days=1)
12591278
end_date = datetime.utcnow()
12601279

1261-
result = dao_find_services_with_high_failure_rates(start_date, end_date, threshold=3)
1262-
# assert len(result) == 3
1263-
# assert str(result[0].service_id) == fake_uuid
1280+
with QueryRecorder() as query_recorder:
1281+
result = dao_find_services_with_high_failure_rates(start_date, end_date, threshold=3, session=session)
1282+
1283+
assert {query_info.bind_key for query_info in query_recorder.queries} == {expected_bind_key}
12641284
assert len(result) == 1
12651285
assert str(result[0].service_id) == fake_uuid
12661286
assert result[0].permanent_failure_rate == 0.25

0 commit comments

Comments
 (0)