backend.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from __future__ import annotations
  2. import logging
  3. import math
  4. import pickle
  5. from django.utils import timezone
  6. from sentry.db.models import create_or_update
  7. from sentry.nodestore.base import NodeStorage
  8. from sentry.utils.strings import compress, decompress
  9. from .models import Node
  10. logger = logging.getLogger("sentry")
  11. class DjangoNodeStorage(NodeStorage):
  12. def delete(self, id):
  13. Node.objects.filter(id=id).delete()
  14. self._delete_cache_item(id)
  15. def _decode(self, value, subkey):
  16. if value is None:
  17. return None
  18. try:
  19. if value.startswith(b"{"):
  20. return NodeStorage._decode(self, value, subkey=subkey)
  21. if subkey is None:
  22. return pickle.loads(value)
  23. return None
  24. except Exception as e:
  25. logger.exception(str(e))
  26. return {}
  27. def _get_bytes(self, id):
  28. try:
  29. data = Node.objects.get(id=id).data
  30. return decompress(data)
  31. except Node.DoesNotExist:
  32. return None
  33. def _get_bytes_multi(self, id_list: list[str]) -> dict[str, bytes | None]:
  34. return {n.id: decompress(n.data) for n in Node.objects.filter(id__in=id_list)}
  35. def delete_multi(self, id_list):
  36. Node.objects.filter(id__in=id_list).delete()
  37. self._delete_cache_items(id_list)
  38. def _set_bytes(self, id, data, ttl=None):
  39. create_or_update(Node, id=id, values={"data": compress(data), "timestamp": timezone.now()})
  40. def cleanup(self, cutoff_timestamp):
  41. from sentry.db.deletion import BulkDeleteQuery
  42. total_seconds = (timezone.now() - cutoff_timestamp).total_seconds()
  43. days = math.floor(total_seconds / 86400)
  44. BulkDeleteQuery(model=Node, dtfield="timestamp", days=days).execute()
  45. if self.cache:
  46. self.cache.clear()
  47. def bootstrap(self):
  48. # Nothing for Django backend to do during bootstrap
  49. pass