Update calls into relay functions

This commit is contained in:
Mike Dilger 2024-08-01 10:13:20 +12:00
parent 0319bcdb00
commit 218392c21d
6 changed files with 49 additions and 89 deletions

View File

@ -7,7 +7,7 @@ use eframe::egui;
use egui::{Context, RichText, Ui}; use egui::{Context, RichText, Ui};
use gossip_lib::comms::ToOverlordMessage; use gossip_lib::comms::ToOverlordMessage;
use gossip_lib::{relay, PersonList, PersonTable, Private, Table, GLOBALS}; use gossip_lib::{relay, PersonList, PersonTable, Private, Table, GLOBALS};
use nostr_types::{Profile, PublicKey, RelayUsage}; use nostr_types::{Profile, PublicKey};
pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Frame, ui: &mut Ui) { pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Frame, ui: &mut Ui) {
if app.wizard_state.pubkey.is_none() && !app.wizard_state.follow_only { if app.wizard_state.pubkey.is_none() && !app.wizard_state.follow_only {
@ -87,11 +87,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
if person.borrow().metadata().is_none() { if person.borrow().metadata().is_none() {
// We don't have metadata // We don't have metadata
if let Ok(outboxes) = relay::get_best_relays_min( if let Ok(outboxes) =
pubkey, relay::get_some_pubkey_outboxes(pubkey)
RelayUsage::Outbox, {
0,
) {
if !outboxes.is_empty() { if !outboxes.is_empty() {
// But we have their outboxes // But we have their outboxes
if !app if !app

View File

@ -3,9 +3,9 @@ use crate::ui::{GossipUi, Page};
use eframe::egui; use eframe::egui;
use egui::{Color32, Context, RichText, Ui}; use egui::{Color32, Context, RichText, Ui};
use gossip_lib::comms::ToOverlordMessage; use gossip_lib::comms::ToOverlordMessage;
use gossip_lib::Relay;
use gossip_lib::GLOBALS; use gossip_lib::GLOBALS;
use gossip_lib::{relay, Relay}; use nostr_types::RelayUrl;
use nostr_types::{RelayUrl, RelayUsage};
use super::continue_control; use super::continue_control;
@ -82,7 +82,7 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
let mut found = false; let mut found = false;
// If we have write relays, show those // If we have write relays, show those
if let Ok(urls) = relay::get_best_relays_min(pubkey, RelayUsage::Outbox, 0) { if let Ok(urls) = Relay::choose_relay_urls(Relay::WRITE, |_| true) {
if !urls.is_empty() { if !urls.is_empty() {
app.vert_scroll_area() app.vert_scroll_area()
.max_width(f32::INFINITY) .max_width(f32::INFINITY)

View File

@ -24,7 +24,7 @@ use minion::{Minion, MinionExitReason};
use nostr_types::{ use nostr_types::{
EncryptedPrivateKey, Event, EventKind, EventReference, Filter, Id, IdHex, Metadata, EncryptedPrivateKey, Event, EventKind, EventReference, Filter, Id, IdHex, Metadata,
MilliSatoshi, NAddr, NostrBech32, PayRequestData, PreEvent, PrivateKey, Profile, PublicKey, MilliSatoshi, NAddr, NostrBech32, PayRequestData, PreEvent, PrivateKey, Profile, PublicKey,
RelayUrl, RelayUsage, Tag, UncheckedUrl, Unixtime, RelayUrl, Tag, UncheckedUrl, Unixtime,
}; };
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
@ -1271,7 +1271,7 @@ impl Overlord {
let mut relay_urls: Vec<RelayUrl> = Vec::new(); let mut relay_urls: Vec<RelayUrl> = Vec::new();
{ {
// Get all of the relays that we write to // Get all of the relays that we write to
let write_relays = Relay::choose_relay_urls(Relay::WRITE, |_| true)?; let write_relays = relay::relays_to_post_to(&event)?;
relay_urls.extend(write_relays); relay_urls.extend(write_relays);
// Get all of the relays this events were seen on // Get all of the relays this events were seen on
@ -1349,7 +1349,7 @@ impl Overlord {
let mut relay_urls: Vec<RelayUrl> = Vec::new(); let mut relay_urls: Vec<RelayUrl> = Vec::new();
{ {
// Get all of the relays that we write to // Get all of the relays that we write to
let write_relays = Relay::choose_relay_urls(Relay::WRITE, |_| true)?; let write_relays = relay::relays_to_post_to(&event)?;
relay_urls.extend(write_relays); relay_urls.extend(write_relays);
// Get all of the relays this event was seen on // Get all of the relays this event was seen on
@ -1656,15 +1656,14 @@ impl Overlord {
} }
}; };
let relays: Vec<Relay> = Relay::choose_relays(Relay::WRITE, |_| true)?; let relays: Vec<RelayUrl> = relay::relays_to_post_to(&event)?;
// FIXME - post it to relays we have seen it on.
for relay in relays { for relay in relays {
// Send it the event to post // Send it the event to post
tracing::debug!("Asking {} to post", &relay.url); tracing::debug!("Asking {} to post", &relay);
self.engage_minion( self.engage_minion(
relay.url.clone(), relay.clone(),
vec![RelayJob { vec![RelayJob {
reason: RelayConnectionReason::PostLike, reason: RelayConnectionReason::PostLike,
payload: ToMinionPayload { payload: ToMinionPayload {
@ -1721,8 +1720,7 @@ impl Overlord {
} }
FeedKind::Person(pubkey) => { FeedKind::Person(pubkey) => {
// Get write relays for the person // Get write relays for the person
let relays: Vec<RelayUrl> = let relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pubkey)?;
relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?;
// Subscribe on each of those write relays // Subscribe on each of those write relays
for relay in relays.iter() { for relay in relays.iter() {
// Subscribe // Subscribe
@ -2069,7 +2067,7 @@ impl Overlord {
// Sort the people into the relays we will find their metadata at // Sort the people into the relays we will find their metadata at
for pubkey in &pubkeys { for pubkey in &pubkeys {
for relay in relay::get_best_relays_fixed(*pubkey, RelayUsage::Outbox)?.drain(..) { for relay in relay::get_some_pubkey_outboxes(*pubkey)?.drain(..) {
map.entry(relay) map.entry(relay)
.and_modify(|e| e.push(*pubkey)) .and_modify(|e| e.push(*pubkey))
.or_insert_with(|| vec![*pubkey]); .or_insert_with(|| vec![*pubkey]);
@ -2187,7 +2185,7 @@ impl Overlord {
let mut relay_urls: Vec<RelayUrl> = Vec::new(); let mut relay_urls: Vec<RelayUrl> = Vec::new();
{ {
// Get all of the relays that we write to // Get all of the relays that we write to
let write_relay_urls: Vec<RelayUrl> = Relay::choose_relay_urls(Relay::WRITE, |_| true)?; let write_relay_urls: Vec<RelayUrl> = relay::relays_to_post_to(&event)?;
relay_urls.extend(write_relay_urls); relay_urls.extend(write_relay_urls);
relay_urls.sort(); relay_urls.sort();
relay_urls.dedup(); relay_urls.dedup();
@ -2373,7 +2371,7 @@ impl Overlord {
} }
async fn set_person_feed(&mut self, pubkey: PublicKey, anchor: Unixtime) -> Result<(), Error> { async fn set_person_feed(&mut self, pubkey: PublicKey, anchor: Unixtime) -> Result<(), Error> {
let relays: Vec<RelayUrl> = relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?; let relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pubkey)?;
for relay in relays.iter() { for relay in relays.iter() {
// Subscribe // Subscribe
@ -2451,7 +2449,7 @@ impl Overlord {
bonus_relays.push(url); bonus_relays.push(url);
} else { } else {
let tagged_person_relays: Vec<RelayUrl> = let tagged_person_relays: Vec<RelayUrl> =
relay::get_best_relays_fixed(pk, RelayUsage::Outbox)?; relay::get_some_pubkey_outboxes(pk)?;
bonus_relays.extend(tagged_person_relays); bonus_relays.extend(tagged_person_relays);
} }
} }
@ -2483,8 +2481,7 @@ impl Overlord {
// Include the relays of the author of the referencing event // Include the relays of the author of the referencing event
if let Some(pk) = author { if let Some(pk) = author {
let author_relays: Vec<RelayUrl> = let author_relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pk)?;
relay::get_best_relays_fixed(pk, RelayUsage::Outbox)?;
bonus_relays.extend(author_relays); bonus_relays.extend(author_relays);
} }
} }
@ -2558,21 +2555,7 @@ impl Overlord {
let mut bonus_relays: Vec<RelayUrl> = Vec::new(); let mut bonus_relays: Vec<RelayUrl> = Vec::new();
if let Some(event) = GLOBALS.storage.read_event(id)? { if let Some(event) = GLOBALS.storage.read_event(id)? {
// Include all the INBOX relays of the author of the event bonus_relays.extend(relay::relays_for_seeking_replies(&event)?);
bonus_relays.extend(relay::get_best_relays_min(
event.pubkey,
RelayUsage::Inbox,
0,
)?);
// Include all the relays where the event was seen
bonus_relays.extend(
GLOBALS
.storage
.get_event_seen_on_relay(id)?
.drain(..)
.map(|(url, _time)| url),
);
} else { } else {
// We don't have the event itself yet. // We don't have the event itself yet.
@ -2588,8 +2571,7 @@ impl Overlord {
// Include the inbox relays of the author of the referencing event // Include the inbox relays of the author of the referencing event
if let Some(pk) = author { if let Some(pk) = author {
let author_relays: Vec<RelayUrl> = let author_relays: Vec<RelayUrl> = relay::get_some_pubkey_outboxes(pk)?;
relay::get_best_relays_min(pk, RelayUsage::Inbox, 0)?;
bonus_relays.extend(author_relays); bonus_relays.extend(author_relays);
} }
} }
@ -2825,7 +2807,7 @@ impl Overlord {
// for it's retry logic // for it's retry logic
GLOBALS.people.metadata_fetch_initiated(&[pubkey]); GLOBALS.people.metadata_fetch_initiated(&[pubkey]);
let best_relays = relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?; let best_relays = relay::get_some_pubkey_outboxes(pubkey)?;
// we do 1 more than num_relays_per_person, which is really for main posts, // we do 1 more than num_relays_per_person, which is really for main posts,
// since metadata is more important and I didn't want to bother with // since metadata is more important and I didn't want to bother with
@ -2862,7 +2844,7 @@ impl Overlord {
let mut map: HashMap<RelayUrl, Vec<PublicKey>> = HashMap::new(); let mut map: HashMap<RelayUrl, Vec<PublicKey>> = HashMap::new();
for pubkey in pubkeys.drain(..) { for pubkey in pubkeys.drain(..) {
let best_relays = relay::get_best_relays_fixed(pubkey, RelayUsage::Outbox)?; let best_relays = relay::get_some_pubkey_outboxes(pubkey)?;
for relay_url in best_relays.iter() { for relay_url in best_relays.iter() {
map.entry(relay_url.to_owned()) map.entry(relay_url.to_owned())
.and_modify(|entry| entry.push(pubkey)) .and_modify(|entry| entry.push(pubkey))
@ -3370,8 +3352,7 @@ impl Overlord {
.collect(); .collect();
// Add the read relays of the target person // Add the read relays of the target person
let target_read_relays: Vec<RelayUrl> = let target_read_relays: Vec<RelayUrl> = relay::get_all_pubkey_inboxes(target_pubkey)?;
relay::get_best_relays_min(target_pubkey, RelayUsage::Inbox, 0)?;
relays.extend(target_read_relays); relays.extend(target_read_relays);
// Add all my write relays // Add all my write relays
@ -3411,6 +3392,7 @@ impl Overlord {
}; };
let event = GLOBALS.identity.sign_event(pre_event)?; let event = GLOBALS.identity.sign_event(pre_event)?;
let serialized_event = serde_json::to_string(&event)?; let serialized_event = serde_json::to_string(&event)?;
let client = reqwest::Client::builder() let client = reqwest::Client::builder()

View File

@ -7,8 +7,8 @@ use crate::storage::{PersonTable, Table};
use dashmap::{DashMap, DashSet}; use dashmap::{DashMap, DashSet};
use image::RgbaImage; use image::RgbaImage;
use nostr_types::{ use nostr_types::{
ContentEncryptionAlgorithm, Event, EventKind, Metadata, PreEvent, PublicKey, RelayUrl, ContentEncryptionAlgorithm, Event, EventKind, Metadata, PreEvent, PublicKey, RelayUrl, Tag,
RelayUsage, Tag, UncheckedUrl, Unixtime, Url, UncheckedUrl, Unixtime, Url,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::BTreeMap; use std::collections::BTreeMap;
@ -667,7 +667,7 @@ impl People {
// Only include recommended relay urls in public entries, and not in the mute list // Only include recommended relay urls in public entries, and not in the mute list
let recommended_relay_url = { let recommended_relay_url = {
if kind != EventKind::MuteList && !private.0 { if kind != EventKind::MuteList && !private.0 {
let relays = relay::get_best_relays_min(*pubkey, RelayUsage::Outbox, 1)?; let relays = relay::get_some_pubkey_outboxes(*pubkey)?;
relays.first().map(|u| u.to_unchecked_url()) relays.first().map(|u| u.to_unchecked_url())
} else { } else {
None None
@ -878,7 +878,7 @@ impl People {
*self.active_person.write().await = Some(pubkey); *self.active_person.write().await = Some(pubkey);
// Load their relays // Load their relays
let best_relays = relay::get_best_relays_min(pubkey, RelayUsage::Outbox, 1)?; let best_relays = relay::get_all_pubkey_outboxes(pubkey)?;
*self.active_persons_write_relays.write().await = best_relays; *self.active_persons_write_relays.write().await = best_relays;
// Load their DM relays // Load their DM relays

View File

@ -1,6 +1,6 @@
use crate::error::{Error, ErrorKind}; use crate::error::{Error, ErrorKind};
use crate::globals::GLOBALS; use crate::globals::GLOBALS;
use crate::relay; use crate::relay::{self, ScoreFactors};
use dashmap::DashMap; use dashmap::DashMap;
pub use nostr_types::{PublicKey, RelayUrl, RelayUsage, Unixtime}; pub use nostr_types::{PublicKey, RelayUrl, RelayUsage, Unixtime};
@ -35,7 +35,7 @@ impl RelayAssignment {
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct RelayPicker { pub struct RelayPicker {
/// A ranking of relays per person. /// A ranking of relays per person.
person_relay_scores: DashMap<PublicKey, Vec<(RelayUrl, u64)>>, person_relay_scores: DashMap<PublicKey, Vec<(RelayUrl, f32)>>,
/// All of the relays currently connected, with their assignment. /// All of the relays currently connected, with their assignment.
relay_assignments: DashMap<RelayUrl, RelayAssignment>, relay_assignments: DashMap<RelayUrl, RelayAssignment>,
@ -171,8 +171,11 @@ impl RelayPicker {
// Compute scores for each person_relay pairing // Compute scores for each person_relay pairing
for pubkey in pubkeys.iter() { for pubkey in pubkeys.iter() {
let best_relays: Vec<(RelayUrl, u64)> = let best_relays: Vec<(RelayUrl, f32)> = relay::get_best_relays_with_score2(
relay::get_best_relays_with_score(*pubkey, RelayUsage::Outbox, 0)?; *pubkey,
RelayUsage::Outbox,
ScoreFactors::RelayScorePlusConnected,
)?;
self.person_relay_scores.insert(*pubkey, best_relays); self.person_relay_scores.insert(*pubkey, best_relays);
@ -241,9 +244,9 @@ impl RelayPicker {
return Err(ErrorKind::NoRelays.into()); return Err(ErrorKind::NoRelays.into());
} }
// Keep score for each relay, start at 0 // Keep score for each relay, start at 0.0
let scoreboard: DashMap<RelayUrl, u64> = let scoreboard: DashMap<RelayUrl, f32> =
all_relays.iter().map(|x| (x.to_owned(), 0)).collect(); all_relays.iter().map(|x| (x.to_owned(), 0.0)).collect();
// Assign scores to relays from each pubkey // Assign scores to relays from each pubkey
for elem in self.person_relay_scores.iter() { for elem in self.person_relay_scores.iter() {
@ -286,35 +289,14 @@ impl RelayPicker {
} }
} }
// Adjust all scores based on relay rank and relay success rate
// (gossip code elided due to complex data tracking required)
// TBD to add this kind of feature back.
for mut score_entry in scoreboard.iter_mut() {
let url = score_entry.key().to_owned();
let score = score_entry.value_mut();
// adjust score
*score = match GLOBALS.storage.read_relay(&url, None) {
Err(_) => 0,
Ok(Some(relay)) => {
if relay.should_avoid() {
0
} else {
*score * (relay.score() * 10.0) as u64
}
}
Ok(None) => *score,
}
}
let winner = scoreboard let winner = scoreboard
.iter() .iter()
.max_by(|x, y| x.value().cmp(y.value())) .max_by(|x, y| x.value().partial_cmp(y.value()).unwrap())
.unwrap(); .unwrap();
let winning_url: RelayUrl = winner.key().to_owned(); let winning_url: RelayUrl = winner.key().to_owned();
let winning_score: u64 = *winner.value(); let winning_score: f32 = *winner.value();
if winning_score == 0 { if winning_score < 0.000000000001 {
return Err(ErrorKind::NoProgress.into()); return Err(ErrorKind::NoProgress.into());
} }
@ -346,7 +328,8 @@ impl RelayPicker {
if *relay == winning_url { if *relay == winning_url {
// Do not assign to this relay if it's not one of their top // Do not assign to this relay if it's not one of their top
// three relays and its score has dropped to 5 or lower. // three relays and its score has dropped to 5 or lower.
if *score <= 5 && i >= 3 { // ******FIXME GINA 5.0 is probably the wrong level now ******
if *score <= 5.0 && i >= 3 {
// in this case we can skip the rest which have lower // in this case we can skip the rest which have lower
// scores and are further down the list // scores and are further down the list
break; break;

View File

@ -6,7 +6,7 @@ use crate::people::People;
use crate::relay; use crate::relay;
use crate::relay::Relay; use crate::relay::Relay;
use dashmap::DashMap; use dashmap::DashMap;
use nostr_types::{Event, EventReference, Id, PublicKey, RelayUrl, RelayUsage, Unixtime}; use nostr_types::{Event, EventReference, Id, PublicKey, RelayUrl, Unixtime};
use std::time::Duration; use std::time::Duration;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -134,13 +134,12 @@ impl Seeker {
// Seek the relay list because it is stale, but don't let that hold us up // Seek the relay list because it is stale, but don't let that hold us up
// using the stale data // using the stale data
Self::minion_seek_relay_list(author); Self::minion_seek_relay_list(author);
let relays = relay::get_some_pubkey_outboxes(author)?;
let relays = relay::get_best_relays_fixed(author, RelayUsage::Outbox)?;
Self::minion_seek_event_at_relays(id, relays); Self::minion_seek_event_at_relays(id, relays);
self.events.insert(id, SeekData::new_event(climb)); self.events.insert(id, SeekData::new_event(climb));
} }
Freshness::Fresh => { Freshness::Fresh => {
let relays = relay::get_best_relays_fixed(author, RelayUsage::Outbox)?; let relays = relay::get_some_pubkey_outboxes(author)?;
Self::minion_seek_event_at_relays(id, relays); Self::minion_seek_event_at_relays(id, relays);
self.events.insert(id, SeekData::new_event(climb)); self.events.insert(id, SeekData::new_event(climb));
} }
@ -171,7 +170,7 @@ impl Seeker {
if let SeekState::WaitingRelayList(author) = data.state { if let SeekState::WaitingRelayList(author) = data.state {
if author == pubkey { if author == pubkey {
let id = *refmutmulti.key(); let id = *refmutmulti.key();
if let Ok(relays) = relay::get_best_relays_fixed(author, RelayUsage::Outbox) { if let Ok(relays) = relay::get_some_pubkey_outboxes(author) {
Self::minion_seek_event_at_relays(id, relays); Self::minion_seek_event_at_relays(id, relays);
updates.push((id, SeekData::new_event(data.climb))); updates.push((id, SeekData::new_event(data.climb)));
} }
@ -236,9 +235,7 @@ impl Seeker {
// Check if we have their relays yet // Check if we have their relays yet
match People::person_needs_relay_list(author) { match People::person_needs_relay_list(author) {
Freshness::Fresh | Freshness::Stale => { Freshness::Fresh | Freshness::Stale => {
if let Ok(relays) = if let Ok(relays) = relay::get_some_pubkey_outboxes(author) {
relay::get_best_relays_fixed(author, RelayUsage::Outbox)
{
Self::minion_seek_event_at_relays(id, relays); Self::minion_seek_event_at_relays(id, relays);
updates.push((id, Some(SeekData::new_event(data.climb)))); updates.push((id, Some(SeekData::new_event(data.climb))));
continue; continue;