From 5aa04c88ee151b2e8fd82c484a4f5b06326c8e7a Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Mon, 19 Jun 2023 13:52:09 +0200 Subject: [PATCH 1/2] kernel/sequencer: process messages when fallback --- src/kernel_sequencer/src/delayed_inbox.rs | 34 ++++++++++++++++--- src/kernel_sequencer/src/sequencer_runtime.rs | 12 +++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/kernel_sequencer/src/delayed_inbox.rs b/src/kernel_sequencer/src/delayed_inbox.rs index 29fc85b689db..119f1d264344 100644 --- a/src/kernel_sequencer/src/delayed_inbox.rs +++ b/src/kernel_sequencer/src/delayed_inbox.rs @@ -110,7 +110,10 @@ pub fn read_input( }, } } - None => return handle_pending_inbox(host, pending_inbox_queue), + None => { + let state = read_state(host)?; + return handle_pending_inbox(host, pending_inbox_queue, delayed_inbox_queue, state); + } } } } @@ -256,12 +259,33 @@ fn handle_message( fn handle_pending_inbox( host: &mut H, pending_inbox_queue: &mut Queue, + delayed_inbox_queue: &mut Queue, + state: State, ) -> Result, RuntimeError> { - let pending_message = pending_inbox_queue.pop(host)?; - let Some(PendingUserMessage {id, level, payload}) = pending_message else {return Ok(None)}; + match state { + State::Sequenced(_) => { + let pending_message = pending_inbox_queue.pop(host)?; + let Some(PendingUserMessage {id, level, payload}) = pending_message else {return Ok(None)}; - let msg = Message::new(level, id, payload); - Ok(Some(msg)) + let msg = Message::new(level, id, payload); + Ok(Some(msg)) + } + State::Fallback => { + // First we should remove remaining message from the pending inbox + match pending_inbox_queue.pop(host)? { + Some(PendingUserMessage { id, level, payload }) => { + let msg = Message::new(level, id, payload); + Ok(Some(msg)) + } + None => { + let delayed_message = delayed_inbox_queue.pop(host)?; + let Some(UserMessage { payload, .. }) = delayed_message else {return Ok(None)}; + let msg = Message::new(0, 0, payload); + Ok(Some(msg)) + } + } + } + } } #[cfg(test)] diff --git a/src/kernel_sequencer/src/sequencer_runtime.rs b/src/kernel_sequencer/src/sequencer_runtime.rs index d521f698838d..a8080f7d7c95 100644 --- a/src/kernel_sequencer/src/sequencer_runtime.rs +++ b/src/kernel_sequencer/src/sequencer_runtime.rs @@ -212,8 +212,11 @@ where #[cfg(test)] mod tests { + use crate::{state::State, storage::write_state}; + use super::SequencerRuntime; use tezos_data_encoding_derive::BinWriter; + use tezos_smart_rollup_encoding::public_key::PublicKey; use tezos_smart_rollup_host::{path::RefPath, runtime::Runtime}; use tezos_smart_rollup_mock::MockHost; @@ -231,6 +234,15 @@ mod tests { #[test] fn test_add_user_message() { let mut mock_host = MockHost::default(); + write_state( + &mut mock_host, + State::Sequenced( + PublicKey::from_b58check("edpkuDMUm7Y53wp4gxeLBXuiAhXZrLn8XB1R83ksvvesH8Lp8bmCfK") + .expect("decoding should work"), + ), + ) + .expect("updating the state should work"); + mock_host.add_external(UserMessage::new(1)); mock_host.add_external(UserMessage::new(2)); mock_host.add_external(UserMessage::new(3)); -- GitLab From 65086e29682967ec1d490f82089a73e8521f735a Mon Sep 17 00:00:00 2001 From: Pierre-Louis Date: Mon, 19 Jun 2023 13:51:26 +0200 Subject: [PATCH 2/2] kernel/sequencer: test kernel fallback state --- src/kernel_sequencer/src/delayed_inbox.rs | 17 +++++++++++++++++ src/kernel_sequencer/src/sequencer_runtime.rs | 16 +++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/kernel_sequencer/src/delayed_inbox.rs b/src/kernel_sequencer/src/delayed_inbox.rs index 119f1d264344..2b7ce470dad2 100644 --- a/src/kernel_sequencer/src/delayed_inbox.rs +++ b/src/kernel_sequencer/src/delayed_inbox.rs @@ -435,4 +435,21 @@ mod tests { assert_external_eq(Msg::new(0x01), msg1.as_ref()); assert!(msg2.is_none()); } + + #[test] + fn test_fallback() { + let (mut mock_host, _) = prepare(); + write_state(&mut mock_host, State::Fallback).unwrap(); + + mock_host.add_external(Msg::new(0x01)); + mock_host.add_external(Msg::new(0x02)); + mock_host.add_external(Msg::new(0x03)); + + let mut runtime = SequencerRuntime::new(mock_host, crate::FilterBehavior::AllowAll, 1); + let msg1 = runtime.read_input().unwrap().unwrap(); + let msg2 = runtime.read_input().unwrap().unwrap(); + + assert_external_eq(Msg::new(0x01), msg1.as_ref()); + assert_external_eq(Msg::new(0x02), msg2.as_ref()); + } } diff --git a/src/kernel_sequencer/src/sequencer_runtime.rs b/src/kernel_sequencer/src/sequencer_runtime.rs index a8080f7d7c95..91216d0d86d6 100644 --- a/src/kernel_sequencer/src/sequencer_runtime.rs +++ b/src/kernel_sequencer/src/sequencer_runtime.rs @@ -212,9 +212,8 @@ where #[cfg(test)] mod tests { - use crate::{state::State, storage::write_state}; - use super::SequencerRuntime; + use crate::storage::write_state; use tezos_data_encoding_derive::BinWriter; use tezos_smart_rollup_encoding::public_key::PublicKey; use tezos_smart_rollup_host::{path::RefPath, runtime::Runtime}; @@ -234,15 +233,10 @@ mod tests { #[test] fn test_add_user_message() { let mut mock_host = MockHost::default(); - write_state( - &mut mock_host, - State::Sequenced( - PublicKey::from_b58check("edpkuDMUm7Y53wp4gxeLBXuiAhXZrLn8XB1R83ksvvesH8Lp8bmCfK") - .expect("decoding should work"), - ), - ) - .expect("updating the state should work"); - + let public_key = + PublicKey::from_b58check("edpkuDMUm7Y53wp4gxeLBXuiAhXZrLn8XB1R83ksvvesH8Lp8bmCfK") + .unwrap(); + write_state(&mut mock_host, crate::state::State::Sequenced(public_key)).unwrap(); mock_host.add_external(UserMessage::new(1)); mock_host.add_external(UserMessage::new(2)); mock_host.add_external(UserMessage::new(3)); -- GitLab