diff --git a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt index 24c84275bf..0206c61fa8 100644 --- a/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt +++ b/core/src/main/kotlin/net/corda/core/messaging/CordaRPCOps.kt @@ -112,9 +112,10 @@ interface CordaRPCOps : RPCOps { fun currentNodeTime(): Instant /** - * Returns whether the node has registered with the network map. + * Returns an Observable emitting a single Unit once the node is registered with the network map. */ - fun isRegisteredWithNetworkMap(): Boolean + @RPCReturnsObservables + fun waitUntilRegisteredWithNetworkMap(): Observable // TODO These need rethinking. Instead of these direct calls we should have a way of replicating a subset of // the node's state locally and query that directly. diff --git a/node/src/main/kotlin/net/corda/node/driver/Driver.kt b/node/src/main/kotlin/net/corda/node/driver/Driver.kt index d57d8ff232..910e94f74a 100644 --- a/node/src/main/kotlin/net/corda/node/driver/Driver.kt +++ b/node/src/main/kotlin/net/corda/node/driver/Driver.kt @@ -334,7 +334,7 @@ open class DriverDSL( client.start(ArtemisMessagingComponent.NODE_USER, ArtemisMessagingComponent.NODE_USER) return@poll client.proxy() } catch(e: Exception) { - log.error("Retrying query node info at $nodeAddress") + log.error("Exception $e, Retrying RPC connection at $nodeAddress") null } } @@ -380,12 +380,8 @@ open class DriverDSL( registerProcess(processFuture) return processFuture.flatMap { process -> establishRpc(messagingAddress, configuration).flatMap { rpc -> - poll(executorService, "$name to register with the network map") { - if (rpc.isRegisteredWithNetworkMap()) { - NodeHandle(rpc.nodeIdentity(), rpc, configuration, process) - } else { - null - } + rpc.waitUntilRegisteredWithNetworkMap().toFuture().map { + NodeHandle(rpc.nodeIdentity(), rpc, configuration, process) } } } diff --git a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt index 1d74e409cd..736b1eeff1 100644 --- a/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt +++ b/node/src/main/kotlin/net/corda/node/internal/CordaRPCOpsImpl.kt @@ -111,8 +111,7 @@ class CordaRPCOpsImpl( } } - override fun isRegisteredWithNetworkMap() = services.networkMapCache.mapServiceRegistered.isDone - + override fun waitUntilRegisteredWithNetworkMap() = services.networkMapCache.mapServiceRegistered.toObservable() override fun partyFromKey(key: CompositeKey) = services.identityService.partyFromKey(key) override fun partyFromName(name: String) = services.identityService.partyFromName(name)