actor: use LFU cache to break cycles
This commit is contained in:
parent
9c55d307ab
commit
692cf89195
|
@ -164,19 +164,27 @@ def distill_object_id(activity):
|
||||||
|
|
||||||
|
|
||||||
async def handle_relay(actor, data, request):
|
async def handle_relay(actor, data, request):
|
||||||
|
global CACHE
|
||||||
|
|
||||||
object_id = distill_object_id(data)
|
object_id = distill_object_id(data)
|
||||||
|
|
||||||
|
if object_id in CACHE:
|
||||||
|
logging.debug('>> already relayed %r as %r', object_id, CACHE[object_id])
|
||||||
|
return
|
||||||
|
|
||||||
# don't relay mastodon announces -- causes LRP fake direction issues
|
# don't relay mastodon announces -- causes LRP fake direction issues
|
||||||
if data['type'] == 'Announce' and len(data.get('cc', [])) > 0:
|
if data['type'] == 'Announce' and len(data.get('cc', [])) > 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
activity_id = "https://{}/activities/{}".format(request.host, uuid.uuid4())
|
||||||
|
|
||||||
message = {
|
message = {
|
||||||
"@context": "https://www.w3.org/ns/activitystreams",
|
"@context": "https://www.w3.org/ns/activitystreams",
|
||||||
"type": "Announce",
|
"type": "Announce",
|
||||||
"to": ["https://{}/actor/followers".format(request.host)],
|
"to": ["https://{}/actor/followers".format(request.host)],
|
||||||
"actor": "https://{}/actor".format(request.host),
|
"actor": "https://{}/actor".format(request.host),
|
||||||
"object": object_id,
|
"object": object_id,
|
||||||
"id": "https://{}/activities/{}".format(request.host, uuid.uuid4())
|
"id": activity_id
|
||||||
}
|
}
|
||||||
|
|
||||||
logging.debug('>> relay: %r', message)
|
logging.debug('>> relay: %r', message)
|
||||||
|
@ -186,6 +194,8 @@ async def handle_relay(actor, data, request):
|
||||||
futures = [push_message_to_actor({'inbox': inbox}, message, 'https://{}/actor#main-key'.format(request.host)) for inbox in inboxes]
|
futures = [push_message_to_actor({'inbox': inbox}, message, 'https://{}/actor#main-key'.format(request.host)) for inbox in inboxes]
|
||||||
asyncio.ensure_future(asyncio.gather(*futures))
|
asyncio.ensure_future(asyncio.gather(*futures))
|
||||||
|
|
||||||
|
CACHE[object_id] = activity_id
|
||||||
|
|
||||||
|
|
||||||
async def handle_follow(actor, data, request):
|
async def handle_follow(actor, data, request):
|
||||||
global DATABASE
|
global DATABASE
|
||||||
|
|
Loading…
Reference in a new issue