From f025d6c69f93e5c963a2efd00a092068344238b8 Mon Sep 17 00:00:00 2001 From: nazeh Date: Fri, 4 Oct 2024 10:37:18 +0300 Subject: [PATCH 1/2] feat(server): pkarr relay should return expired packets as a last resort --- server/src/handlers.rs | 47 ++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/server/src/handlers.rs b/server/src/handlers.rs index 28908ed..b7f8e5c 100644 --- a/server/src/handlers.rs +++ b/server/src/handlers.rs @@ -4,6 +4,7 @@ use axum::{extract::State, response::IntoResponse}; use bytes::Bytes; use http::{header, StatusCode}; +use pkarr::mainline::MutableItem; use tracing::error; use pkarr::{PublicKey, DEFAULT_MAXIMUM_TTL, DEFAULT_MINIMUM_TTL}; @@ -50,22 +51,38 @@ pub async fn get( let public_key = PublicKey::try_from(public_key.as_str()) .map_err(|error| Error::new(StatusCode::BAD_REQUEST, Some(error)))?; - if let Some(signed_packet) = - state + let signed_packet = { + if let Some(signed_packet) = + state + .client + .resolve(&public_key) + .await + .map_err(|error| match error { + pkarr::Error::DhtIsShutdown => { + error!("Dht is shutdown"); + Error::with_status(StatusCode::INTERNAL_SERVER_ERROR) + } + error => { + error!(?error, "Unexpected error"); + Error::with_status(StatusCode::INTERNAL_SERVER_ERROR) + } + })? + { + Some(signed_packet) + } else if let Some(signed_packet) = state .client - .resolve(&public_key) - .await - .map_err(|error| match error { - pkarr::Error::DhtIsShutdown => { - error!("Dht is shutdown"); - Error::with_status(StatusCode::INTERNAL_SERVER_ERROR) - } - error => { - error!(?error, "Unexpected error"); - Error::with_status(StatusCode::INTERNAL_SERVER_ERROR) - } - })? - { + .cache() + .get_read_only(&MutableItem::target_from_key(public_key.as_bytes(), &None)) + { + // Respond with what we have, even if expired. + // TODO: move this fallback to the client itself, closing #67 + Some(signed_packet) + } else { + None + } + }; + + if let Some(signed_packet) = signed_packet { let body = signed_packet.to_relay_payload(); let ttl = signed_packet.ttl(DEFAULT_MINIMUM_TTL, DEFAULT_MAXIMUM_TTL); From 775efe32947931bacfc1daf49f3d66df1901c6f0 Mon Sep 17 00:00:00 2001 From: nazeh Date: Fri, 4 Oct 2024 11:02:20 +0300 Subject: [PATCH 2/2] chore(server): clippy issues and add tracing::debug --- server/src/handlers.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/server/src/handlers.rs b/server/src/handlers.rs index b7f8e5c..3449a1d 100644 --- a/server/src/handlers.rs +++ b/server/src/handlers.rs @@ -69,20 +69,19 @@ pub async fn get( })? { Some(signed_packet) - } else if let Some(signed_packet) = state - .client - .cache() - .get_read_only(&MutableItem::target_from_key(public_key.as_bytes(), &None)) - { + } else { // Respond with what we have, even if expired. // TODO: move this fallback to the client itself, closing #67 - Some(signed_packet) - } else { - None + state + .client + .cache() + .get_read_only(&MutableItem::target_from_key(public_key.as_bytes(), &None)) } }; if let Some(signed_packet) = signed_packet { + tracing::debug!(?public_key, "cache hit responding with packet!"); + let body = signed_packet.to_relay_payload(); let ttl = signed_packet.ttl(DEFAULT_MINIMUM_TTL, DEFAULT_MAXIMUM_TTL);