From b2a067cba6773e64c15f4dc3ce787bbc0f29bd9e Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 12 Jul 2021 10:02:00 +1000 Subject: [PATCH] Re-use existing build paths promise if possible --- .../java/org/session/libsession/snode/OnionRequestAPI.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt index 775b4ff24c..02158c3a3e 100644 --- a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt +++ b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt @@ -27,6 +27,7 @@ private typealias Path = List * See the "Onion Requests" section of [The Session Whitepaper](https://arxiv.org/pdf/2002.04609.pdf) for more information. */ object OnionRequestAPI { + private var buildPathsPromise: Promise, Exception>? = null private val database: LokiAPIDatabaseProtocol get() = SnodeModule.shared.storage private val broadcaster: Broadcaster @@ -158,9 +159,11 @@ object OnionRequestAPI { * enough (reliable) snodes are available. */ private fun buildPaths(reusablePaths: List): Promise, Exception> { + val existingBuildPathsPromise = buildPathsPromise + if (existingBuildPathsPromise != null) { return existingBuildPathsPromise } Log.d("Loki", "Building onion request paths.") broadcaster.broadcast("buildingPaths") - return SnodeAPI.getRandomSnode().bind { // Just used to populate the snode pool + val promise = SnodeAPI.getRandomSnode().bind { // Just used to populate the snode pool val reusableGuardSnodes = reusablePaths.map { it[0] } getGuardSnodes(reusableGuardSnodes).map { guardSnodes -> var unusedSnodes = SnodeAPI.snodePool.minus(guardSnodes).minus(reusablePaths.flatten()) @@ -183,6 +186,10 @@ object OnionRequestAPI { paths } } + promise.success { buildPathsPromise = null } + promise.fail { buildPathsPromise = null } + buildPathsPromise = promise + return promise } /**