Kaynağa Gözat

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.
grunfink 1 ay önce
ebeveyn
işleme
ef7b66697f
2 değiştirilmiş dosya ile 12 ekleme ve 2 silme
  1. 2 2
      activitypub.c
  2. 10 0
      data.c

+ 2 - 2
activitypub.c

@@ -3077,7 +3077,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
             else {
                 /* actor / key mismatch: don't accept blindly, but request an actor update
                    from the original source, as the Update may come from a relay and be legit */
-                enqueue_actor_refresh(snac, actor, 0);
+                enqueue_actor_refresh(snac, actor, -10);
 
                 snac_log(snac, xs_fmt("Update: mismatched actor '%s' and key '%s'", actor, key_id));
             }
@@ -3097,7 +3097,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
                 else
                 if (strcmp(atto, key_id) != 0) {
                     /* actor / key mismatch: request the object from the original source */
-                    enqueue_object_request(snac, id, 0);
+                    enqueue_object_request(snac, id, -10);
 
                     snac_log(snac, xs_fmt("Update: mismatched attributedTo '%s' and key '%s'", atto, key_id));
                 }

+ 10 - 0
data.c

@@ -3858,6 +3858,11 @@ void enqueue_close_question(snac *user, const char *id, int end_secs)
 void enqueue_object_request(snac *user, const char *id, int forward_secs)
 /* enqueues the request of an object in the future */
 {
+    if (forward_secs < 0) {
+        /* set it to a somewhat random delay */
+        forward_secs = xs_hash_func(user->uid, strlen(user->uid)) % -forward_secs;
+    }
+
     xs *qmsg = _new_qmsg("object_request", id, 0);
     xs *ntid = tid(forward_secs);
     xs *fn   = xs_fmt("%s/queue/%s.json", user->basedir, ntid);
@@ -3886,6 +3891,11 @@ void enqueue_verify_links(snac *user)
 void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs)
 /* enqueues an actor refresh */
 {
+    if (forward_secs < 0) {
+        /* set it to a somewhat random delay */
+        forward_secs = xs_hash_func(user->uid, strlen(user->uid)) % -forward_secs;
+    }
+
     xs *qmsg = _new_qmsg("actor_refresh", "", 0);
     xs *ntid = tid(forward_secs);
     xs *fn   = xs_fmt("%s/queue/%s.json", user->basedir, ntid);