on master help sign in
Fix 4 bugs: remove dead code, handle long strings in safeCompare, parallelize federation I/O, prevent overlapping prune cycles
commit55073b24cbe7d0ad09d68699068fe1e06cf596df authoriko <mail@iko.soy> dateWed 8 Apr 2026, 14:32 (6 months ago) parent40ea04c
1 file changed+19−24
server.knot+19−24
server.knot+19−24
@@ -236,12 +236,6 @@ isAllDigitsOrDotsUntilColonOrEnd = \s ->
236236 else if isDigitChar (take 1 s) || take 1 s == "." then isAllDigitsOrDotsUntilColonOrEnd (drop 1 s)
237237 else False {}
238238
239−isAllDigitsUntilColonOrEnd = \s ->
240− if s == "" then True {}
241− else if take 1 s == ":" then True {}
242− else if isDigitChar (take 1 s) then isAllDigitsUntilColonOrEnd (drop 1 s)
243− else False {}
244−
245239toLowerChar = \c ->
246240 if c == "A" then "a" else if c == "B" then "b" else if c == "C" then "c"
247241 else if c == "D" then "d" else if c == "E" then "e" else if c == "F" then "f"
@@ -393,8 +387,8 @@ evictOldestAckedIds = \items n ->
393387 in diff items toEvict
394388
395389safeCompareLoop = \s1 s2 n result ->
396− if n <= 0
397− then result + (if s1 == "" then 0 else 1) + (if s2 == "" then 0 else 1)
390+ if n <= 0 && s1 == "" && s2 == ""
391+ then result
398392 else safeCompareLoop (drop 1 s1) (drop 1 s2) (n - 1) (result + (if take 1 s1 == take 1 s2 then 0 else 1))
399393
400394safeCompare = \a b ->
@@ -410,7 +404,7 @@ sendToEach = \servers action ->
410404 if server == ""
411405 then yield {}
412406 else do
413− action server
407+ fork (action server)
414408 sendToEach rest action
415409
416410pruneExpired = \t -> do
@@ -551,20 +545,21 @@ sendAcksAndClean = \pendingAcks servers ->
551545 if server == ""
552546 then yield {}
553547 else do
554− let serverAcks = do a <- pendingAcks; where a.originServer == server; yield a
555− result <- fetch (federationScheme ++ server) (FederationAck {
556− authorization: "Bearer " ++ federationSecret,
557− messageIds: (do a <- serverAcks; yield a.messageId),
558− originServer: server, fromServer: serverHostN})
559− case result of
560− Ok _ ->
561− atomic do
562− ackedIds <- *ackedIds
563− set *ackedIds = do
564− a <- ackedIds
565− where not (a.originServer == server && count (do sa <- serverAcks; where sa.messageId == a.messageId; where sa.toKey == a.toKey; yield sa) > 0)
566− yield a
567− Err _ -> yield {}
548+ fork (do
549+ let serverAcks = do a <- pendingAcks; where a.originServer == server; yield a
550+ result <- fetch (federationScheme ++ server) (FederationAck {
551+ authorization: "Bearer " ++ federationSecret,
552+ messageIds: (do a <- serverAcks; yield a.messageId),
553+ originServer: server, fromServer: serverHostN})
554+ case result of
555+ Ok _ ->
556+ atomic do
557+ ackedIds <- *ackedIds
558+ set *ackedIds = do
559+ a <- ackedIds
560+ where not (a.originServer == server && count (do sa <- serverAcks; where sa.messageId == a.messageId; where sa.toKey == a.toKey; yield sa) > 0)
561+ yield a
562+ Err _ -> yield {})
568563 sendAcksAndClean pendingAcks rest
569564
570565pollOnce = \token cursor -> do
@@ -1378,7 +1373,6 @@ backgroundPrune = do
13781373 where not (a.originServer == serverHostN)
13791374 yield a
13801375 yield {expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, pendingForwards: pendingForwards, pendingAcks: pendingAcks}
1381− fork backgroundPrune
13821376 broadcastOfflineGossip t result.peerServers result.expiredLocal
13831377 if not (federationSecret == "") && count result.pendingForwards > 0
13841378 then retryPendingForwards result.pendingForwards
@@ -1390,6 +1384,7 @@ backgroundPrune = do
13901384 else union acc [a.originServer]) [] result.pendingAcks
13911385 sendAcksAndClean result.pendingAcks ackOriginServers
13921386 else yield {}
1387+ fork backgroundPrune
13931388
13941389main = do
13951390 println "Skrepka relay server starting on port 8080..."