Cache actors

This commit is contained in:
Thomas Sileo 2018-07-11 20:04:48 +02:00
parent 8acc17da8b
commit 1adeee308f
2 changed files with 30 additions and 1 deletions

View file

@ -10,6 +10,7 @@ from typing import Optional
from bson.objectid import ObjectId from bson.objectid import ObjectId
from feedgen.feed import FeedGenerator from feedgen.feed import FeedGenerator
from html2text import html2text from html2text import html2text
from cachetools import LRUCache
import tasks import tasks
from config import BASE_URL from config import BASE_URL
@ -31,6 +32,9 @@ from utils.media import Kind
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
ACTORS_CACHE = LRUCache(maxsize=256)
def _remove_id(doc: ap.ObjectType) -> ap.ObjectType: def _remove_id(doc: ap.ObjectType) -> ap.ObjectType:
"""Helper for removing MongoDB's `_id` field.""" """Helper for removing MongoDB's `_id` field."""
doc = doc.copy() doc = doc.copy()
@ -140,7 +144,7 @@ class MicroblogPubBackend(Backend):
) )
) )
def fetch_iri(self, iri: str) -> ap.ObjectType: def _fetch_iri(self, iri: str) -> ap.ObjectType:
if iri == ME["id"]: if iri == ME["id"]:
return ME return ME
@ -168,6 +172,30 @@ class MicroblogPubBackend(Backend):
# Fetch the URL via HTTP # Fetch the URL via HTTP
return super().fetch_iri(iri) return super().fetch_iri(iri)
def fetch_iri(self, iri: str) -> ap.ObjectType:
if iri == ME["id"]:
return ME
if iri in ACTORS_CACHE:
return ACTORS_CACHE[iri]
data = DB.actors.find_one({"remote_id": iri})
if data:
ACTORS_CACHE[iri] = data['data']
return data['data']
data = self._fetch_iri(iri)
if ap._has_type(data["type"], ap.ACTOR_TYPES):
# Cache the actor
DB.actors.update_one(
{"remote_id": iri},
{"$set": {"remote_id": iri, "data": data}},
upsert=True,
)
ACTORS_CACHE[iri] = data
return data
@ensure_it_is_me @ensure_it_is_me
def inbox_check_duplicate(self, as_actor: ap.Person, iri: str) -> bool: def inbox_check_duplicate(self, as_actor: ap.Person, iri: str) -> bool:
return bool(DB.activities.find_one({"box": Box.INBOX.value, "remote_id": iri})) return bool(DB.activities.find_one({"box": Box.INBOX.value, "remote_id": iri}))

View file

@ -20,3 +20,4 @@ git+https://github.com/erikriver/opengraph.git
git+https://github.com/tsileo/little-boxes.git git+https://github.com/tsileo/little-boxes.git
pyyaml pyyaml
pillow pillow
cachetools