More leniency with auth errors in RpcReconnectTests (#5061)

This commit is contained in:
Tudor Malene 2019-04-26 15:17:26 +01:00 committed by Shams Asari
parent 46c073d212
commit 7b0d177a34
2 changed files with 26 additions and 13 deletions

View File

@ -72,6 +72,10 @@ class ReconnectingCordaRPCOps private constructor(
observersPool != null)
private companion object {
// See https://r3-cev.atlassian.net/browse/CORDA-2890.
// TODO Once the bug is fixed, this retry logic should be removed.
const val MAX_RETRY_ATTEMPTS_ON_AUTH_ERROR = 3
private val log = contextLogger()
private fun proxy(reconnectingRPCConnection: ReconnectingRPCConnection, observersPool: ExecutorService): CordaRPCOps {
return Proxy.newProxyInstance(
@ -197,7 +201,7 @@ class ReconnectingCordaRPCOps private constructor(
is ActiveMQSecurityException -> {
// Happens when incorrect credentials provided.
// It can happen at startup as well when the credentials are correct.
if (_currentAuthenticationRetries++ > 1) {
if (_currentAuthenticationRetries++ > MAX_RETRY_ATTEMPTS_ON_AUTH_ERROR) {
log.error("Failed to login to node.", ex)
throw ex
}

View File

@ -60,7 +60,7 @@ class RpcReconnectTests {
*/
@Test
fun `test that the RPC client is able to reconnect and proceed after node failure, restart, or connection reset`() {
val nrOfFlowsToRun = 450 // Takes around 5 minutes.
val nrOfFlowsToRun = 150 // Takes around 5 minutes.
val nodeRunningTime = { Random().nextInt(12000) + 8000 }
val demoUser = User("demo", "demo", setOf(Permissions.all()))
@ -242,6 +242,26 @@ class RpcReconnectTests {
val nrFailures = nrRestarts.get()
log.info("Checking results after $nrFailures restarts.")
// Query the vault and check that states were created for all flows.
fun readCashStates() = bankAReconnectingRpc
.vaultQueryByWithPagingSpec(Cash.State::class.java, QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.CONSUMED), PageSpecification(1, 10000))
.states
var allCashStates = readCashStates()
var nrRetries = 0
// It might be necessary to wait more for all events to arrive when the node is slow.
while (allCashStates.size < nrOfFlowsToRun && nrRetries++ < 3) {
Thread.sleep(2000)
allCashStates = readCashStates()
}
val allCash = allCashStates.map { it.state.data.amount.quantity }.toSet()
val missingCash = (1..nrOfFlowsToRun).filterNot { allCash.contains(it.toLong() * 100) }
log.info("MISSING: $missingCash")
assertEquals(nrOfFlowsToRun, allCashStates.size, "Not all flows were executed successfully")
// The progress status for each flow can only miss the last events, because the node might have been killed.
val missingProgressEvents = flowProgressEvents.filterValues { expectedProgress.subList(0, it.size) != it }
assertTrue(missingProgressEvents.isEmpty(), "The flow progress tracker is missing events: $missingProgressEvents")
@ -253,17 +273,6 @@ class RpcReconnectTests {
assertTrue(vaultEvents!!.size + nrFailures * 3 >= nrOfFlowsToRun, "Not all vault events were received")
// DOCEND missingVaultEvents
// Query the vault and check that states were created for all flows.
val allCashStates = bankAReconnectingRpc
.vaultQueryByWithPagingSpec(Cash.State::class.java, QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.CONSUMED), PageSpecification(1, 10000))
.states
val allCash = allCashStates.map { it.state.data.amount.quantity }.toSet()
val missingCash = (1..nrOfFlowsToRun).filterNot { allCash.contains(it.toLong() * 100) }
log.info("MISSING: $missingCash")
assertEquals(nrOfFlowsToRun, allCashStates.size, "Not all flows were executed successfully")
// Check that no flow was triggered twice.
val duplicates = allCashStates.groupBy { it.state.data.amount }.filterValues { it.size > 1 }
assertTrue(duplicates.isEmpty(), "${duplicates.size} flows were retried illegally.")