Pasture: Smithereen 1.0.3, and failed server descriptions retried

Smithereen joins the pasture (tools/pasture/peers/smithereen.sh): its image on the shared MySQL, with imgproxy and a
file server behind Caddy, a JDK trust store with the pasture's CA, accounts from its signup form, and a password grant
for a local application. scenarios/smithereen.sh drives its VKontakte-like API: friends as mutual follows, wall posts,
comments, likes, reposts (quotes there), polls, edits, deletions, private messages, the unfollow and statistics, 30
checks. A post on someone else's wall never reaches PrivaPub, since Smithereen sends it only to servers whose actors
publish a wall: G-0009, waiting for the owner.

PrivaPub: a server description that failed (Smithereen serves no NodeInfo until it has a description) frees its week,
so the server's next arrival asks again instead of a week later.

The shared Postgres takes 400 connections: at 100 the village seed ran it dry (Sharkey's API answered 500, Misskey
dropped deliveries). The seeder records a follow that stands from an earlier seed when the step itself fails, so the
checker no longer expects that follower to see nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-05 22:03:35 +02:00
1 parent 7b0377c85f
commit 5f150b7a59
12 files changed
+367 -5

No files matched your search

+14 -1
View File
@@ -203,7 +203,20 @@ class Seeder:
# -- the graph
def v_follow(self, s):
platform = s["actor"].split("/")[0]
outcome = driver(platform).follow(self.session(s["actor"]), self.acct(s["args"]["target"]))
d, sess, acct = driver(platform), self.session(s["actor"]), self.acct(s["args"]["target"])
try:
outcome = d.follow(sess, acct)
except Exception:
# the accounts outlive a run: a follow that failed here may stand from an earlier seed, and the checker must
# know it, or it expects the follower to see nothing of the target's followers-only posts
try:
rel = d.relationship(sess, acct)
except Exception:
rel = {}
if rel.get("following") or rel.get("requested"):
self.ledger.add(type="relation", n=s["n"], verb="follow", actor=s["actor"], target=s["args"]["target"],
state="accepted" if rel.get("following") else "requested", observed=True)
raise
self.ledger.add(type="relation", n=s["n"], verb="follow", actor=s["actor"], target=s["args"]["target"], state=outcome)
def _wait_pending(self, s):