mirror of
https://github.com/MeshCore-Beacon/beacon-server.git
synced 2026-10-23 03:01:41 +00:00
perf: known_routes retention, digest identity, and a working batched reconfirm (#98)
* fix: cascade channel_messages on packet delete * rebuild known_routes keyed on (iata, path_key) * add route retention delete, batch reconfirm, path_key upsert * compute route path_key in store, add DeleteOldRoutes * add routes retention config * wire route retention into cleanup, batch reconfirm * prune routes in reconfirm task, not cleanup * expand routes retention docs in example config
This commit is contained in:
1 parent
c6d23a2b52
commit
7d759d0a0f
13 files changed
+473
-118
No files matched your search
+59
-25
@@ -533,6 +533,13 @@ DELETE FROM nodes
|
||||
WHERE last_seen < $1
|
||||
AND id NOT IN (SELECT owner_node_id FROM observer_owners WHERE owner_node_id IS NOT NULL);
|
||||
|
||||
-- name: DeleteOldRoutes :exec
|
||||
-- Deletes routes not observed since the retention cutoff ($1), and rarely-observed
|
||||
-- routes (observation_count < $2) not observed since the grace cutoff ($3).
|
||||
DELETE FROM known_routes
|
||||
WHERE last_seen < $1
|
||||
OR (observation_count < $2 AND last_seen < $3);
|
||||
|
||||
-- name: DeleteOldChannelIATAs :exec
|
||||
-- Keeps the channel IATA filter in step with packet retention.
|
||||
DELETE FROM channel_iatas WHERE last_heard < $1;
|
||||
@@ -1070,12 +1077,11 @@ ORDER BY t.last_heard_at DESC;
|
||||
-- ============================================================
|
||||
|
||||
-- name: UpsertKnownRoute :exec
|
||||
-- Inserts or updates a known route (all hops resolved to high confidence).
|
||||
-- node_ids and hash_prefix are ordered arrays of the resolved node UUIDs and
|
||||
-- their hash bytes. last_seen is bumped on conflict.
|
||||
INSERT INTO known_routes (node_ids, hash_prefix, iata, hop_count)
|
||||
VALUES ($1, $2, $3, $4)
|
||||
ON CONFLICT (node_ids, iata) DO UPDATE SET
|
||||
-- Route identity is path_key, an md5 of node_ids computed by the caller.
|
||||
-- On conflict, observation_count and last_seen are bumped.
|
||||
INSERT INTO known_routes (path_key, node_ids, hash_prefix, iata, hop_count)
|
||||
VALUES ($1, $2, $3, $4, $5)
|
||||
ON CONFLICT (iata, path_key) DO UPDATE SET
|
||||
last_seen = NOW(),
|
||||
observation_count = known_routes.observation_count + 1;
|
||||
|
||||
@@ -1216,27 +1222,55 @@ REFRESH MATERIALIZED VIEW CONCURRENTLY mv_top_advertisers_by_iata;
|
||||
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_radio_presets;
|
||||
|
||||
-- name: ReconfirmRoutes :exec
|
||||
-- Delete known_routes where any hop node has departed from node_short_ids for
|
||||
-- that IATA, or where any hop's prefix_4 is now ambiguous (matches >1 node).
|
||||
DELETE FROM known_routes kr
|
||||
WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM unnest(kr.node_ids) AS hop_node_id
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM node_short_ids ns
|
||||
WHERE ns.node_id = hop_node_id
|
||||
AND ns.iata = kr.iata
|
||||
-- Checks the $1 least-recently-reconfirmed routes: deletes those with a departed
|
||||
-- hop node or a hop prefix now matching >1 node in that IATA (length-aware:
|
||||
-- 1/2/3/4-byte hop prefixes check prefix_1/2/3/4), and stamps the survivors.
|
||||
WITH batch AS (
|
||||
SELECT iata, path_key, node_ids, hash_prefix
|
||||
FROM known_routes
|
||||
ORDER BY last_reconfirmed_at
|
||||
LIMIT $1
|
||||
),
|
||||
amb AS MATERIALIZED (
|
||||
SELECT iata, 1 AS len, prefix_1 AS p FROM node_short_ids GROUP BY iata, prefix_1 HAVING COUNT(*) > 1
|
||||
UNION ALL
|
||||
SELECT iata, 2, prefix_2 FROM node_short_ids GROUP BY iata, prefix_2 HAVING COUNT(*) > 1
|
||||
UNION ALL
|
||||
SELECT iata, 3, prefix_3 FROM node_short_ids GROUP BY iata, prefix_3 HAVING COUNT(*) > 1
|
||||
UNION ALL
|
||||
SELECT iata, 4, prefix_4 FROM node_short_ids GROUP BY iata, prefix_4 HAVING COUNT(*) > 1
|
||||
),
|
||||
dead AS (
|
||||
SELECT b.iata, b.path_key
|
||||
FROM batch b
|
||||
WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM unnest(b.node_ids) AS hop_node_id
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM node_short_ids ns
|
||||
WHERE ns.node_id = hop_node_id
|
||||
AND ns.iata = b.iata
|
||||
)
|
||||
)
|
||||
UNION
|
||||
SELECT DISTINCT b.iata, b.path_key
|
||||
FROM batch b
|
||||
CROSS JOIN LATERAL unnest(b.hash_prefix) AS hp
|
||||
JOIN amb a ON a.iata = b.iata AND a.len = length(hp) AND a.p = hp
|
||||
),
|
||||
deleted AS (
|
||||
DELETE FROM known_routes kr
|
||||
USING dead d
|
||||
WHERE kr.iata = d.iata AND kr.path_key = d.path_key
|
||||
)
|
||||
OR EXISTS (
|
||||
SELECT 1
|
||||
FROM unnest(kr.hash_prefix) AS hop_prefix
|
||||
WHERE (
|
||||
SELECT COUNT(*) FROM node_short_ids ns
|
||||
WHERE ns.iata = kr.iata
|
||||
AND ns.prefix_4 = hop_prefix
|
||||
) > 1
|
||||
);
|
||||
UPDATE known_routes kr
|
||||
SET last_reconfirmed_at = NOW()
|
||||
FROM batch b
|
||||
WHERE kr.iata = b.iata AND kr.path_key = b.path_key
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM dead d
|
||||
WHERE d.iata = b.iata AND d.path_key = b.path_key
|
||||
);
|
||||
|
||||
-- name: ReconfirmNeighbors :exec
|
||||
-- Delete node_neighbors where the neighbor has departed from node_short_ids
|
||||
|
||||
Reference in new issue
Block a user