Actor delete, sentry async, faster stator
This commit is contained in:
		
							parent
							
								
									77643a4fe1
								
							
						
					
					
						commit
						f491fdb56e
					
				
							
								
								
									
										10
									
								
								core/exceptions.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								core/exceptions.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
class ActivityPubError(BaseException):
 | 
			
		||||
    """
 | 
			
		||||
    A problem with an ActivityPub message
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ActorMismatchError(ActivityPubError):
 | 
			
		||||
    """
 | 
			
		||||
    The actor is not authorised to do the action we saw
 | 
			
		||||
    """
 | 
			
		||||
@ -158,7 +158,7 @@ class StatorModel(models.Model):
 | 
			
		||||
            if settings.SENTRY_ENABLED:
 | 
			
		||||
                from sentry_sdk import capture_exception
 | 
			
		||||
 | 
			
		||||
                capture_exception(e)
 | 
			
		||||
                await sync_to_async(capture_exception, thread_sensitive=False)(e)
 | 
			
		||||
            traceback.print_exc()
 | 
			
		||||
        else:
 | 
			
		||||
            if next_state:
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@ import traceback
 | 
			
		||||
import uuid
 | 
			
		||||
from typing import List, Optional, Type
 | 
			
		||||
 | 
			
		||||
from asgiref.sync import sync_to_async
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
 | 
			
		||||
@ -46,12 +47,12 @@ class StatorRunner:
 | 
			
		||||
                if (time.monotonic() - self.last_clean) >= self.schedule_interval:
 | 
			
		||||
                    print(f"{self.handled} tasks processed so far")
 | 
			
		||||
                    print("Running cleaning and scheduling")
 | 
			
		||||
                    self.remove_completed_tasks()
 | 
			
		||||
                    for model in self.models:
 | 
			
		||||
                        asyncio.create_task(model.atransition_clean_locks())
 | 
			
		||||
                        asyncio.create_task(model.atransition_schedule_due())
 | 
			
		||||
                    self.last_clean = time.monotonic()
 | 
			
		||||
                # Calculate space left for tasks
 | 
			
		||||
                self.remove_completed_tasks()
 | 
			
		||||
                space_remaining = self.concurrency - len(self.tasks)
 | 
			
		||||
                # Fetch new tasks
 | 
			
		||||
                for model in self.models:
 | 
			
		||||
@ -95,7 +96,7 @@ class StatorRunner:
 | 
			
		||||
            if settings.SENTRY_ENABLED:
 | 
			
		||||
                from sentry_sdk import capture_exception
 | 
			
		||||
 | 
			
		||||
                capture_exception(e)
 | 
			
		||||
                await sync_to_async(capture_exception, thread_sensitive=False)(e)
 | 
			
		||||
            traceback.print_exc()
 | 
			
		||||
 | 
			
		||||
    def remove_completed_tasks(self):
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ from django.template.defaultfilters import linebreaks_filter
 | 
			
		||||
from django.templatetags.static import static
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
 | 
			
		||||
from core.exceptions import ActorMismatchError
 | 
			
		||||
from core.html import sanitize_post
 | 
			
		||||
from core.ld import canonicalise, media_type_from_filename
 | 
			
		||||
from core.uploads import upload_namer
 | 
			
		||||
@ -261,6 +262,24 @@ class Identity(StatorModel):
 | 
			
		||||
        except cls.DoesNotExist:
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def handle_delete_ap(cls, data):
 | 
			
		||||
        """
 | 
			
		||||
        Takes an incoming update.person message and just forces us to add it
 | 
			
		||||
        to our fetch queue (don't want to bother with two load paths right now)
 | 
			
		||||
        """
 | 
			
		||||
        # Assert that the actor matches the object
 | 
			
		||||
        if data["actor"] != data["object"]:
 | 
			
		||||
            raise ActorMismatchError(
 | 
			
		||||
                f"Actor {data['actor']} trying to delete identity {data['object']}"
 | 
			
		||||
            )
 | 
			
		||||
        # Find by actor
 | 
			
		||||
        try:
 | 
			
		||||
            actor = cls.by_actor_uri(data["actor"])
 | 
			
		||||
            actor.delete()
 | 
			
		||||
        except cls.DoesNotExist:
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
    ### Actor/Webfinger fetching ###
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
 | 
			
		||||
@ -67,7 +67,7 @@ class InboxMessageStates(StateGraph):
 | 
			
		||||
            case "delete":
 | 
			
		||||
                # If there is no object type, it's probably a profile
 | 
			
		||||
                if not isinstance(instance.message["object"], dict):
 | 
			
		||||
                    raise ValueError("Cannot handle activity of type delete")
 | 
			
		||||
                    await sync_to_async(Identity.handle_delete_ap)(instance.message)
 | 
			
		||||
                match instance.message_object_type:
 | 
			
		||||
                    case "tombstone":
 | 
			
		||||
                        await sync_to_async(Post.handle_delete_ap)(instance.message)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user