From 3b4a355f0d6e4e73874fd7081f7d467e8b4220ba Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Fri, 10 Nov 2023 14:16:02 +0100 Subject: [PATCH] feat(config): add serialization interval configuration (#2923) * add serialization interval configuration * fix e2e tests * fix e2e tests --- src/tests/e2e/remote_runner.rs | 6 +++--- zellij-server/src/background_jobs.rs | 15 +++++++++++---- zellij-server/src/lib.rs | 4 +++- zellij-utils/src/input/options.rs | 9 +++++++++ zellij-utils/src/kdl/mod.rs | 4 ++++ ...st__cli_arguments_override_config_options.snap | 2 ++ ...st__cli_arguments_override_layout_options.snap | 2 ++ ...t__default_config_with_no_cli_arguments-3.snap | 2 ++ ...est__default_config_with_no_cli_arguments.snap | 2 ++ ..._layout_env_vars_override_config_env_vars.snap | 2 ++ ..._layout_keybinds_override_config_keybinds.snap | 2 ++ ...t__layout_options_override_config_options.snap | 2 ++ ...t__layout_plugins_override_config_plugins.snap | 2 ++ ...est__layout_themes_override_config_themes.snap | 2 ++ ...yout_ui_config_overrides_config_ui_config.snap | 2 ++ 15 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/tests/e2e/remote_runner.rs b/src/tests/e2e/remote_runner.rs index ca35db7dc4..2f93d5b655 100644 --- a/src/tests/e2e/remote_runner.rs +++ b/src/tests/e2e/remote_runner.rs @@ -92,7 +92,7 @@ fn start_zellij_mirrored_session(channel: &mut ssh2::Channel) { channel .write_all( format!( - "{} {} --session {} --data-dir {} options --mirror-session true\n", + "{} {} --session {} --data-dir {} options --mirror-session true --serialization-interval 1\n", SET_ENV_VARIABLES, ZELLIJ_EXECUTABLE_LOCATION, SESSION_NAME, ZELLIJ_DATA_DIR ) .as_bytes(), @@ -107,7 +107,7 @@ fn start_zellij_mirrored_session_with_layout(channel: &mut ssh2::Channel, layout channel .write_all( format!( - "{} {} --session {} --data-dir {} --layout {} options --mirror-session true\n", + "{} {} --session {} --data-dir {} --layout {} options --mirror-session true --serialization-interval 1\n", SET_ENV_VARIABLES, ZELLIJ_EXECUTABLE_LOCATION, SESSION_NAME, @@ -129,7 +129,7 @@ fn start_zellij_mirrored_session_with_layout_and_viewport_serialization( channel .write_all( format!( - "{} {} --session {} --data-dir {} --layout {} options --mirror-session true --serialize-pane-viewport true\n", + "{} {} --session {} --data-dir {} --layout {} options --mirror-session true --serialize-pane-viewport true --serialization-interval 1\n", SET_ENV_VARIABLES, ZELLIJ_EXECUTABLE_LOCATION, SESSION_NAME, diff --git a/zellij-server/src/background_jobs.rs b/zellij-server/src/background_jobs.rs index 5fa6ffcb54..47d281f5b0 100644 --- a/zellij-server/src/background_jobs.rs +++ b/zellij-server/src/background_jobs.rs @@ -78,15 +78,20 @@ impl From<&BackgroundJob> for BackgroundJobContext { static FLASH_DURATION_MS: u64 = 1000; static PLUGIN_ANIMATION_OFFSET_DURATION_MD: u64 = 500; -static SESSION_READ_DURATION: u64 = 1000; +static SESSION_READ_DURATION: u64 = 60000; -pub(crate) fn background_jobs_main(bus: Bus) -> Result<()> { +pub(crate) fn background_jobs_main( + bus: Bus, + serialization_interval: Option, +) -> Result<()> { let err_context = || "failed to write to pty".to_string(); let mut running_jobs: HashMap = HashMap::new(); let mut loading_plugins: HashMap> = HashMap::new(); // u32 - plugin_id let current_session_name = Arc::new(Mutex::new(String::default())); let current_session_info = Arc::new(Mutex::new(SessionInfo::default())); let current_session_layout = Arc::new(Mutex::new((String::new(), BTreeMap::new()))); + let serialization_interval = serialization_interval.map(|s| s * 1000); // convert to + // milliseconds loop { let (event, mut err_ctx) = bus.recv().with_context(err_context)?; @@ -181,8 +186,10 @@ pub(crate) fn background_jobs_main(bus: Bus) -> Result<()> { resurrectable_sessions, )); let _ = senders.send_to_screen(ScreenInstruction::DumpLayoutToHd); - task::sleep(std::time::Duration::from_millis(SESSION_READ_DURATION)) - .await; + task::sleep(std::time::Duration::from_millis( + serialization_interval.unwrap_or(SESSION_READ_DURATION), + )) + .await; } } }); diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs index ba4f9452a5..51daeb0e7a 100644 --- a/zellij-server/src/lib.rs +++ b/zellij-server/src/lib.rs @@ -751,6 +751,8 @@ fn init_session( arrow_fonts: config_options.simplified_ui.unwrap_or_default(), }; + let serialization_interval = config_options.serialization_interval; + let default_shell = config_options.default_shell.clone().map(|command| { TerminalAction::RunCommand(RunCommand { command, @@ -885,7 +887,7 @@ fn init_session( None, Some(os_input.clone()), ); - || background_jobs_main(background_jobs_bus).fatal() + move || background_jobs_main(background_jobs_bus, serialization_interval).fatal() }) .unwrap(); diff --git a/zellij-utils/src/input/options.rs b/zellij-utils/src/input/options.rs index e922bd2cbc..fbe51cffb8 100644 --- a/zellij-utils/src/input/options.rs +++ b/zellij-utils/src/input/options.rs @@ -147,6 +147,10 @@ pub struct Options { #[clap(long, value_parser)] #[serde(default)] pub styled_underlines: Option, + + /// The interval at which to serialize sessions for resurrection (in seconds) + #[clap(long, value_parser)] + pub serialization_interval: Option, } #[derive(ArgEnum, Deserialize, Serialize, Debug, Clone, Copy, PartialEq)] @@ -218,6 +222,7 @@ impl Options { .scrollback_lines_to_serialize .or(self.scrollback_lines_to_serialize); let styled_underlines = other.styled_underlines.or(self.styled_underlines); + let serialization_interval = other.serialization_interval.or(self.serialization_interval); Options { simplified_ui, @@ -244,6 +249,7 @@ impl Options { serialize_pane_viewport, scrollback_lines_to_serialize, styled_underlines, + serialization_interval, } } @@ -295,6 +301,7 @@ impl Options { .scrollback_lines_to_serialize .or_else(|| self.scrollback_lines_to_serialize.clone()); let styled_underlines = other.styled_underlines.or(self.styled_underlines); + let serialization_interval = other.serialization_interval.or(self.serialization_interval); Options { simplified_ui, @@ -321,6 +328,7 @@ impl Options { serialize_pane_viewport, scrollback_lines_to_serialize, styled_underlines, + serialization_interval, } } @@ -384,6 +392,7 @@ impl From for Options { serialize_pane_viewport: opts.serialize_pane_viewport, scrollback_lines_to_serialize: opts.scrollback_lines_to_serialize, styled_underlines: opts.styled_underlines, + serialization_interval: opts.serialization_interval, ..Default::default() } } diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs index 8fce144d39..8353b6e749 100644 --- a/zellij-utils/src/kdl/mod.rs +++ b/zellij-utils/src/kdl/mod.rs @@ -1480,6 +1480,9 @@ impl Options { let styled_underlines = kdl_property_first_arg_as_bool_or_error!(kdl_options, "styled_underlines") .map(|(v, _)| v); + let serialization_interval = + kdl_property_first_arg_as_i64_or_error!(kdl_options, "serialization_interval") + .map(|(scroll_buffer_size, _entry)| scroll_buffer_size as u64); Ok(Options { simplified_ui, theme, @@ -1505,6 +1508,7 @@ impl Options { serialize_pane_viewport, scrollback_lines_to_serialize, styled_underlines, + serialization_interval, }) } } diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_config_options.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_config_options.snap index b17886775d..a4e972b3e1 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_config_options.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_config_options.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 686 expression: "format!(\"{:#?}\", options)" --- Options { @@ -29,4 +30,5 @@ Options { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, } diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_layout_options.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_layout_options.snap index f6f89eaa67..2e408bf7c7 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_layout_options.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__cli_arguments_override_layout_options.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 714 expression: "format!(\"{:#?}\", options)" --- Options { @@ -29,4 +30,5 @@ Options { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, } diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-3.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-3.snap index 10f7318a16..2bac95f319 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-3.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments-3.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 673 expression: "format!(\"{:#?}\", options)" --- Options { @@ -27,4 +28,5 @@ Options { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, } diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap index cfd5652b0a..7d5072a29d 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__default_config_with_no_cli_arguments.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 671 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3592,6 +3593,7 @@ Config { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, }, themes: {}, plugins: { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap index 3657317145..9c5e198e01 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_env_vars_override_config_env_vars.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 729 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3592,6 +3593,7 @@ Config { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, }, themes: {}, plugins: { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap index 7a5e39915a..a6df2f5eeb 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_keybinds_override_config_keybinds.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 785 expression: "format!(\"{:#?}\", config)" --- Config { @@ -85,6 +86,7 @@ Config { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, }, themes: {}, plugins: { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_options_override_config_options.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_options_override_config_options.snap index 71364b8aa7..9d679348e0 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_options_override_config_options.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_options_override_config_options.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 696 expression: "format!(\"{:#?}\", options)" --- Options { @@ -29,4 +30,5 @@ Options { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, } diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap index c011cb0ed7..31a9217446 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_plugins_override_config_plugins.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 757 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3592,6 +3593,7 @@ Config { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, }, themes: {}, plugins: { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap index 18ce114381..a6382c05ec 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_themes_override_config_themes.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 771 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3592,6 +3593,7 @@ Config { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, }, themes: { "other-theme-from-config": Theme { diff --git a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap index 4d13556697..9dc3f74e13 100644 --- a/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap +++ b/zellij-utils/src/snapshots/zellij_utils__setup__setup_test__layout_ui_config_overrides_config_ui_config.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/setup.rs +assertion_line: 743 expression: "format!(\"{:#?}\", config)" --- Config { @@ -3592,6 +3593,7 @@ Config { serialize_pane_viewport: None, scrollback_lines_to_serialize: None, styled_underlines: None, + serialization_interval: None, }, themes: {}, plugins: {