From 8f0d59f9b88d1f65d00b7f976b5c42d3a0928e8c Mon Sep 17 00:00:00 2001 From: Maxim Shishmarev Date: Mon, 20 Jul 2020 12:31:56 +1000 Subject: [PATCH] Fix not shuffling nodes requested for pubkey --- js/modules/loki_message_api.js | 4 +++- ts/session/snode_api/serviceNodeAPI.ts | 8 ++++---- ts/session/snode_api/snodePool.ts | 10 +++++----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/js/modules/loki_message_api.js b/js/modules/loki_message_api.js index 3c7d9b7f7..1878e24f7 100644 --- a/js/modules/loki_message_api.js +++ b/js/modules/loki_message_api.js @@ -87,7 +87,9 @@ class LokiMessageAPI { data: data64, }; - const promises = _.slice(swarm, 0, numConnections).map(snode => + const usedNodes = _.slice(swarm, 0, numConnections); + + const promises = usedNodes.map(snode => _openSendConnection(snode, params) ); diff --git a/ts/session/snode_api/serviceNodeAPI.ts b/ts/session/snode_api/serviceNodeAPI.ts index 2742fa9a4..41d5daf6e 100644 --- a/ts/session/snode_api/serviceNodeAPI.ts +++ b/ts/session/snode_api/serviceNodeAPI.ts @@ -152,7 +152,7 @@ interface SendParams { } // get snodes for pubkey from random snode. Uses an existing snode -export async function getSnodesForPubkey( +export async function requestSnodesForPubkey( pubKey: string ): Promise> { const { log } = window; @@ -170,7 +170,7 @@ export async function getSnodesForPubkey( if (!result) { log.warn( - `LokiSnodeAPI::_getSnodesForPubkey - lokiRpc on ${snode.ip}:${snode.port} returned falsish value`, + `LokiSnodeAPI::requestSnodesForPubkey - lokiRpc on ${snode.ip}:${snode.port} returned falsish value`, result ); return []; @@ -189,7 +189,7 @@ export async function getSnodesForPubkey( if (!json.snodes) { // we hit this when snode gives 500s log.warn( - `LokiSnodeAPI::_getSnodesForPubkey - lokiRpc on ${snode.ip}:${snode.port} returned falsish value for snodes`, + `LokiSnodeAPI::requestSnodesForPubkey - lokiRpc on ${snode.ip}:${snode.port} returned falsish value for snodes`, result ); return []; @@ -204,7 +204,7 @@ export async function getSnodesForPubkey( return []; } } catch (e) { - log.error('LokiSnodeAPI::_getSnodesForPubkey - error', e.code, e.message); + log.error('LokiSnodeAPI::requestSnodesForPubkey - error', e.code, e.message); if (snode) { markNodeUnreachable(snode); diff --git a/ts/session/snode_api/snodePool.ts b/ts/session/snode_api/snodePool.ts index 6f039c367..13da2178f 100644 --- a/ts/session/snode_api/snodePool.ts +++ b/ts/session/snode_api/snodePool.ts @@ -4,9 +4,9 @@ import { } from '../../../js/modules/loki_primitives'; import { - getSnodesForPubkey, getSnodesFromSeedUrl, getVersion, + requestSnodesForPubkey, } from './serviceNodeAPI'; import * as Data from '../../../js/modules/data'; @@ -117,6 +117,8 @@ export function markNodeUnreachable(snode: Snode): void { export async function getRandomSnodeAddress(): Promise { // resolve random snode if (randomSnodePool.length === 0) { + // TODO: ensure that we only call this once at a time + // Should not this be saved to the database? await refreshRandomPool([]); if (randomSnodePool.length === 0) { @@ -331,11 +333,9 @@ async function internalUpdateSnodesFor(pubkey: string, edkeys: Array) { } export async function getSnodesFor(pubkey: string): Promise> { - let maybeNodes = nodesForPubkey.get(pubkey); + const maybeNodes = nodesForPubkey.get(pubkey); let nodes: Array; - maybeNodes = []; - // NOTE: important that maybeNodes is not [] here if (maybeNodes === undefined) { // First time access, try the database: @@ -352,7 +352,7 @@ export async function getSnodesFor(pubkey: string): Promise> { if (goodNodes.length < MIN_NODES) { // Request new node list from the network - const freshNodes = await getSnodesForPubkey(pubkey); + const freshNodes = _.shuffle(await requestSnodesForPubkey(pubkey)); const edkeys = freshNodes.map((n: Snode) => n.pubkey_ed25519); // tslint:disable-next-line no-floating-promises