feat(discovery): preserve existing advert metadata during discovery result persistence

Enhanced the `persist_discovery_result` function to retain advert metadata such as `node_name`, `latitude`, and `longitude` from existing records when updating neighbor information. This prevents overwriting valuable metadata with `None` values during SQLite updates. Added a corresponding test to verify that existing metadata is preserved correctly during the discovery process.
This commit is contained in:
agessaman
2026-07-29 13:41:27 -07:00
parent 2b8be8cb7e
commit 1221734ca2
2 changed files with 61 additions and 0 deletions
+20
View File
@@ -93,6 +93,26 @@ def persist_discovery_result(storage, result: dict) -> bool:
logger.debug("Storage backend cannot persist discovery results")
return False
# Discovery responses do not carry advert metadata such as name or location.
# Preserve those fields from an existing advert instead of replacing them
# with None when SQLite updates the neighbor row.
reader = getattr(storage, "get_neighbors", None)
if callable(reader):
try:
neighbors = reader()
if isinstance(neighbors, dict):
existing = neighbors.get(record["pubkey"])
if isinstance(existing, dict):
for field in ("node_name", "latitude", "longitude"):
if record.get(field) is None:
record[field] = existing.get(field)
except Exception as e:
logger.debug(
"Failed to read existing discovery metadata for %s: %s",
record["pubkey"][:8],
e,
)
try:
writer(record)
return True
+41
View File
@@ -513,6 +513,47 @@ def test_discovery_auto_add_persists_through_the_storage_actually_wired_in():
assert record["rssi"] == -70
def test_discovery_auto_add_preserves_existing_advert_name_and_location(tmp_path):
"""Discovery responses must not erase metadata learned from real adverts."""
from repeater.data_acquisition.sqlite_handler import SQLiteHandler
from repeater.handler_helpers.discovery import persist_discovery_result
pubkey = "22" * 32
storage = SQLiteHandler(tmp_path)
storage.store_advert(
{
"timestamp": 100.0,
"pubkey": pubkey,
"node_name": "Named Repeater",
"is_repeater": True,
"route_type": 1,
"contact_type": "Repeater",
"latitude": 37.5,
"longitude": -122.25,
"rssi": -80,
"snr": 2.0,
"zero_hop": True,
}
)
assert persist_discovery_result(
storage,
{
"pub_key": pubkey,
"node_type": 2,
"rssi": -65,
"response_snr": 6.5,
},
)
neighbor = storage.get_neighbors()[pubkey]
assert neighbor["node_name"] == "Named Repeater"
assert neighbor["latitude"] == 37.5
assert neighbor["longitude"] == -122.25
assert neighbor["rssi"] == -65
assert neighbor["snr"] == 6.5
def test_discovery_auto_add_prefers_record_advert_when_the_collector_is_wired_in():
"""StorageCollector.record_advert also publishes the advert; prefer it."""
from repeater.data_acquisition.storage_collector import StorageCollector