add retry mechanism to domain deletion

This commit is contained in:
matthewswspence 2025-02-10 13:20:46 -06:00
parent f08c2ff4ad
commit 78be172ee4
No known key found for this signature in database
GPG key ID: FB458202A7852BA4

View file

@ -2,7 +2,7 @@ from itertools import zip_longest
import logging import logging
import ipaddress import ipaddress
import re import re
from datetime import date, timedelta from datetime import date, time, timedelta
from typing import Optional from typing import Optional
from django.db import transaction from django.db import transaction
from django_fsm import FSMField, transition, TransitionNotAllowed # type: ignore from django_fsm import FSMField, transition, TransitionNotAllowed # type: ignore
@ -1114,12 +1114,34 @@ class Domain(TimeStampedModel, DomainHelper):
e.note = "Error deleting ds data for %s" % self.name e.note = "Error deleting ds data for %s" % self.name
raise e raise e
# Previous deletions have to complete before we can delete the domain
# This is a polling mechanism to ensure that the domain is deleted
try: try:
logger.info("Deleting domain %s", self.name) logger.info("Attempting to delete domain %s", self.name)
request = commands.DeleteDomain(name=self.name) delete_request = commands.DeleteDomain(name=self.name)
registry.send(request, cleaned=True) max_attempts = 5 # maximum number of retries
wait_interval = 1 # seconds to wait between attempts
for attempt in range(max_attempts):
try:
registry.send(delete_request, cleaned=True)
logger.info("Domain %s deleted successfully.", self.name)
break # exit the loop on success
except RegistryError as e: except RegistryError as e:
logger.error(f"Error deleting domain {self}: {e}") error = e
logger.warning(
"Attempt %d of %d: Domain deletion not possible yet: %s. Retrying in %d seconds.",
attempt + 1,
max_attempts,
e,
wait_interval,
)
time.sleep(wait_interval)
else:
logger.error("Exceeded maximum attempts to delete domain %s", self.name)
raise error
except RegistryError as e:
logger.error("Error deleting domain %s after polling: %s", self.name, e)
raise e raise e
def __str__(self) -> str: def __str__(self) -> str: