commit ef7b666

grunfink  ·  2026-06-24 12:54:45 +0000 UTC
parent 778046f
Implemented semi-random forward_secs in enqueue_object_request() or enqueue_actor_refresh().

If forward_secs is a negative value in these functions, it's used as the modulo
of a hash of the user id. This way, a refresh storm of the same object by all users
is somewhat distributed in time.
2 files changed,  +12, -2
M data.c
+2, -2
 1@@ -3077,7 +3077,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
 2             else {
 3                 /* actor / key mismatch: don't accept blindly, but request an actor update
 4                    from the original source, as the Update may come from a relay and be legit */
 5-                enqueue_actor_refresh(snac, actor, 0);
 6+                enqueue_actor_refresh(snac, actor, -10);
 7 
 8                 snac_log(snac, xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id));
 9             }
10@@ -3097,7 +3097,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
11                 else
12                 if (strcmp(atto, key_id) != 0) {
13                     /* actor / key mismatch: request the object from the original source */
14-                    enqueue_object_request(snac, id, 0);
15+                    enqueue_object_request(snac, id, -10);
16 
17                     snac_log(snac, xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id));
18                 }
M data.c
+10, -0
 1@@ -3858,6 +3858,11 @@ void enqueue_close_question(snac *user, const char *id, int end_secs)
 2 void enqueue_object_request(snac *user, const char *id, int forward_secs)
 3 /* enqueues the request of an object in the future */
 4 {
 5+    if (forward_secs < 0) {
 6+        /* set it to a somewhat random delay */
 7+        forward_secs = xs_hash_func(user->uid, strlen(user->uid)) % -forward_secs;
 8+    }
 9+
10     xs *qmsg = _new_qmsg("object_request", id, 0);
11     xs *ntid = tid(forward_secs);
12     xs *fn   = xs_fmt("%s/queue/%s.json", user->basedir, ntid);
13@@ -3886,6 +3891,11 @@ void enqueue_verify_links(snac *user)
14 void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs)
15 /* enqueues an actor refresh */
16 {
17+    if (forward_secs < 0) {
18+        /* set it to a somewhat random delay */
19+        forward_secs = xs_hash_func(user->uid, strlen(user->uid)) % -forward_secs;
20+    }
21+
22     xs *qmsg = _new_qmsg("actor_refresh", "", 0);
23     xs *ntid = tid(forward_secs);
24     xs *fn   = xs_fmt("%s/queue/%s.json", user->basedir, ntid);