Search in sources :

Example 1 with ControlledMessage

use of com.radixdlt.environment.deterministic.network.ControlledMessage in project radixdlt by radixdlt.

the class PacemakerTest method on_view_timeout_quorum_pacemaker_should_move_to_next_view.

@Test
public void on_view_timeout_quorum_pacemaker_should_move_to_next_view() {
    // Arrange
    createRunner().injectMembers(this);
    processor.start();
    ControlledMessage timeoutMsg = network.nextMessage(e -> Epoched.isInstance(e.message(), ScheduledLocalTimeout.class)).value();
    processor.handleMessage(timeoutMsg.origin(), timeoutMsg.message(), new TypeLiteral<Epoched<ScheduledLocalTimeout>>() {
    });
    ControlledMessage bftUpdateMsg = network.nextMessage(e -> e.message() instanceof BFTInsertUpdate).value();
    processor.handleMessage(bftUpdateMsg.origin(), bftUpdateMsg.message(), null);
    // Act
    ControlledMessage viewTimeout = network.nextMessage(e -> (e.message() instanceof Vote) && ((Vote) e.message()).isTimeout()).value();
    processor.handleMessage(viewTimeout.origin(), viewTimeout.message(), null);
    // Assert
    assertThat(network.allMessages()).haveExactly(1, new Condition<>(msg -> msg.message() instanceof EpochViewUpdate, "A remote view timeout has been emitted"));
    EpochViewUpdate nextEpochViewUpdate = network.allMessages().stream().filter(msg -> msg.message() instanceof EpochViewUpdate).map(ControlledMessage::message).map(EpochViewUpdate.class::cast).findAny().orElseThrow();
    assertThat(nextEpochViewUpdate.getViewUpdate().getCurrentView()).isEqualTo(initialViewUpdate.getCurrentView().next());
}
Also used : ControlledMessage(com.radixdlt.environment.deterministic.network.ControlledMessage) ScheduledLocalTimeout(com.radixdlt.consensus.liveness.ScheduledLocalTimeout) Epoched(com.radixdlt.consensus.epoch.Epoched) RadixEngineForksLatestOnlyModule(com.radixdlt.statecomputer.forks.RadixEngineForksLatestOnlyModule) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) Inject(com.google.inject.Inject) DeterministicNetwork(com.radixdlt.environment.deterministic.network.DeterministicNetwork) EpochViewUpdate(com.radixdlt.consensus.epoch.EpochViewUpdate) MockedGenesisModule(com.radixdlt.statecomputer.checkpoint.MockedGenesisModule) DatabaseLocation(com.radixdlt.store.DatabaseLocation) MempoolConfig(com.radixdlt.mempool.MempoolConfig) ViewUpdate(com.radixdlt.consensus.bft.ViewUpdate) PrivateKeys(com.radixdlt.utils.PrivateKeys) Set(java.util.Set) BFTInsertUpdate(com.radixdlt.consensus.bft.BFTInsertUpdate) Test(org.junit.Test) DeterministicProcessor(com.radixdlt.environment.deterministic.DeterministicProcessor) ForksModule(com.radixdlt.statecomputer.forks.ForksModule) Injector(com.google.inject.Injector) Rule(org.junit.Rule) SingleNodeAndPeersDeterministicNetworkModule(com.radixdlt.SingleNodeAndPeersDeterministicNetworkModule) Condition(org.assertj.core.api.Condition) Guice(com.google.inject.Guice) Amount(com.radixdlt.application.tokens.Amount) MainnetForkConfigsModule(com.radixdlt.statecomputer.forks.MainnetForkConfigsModule) TypeLiteral(com.google.inject.TypeLiteral) TemporaryFolder(org.junit.rules.TemporaryFolder) AbstractModule(com.google.inject.AbstractModule) EpochViewUpdate(com.radixdlt.consensus.epoch.EpochViewUpdate) ControlledMessage(com.radixdlt.environment.deterministic.network.ControlledMessage) Epoched(com.radixdlt.consensus.epoch.Epoched) BFTInsertUpdate(com.radixdlt.consensus.bft.BFTInsertUpdate) Test(org.junit.Test)

Example 2 with ControlledMessage

use of com.radixdlt.environment.deterministic.network.ControlledMessage in project radixdlt by radixdlt.

the class MempoolFillAndEmptyTest method fillAndEmptyMempool.

private void fillAndEmptyMempool() {
    while (systemCounters.get(SystemCounters.CounterType.MEMPOOL_CURRENT_SIZE) < 1000) {
        ControlledMessage msg = network.nextMessage().value();
        processor.handleMessage(msg.origin(), msg.message(), msg.typeLiteral());
        if (msg.message() instanceof EpochViewUpdate) {
            scheduledMempoolFillEventDispatcher.dispatch(ScheduledMempoolFill.create());
        }
    }
    for (int i = 0; i < 10000; i++) {
        ControlledMessage msg = network.nextMessage().value();
        processor.handleMessage(msg.origin(), msg.message(), msg.typeLiteral());
        if (systemCounters.get(SystemCounters.CounterType.MEMPOOL_CURRENT_SIZE) == 0) {
            break;
        }
    }
    assertThat(systemCounters.get(SystemCounters.CounterType.MEMPOOL_CURRENT_SIZE)).isZero();
}
Also used : EpochViewUpdate(com.radixdlt.consensus.epoch.EpochViewUpdate) ControlledMessage(com.radixdlt.environment.deterministic.network.ControlledMessage)

Example 3 with ControlledMessage

use of com.radixdlt.environment.deterministic.network.ControlledMessage in project radixdlt by radixdlt.

the class DeterministicNodes method handleMessage.

public void handleMessage(Timed<ControlledMessage> timedNextMsg) {
    ControlledMessage nextMsg = timedNextMsg.value();
    int senderIndex = nextMsg.channelId().senderIndex();
    int receiverIndex = nextMsg.channelId().receiverIndex();
    BFTNode sender = this.nodeLookup.inverse().get(senderIndex);
    var injector = nodeInstances.get(receiverIndex);
    ThreadContext.put("self", " " + injector.getInstance(Key.get(String.class, Self.class)));
    try {
        log.debug("Received message {} at {}", nextMsg, timedNextMsg.time());
        nodeInstances.get(receiverIndex).getInstance(DeterministicProcessor.class).handleMessage(sender, nextMsg.message(), nextMsg.typeLiteral());
    } finally {
        ThreadContext.remove("self");
    }
}
Also used : BFTNode(com.radixdlt.consensus.bft.BFTNode) ControlledMessage(com.radixdlt.environment.deterministic.network.ControlledMessage) DeterministicProcessor(com.radixdlt.environment.deterministic.DeterministicProcessor) Self(com.radixdlt.consensus.bft.Self)

Example 4 with ControlledMessage

use of com.radixdlt.environment.deterministic.network.ControlledMessage in project radixdlt by radixdlt.

the class PacemakerTest method on_timeout_pacemaker_should_send_vote_with_timeout.

@Test
public void on_timeout_pacemaker_should_send_vote_with_timeout() {
    // Arrange
    createRunner().injectMembers(this);
    processor.start();
    // Act
    ControlledMessage timeoutMsg = network.nextMessage(e -> Epoched.isInstance(e.message(), ScheduledLocalTimeout.class)).value();
    processor.handleMessage(timeoutMsg.origin(), timeoutMsg.message(), new TypeLiteral<Epoched<ScheduledLocalTimeout>>() {
    });
    ControlledMessage bftUpdateMsg = network.nextMessage(e -> e.message() instanceof BFTInsertUpdate).value();
    processor.handleMessage(bftUpdateMsg.origin(), bftUpdateMsg.message(), null);
    // Assert
    assertThat(network.allMessages()).haveExactly(1, new Condition<>(msg -> (msg.message() instanceof Vote) && ((Vote) msg.message()).isTimeout(), "A remote timeout vote has been emitted"));
}
Also used : ControlledMessage(com.radixdlt.environment.deterministic.network.ControlledMessage) ScheduledLocalTimeout(com.radixdlt.consensus.liveness.ScheduledLocalTimeout) Epoched(com.radixdlt.consensus.epoch.Epoched) RadixEngineForksLatestOnlyModule(com.radixdlt.statecomputer.forks.RadixEngineForksLatestOnlyModule) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) Inject(com.google.inject.Inject) DeterministicNetwork(com.radixdlt.environment.deterministic.network.DeterministicNetwork) EpochViewUpdate(com.radixdlt.consensus.epoch.EpochViewUpdate) MockedGenesisModule(com.radixdlt.statecomputer.checkpoint.MockedGenesisModule) DatabaseLocation(com.radixdlt.store.DatabaseLocation) MempoolConfig(com.radixdlt.mempool.MempoolConfig) ViewUpdate(com.radixdlt.consensus.bft.ViewUpdate) PrivateKeys(com.radixdlt.utils.PrivateKeys) Set(java.util.Set) BFTInsertUpdate(com.radixdlt.consensus.bft.BFTInsertUpdate) Test(org.junit.Test) DeterministicProcessor(com.radixdlt.environment.deterministic.DeterministicProcessor) ForksModule(com.radixdlt.statecomputer.forks.ForksModule) Injector(com.google.inject.Injector) Rule(org.junit.Rule) SingleNodeAndPeersDeterministicNetworkModule(com.radixdlt.SingleNodeAndPeersDeterministicNetworkModule) Condition(org.assertj.core.api.Condition) Guice(com.google.inject.Guice) Amount(com.radixdlt.application.tokens.Amount) MainnetForkConfigsModule(com.radixdlt.statecomputer.forks.MainnetForkConfigsModule) TypeLiteral(com.google.inject.TypeLiteral) TemporaryFolder(org.junit.rules.TemporaryFolder) AbstractModule(com.google.inject.AbstractModule) ControlledMessage(com.radixdlt.environment.deterministic.network.ControlledMessage) Epoched(com.radixdlt.consensus.epoch.Epoched) BFTInsertUpdate(com.radixdlt.consensus.bft.BFTInsertUpdate) Test(org.junit.Test)

Aggregations

ControlledMessage (com.radixdlt.environment.deterministic.network.ControlledMessage)4 EpochViewUpdate (com.radixdlt.consensus.epoch.EpochViewUpdate)3 DeterministicProcessor (com.radixdlt.environment.deterministic.DeterministicProcessor)3 AbstractModule (com.google.inject.AbstractModule)2 Guice (com.google.inject.Guice)2 Inject (com.google.inject.Inject)2 Injector (com.google.inject.Injector)2 TypeLiteral (com.google.inject.TypeLiteral)2 SingleNodeAndPeersDeterministicNetworkModule (com.radixdlt.SingleNodeAndPeersDeterministicNetworkModule)2 Amount (com.radixdlt.application.tokens.Amount)2 BFTInsertUpdate (com.radixdlt.consensus.bft.BFTInsertUpdate)2 ViewUpdate (com.radixdlt.consensus.bft.ViewUpdate)2 Epoched (com.radixdlt.consensus.epoch.Epoched)2 ScheduledLocalTimeout (com.radixdlt.consensus.liveness.ScheduledLocalTimeout)2 DeterministicNetwork (com.radixdlt.environment.deterministic.network.DeterministicNetwork)2 MempoolConfig (com.radixdlt.mempool.MempoolConfig)2 MockedGenesisModule (com.radixdlt.statecomputer.checkpoint.MockedGenesisModule)2 ForksModule (com.radixdlt.statecomputer.forks.ForksModule)2 MainnetForkConfigsModule (com.radixdlt.statecomputer.forks.MainnetForkConfigsModule)2 RadixEngineForksLatestOnlyModule (com.radixdlt.statecomputer.forks.RadixEngineForksLatestOnlyModule)2