Update transaction.on_commit to use partial instead of lambda (#3448)

For reference,
https://adamj.eu/tech/2022/08/22/use-partial-with-djangos-transaction-on-commit/.

I think this may help with this one too:
https://github.com/grafana/oncall-private/issues/2318
This commit is contained in:
Matias Bordese 2023-11-29 09:01:30 -03:00 committed by GitHub
parent 8c82dac6db
commit ec1f120d9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 23 additions and 10 deletions

View file

@ -1,5 +1,6 @@
import json
import logging
from functools import partial
from django.conf import settings
from django.db import transaction
@ -79,5 +80,5 @@ def custom_button_result(custom_button_pk, alert_group_pk, user_pk=None, escalat
f"call send_alert_group_signal for alert_group {alert_group_pk}, "
f"log record {log_record.pk} with type '{log_record.get_type_display()}'"
)
transaction.on_commit(lambda: send_alert_group_signal.apply_async((log_record.pk,)))
transaction.on_commit(partial(send_alert_group_signal.apply_async, (log_record.pk,)))
task_logger.debug(f"Finish custom_button_result for alert_group {alert_group_pk}, custom_button {custom_button_pk}")

View file

@ -1,3 +1,5 @@
from functools import partial
from django.conf import settings
from django.db import transaction
from kombu.utils.uuid import uuid as celery_uuid
@ -77,7 +79,7 @@ def escalate_alert_group(alert_group_pk):
task_id = celery_uuid()
alert_group.active_escalation_id = task_id
transaction.on_commit(
lambda: escalate_alert_group.apply_async((alert_group.pk,), immutable=True, eta=eta, task_id=task_id)
partial(escalate_alert_group.apply_async, (alert_group.pk,), immutable=True, eta=eta, task_id=task_id)
)
alert_group.save(update_fields=["active_escalation_id", "raw_escalation_snapshot"])
log_message += "Next escalation poked, id: {} ".format(task_id)

View file

@ -1,3 +1,5 @@
from functools import partial
from django.conf import settings
from django.db import transaction
from django.db.models import ExpressionWrapper, F, fields
@ -57,8 +59,9 @@ def disable_maintenance(*args, **kwargs):
# because after transaction maintenance_mode is None.
if organization.slack_team_identity:
transaction.on_commit(
lambda: object_under_maintenance.notify_about_maintenance_action(
f"{mode_verbal} of {object_under_maintenance.get_verbal()} finished."
partial(
object_under_maintenance.notify_about_maintenance_action,
f"{mode_verbal} of {object_under_maintenance.get_verbal()} finished.",
)
)

View file

@ -1,4 +1,5 @@
import time
from functools import partial
from django.conf import settings
from django.db import transaction
@ -191,11 +192,11 @@ def notify_user_task(
log_record.save()
if notify_user_task.request.retries == 0:
transaction.on_commit(lambda: send_user_notification_signal.apply_async((log_record.pk,)))
transaction.on_commit(partial(send_user_notification_signal.apply_async, (log_record.pk,)))
if not stop_escalation:
if notification_policy.step != UserNotificationPolicy.Step.WAIT:
transaction.on_commit(lambda: perform_notification.apply_async((log_record.pk,)))
transaction.on_commit(partial(perform_notification.apply_async, (log_record.pk,)))
delay = NEXT_ESCALATION_DELAY
if countdown is not None:
@ -206,7 +207,8 @@ def notify_user_task(
user_has_notification.save(update_fields=["active_notification_policy_id"])
transaction.on_commit(
lambda: notify_user_task.apply_async(
partial(
notify_user_task.apply_async,
(user.pk, alert_group.pk, notification_policy.pk, reason),
{
"notify_even_acknowledged": notify_even_acknowledged,

View file

@ -1,3 +1,5 @@
from functools import partial
from django.conf import settings
from django.db import transaction
@ -44,7 +46,7 @@ def unsilence_task(alert_group_pk):
reason="auto unsilence",
)
un_silence_log_record.save()
transaction.on_commit(lambda: send_alert_group_signal.apply_async((un_silence_log_record.pk,)))
transaction.on_commit(partial(send_alert_group_signal.apply_async, (un_silence_log_record.pk,)))
else:
task_logger.info(
f"Failed to unsilence alert_group {alert_group_pk}: alert_group status: {alert_group.status}, "

View file

@ -1,4 +1,5 @@
import datetime
from functools import partial
from celery.utils.log import get_task_logger
from django.conf import settings
@ -57,7 +58,8 @@ def check_heartbeats() -> str:
# Schedule alert creation for each expired heartbeat after transaction commit
for heartbeat in expired_heartbeats:
transaction.on_commit(
lambda: create_alert.apply_async(
partial(
create_alert.apply_async,
kwargs={
"title": heartbeat.alert_receive_channel.heartbeat_expired_title,
"message": heartbeat.alert_receive_channel.heartbeat_expired_message,
@ -82,7 +84,8 @@ def check_heartbeats() -> str:
# Schedule auto-resolve alert creation for each expired heartbeat after transaction commit
for heartbeat in restored_heartbeats:
transaction.on_commit(
lambda: create_alert.apply_async(
partial(
create_alert.apply_async,
kwargs={
"title": heartbeat.alert_receive_channel.heartbeat_restored_title,
"message": heartbeat.alert_receive_channel.heartbeat_restored_message,