From 471f9129b4a6214d072b29cd42d3fa985078cf96 Mon Sep 17 00:00:00 2001 From: hdbg Date: Mon, 8 Dec 2025 14:32:08 +0100 Subject: [PATCH] refactor(controller): use state to find available port range --- src/controller.rs | 2 +- src/controller/utils.rs | 10 ++++++++-- src/state.rs | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/controller.rs b/src/controller.rs index 5e3f5c2..3dcf2a1 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -122,7 +122,7 @@ impl Controller { let config = PGDConfig { version: *latest_version, password: utils::generate_password(), - port: utils::find_available_port()?, + port: utils::find_available_port(&self.ctx.state)?, }; let project = Project::new(config)?; diff --git a/src/controller/utils.rs b/src/controller/utils.rs index d9aa829..aa5ef91 100644 --- a/src/controller/utils.rs +++ b/src/controller/utils.rs @@ -1,12 +1,18 @@ use miette::Result; use rand::{Rng, distr::Alphanumeric}; + +use crate::state::StateManager; const DEFAULT_POSTGRES_PORT: u16 = 5432; const PORT_SEARCH_RANGE: u16 = 100; -pub fn find_available_port() -> Result { +pub fn find_available_port(state: &StateManager) -> Result { use std::net::TcpListener; - for port in DEFAULT_POSTGRES_PORT..(DEFAULT_POSTGRES_PORT + PORT_SEARCH_RANGE) { + let starting_port = state + .get_highest_used_port() + .unwrap_or(DEFAULT_POSTGRES_PORT); + + for port in starting_port..(starting_port + PORT_SEARCH_RANGE) { if TcpListener::bind(("127.0.0.1", port)).is_ok() { return Ok(port); } diff --git a/src/state.rs b/src/state.rs index 3fcf0ff..07bd868 100644 --- a/src/state.rs +++ b/src/state.rs @@ -88,8 +88,8 @@ impl StateManager { self.0.borrow_mut().instances.insert(project_name, state); } - pub fn remove(&self, project_name: &str) -> Option { - self.0.borrow_mut().instances.remove(project_name) + pub fn get_highest_used_port(&self) -> Option { + self.0.borrow().instances.values().map(|i| i.port).max() } }