From 653b30836df8344f13e486d44a22167eab99db66 Mon Sep 17 00:00:00 2001 From: Gabriela Aragundi Date: Tue, 3 Jun 2025 11:42:50 -0700 Subject: [PATCH 1/2] read me change --- sdk/cosmos/azure_data_cosmos/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdk/cosmos/azure_data_cosmos/README.md b/sdk/cosmos/azure_data_cosmos/README.md index a9447c04ef..4443752da4 100644 --- a/sdk/cosmos/azure_data_cosmos/README.md +++ b/sdk/cosmos/azure_data_cosmos/README.md @@ -130,8 +130,6 @@ async fn example(cosmos_client: CosmosClient) -> Result<(), Box Date: Thu, 17 Jul 2025 14:30:53 -0700 Subject: [PATCH 2/2] adding location cache, global endpoint manager, and lib.rs changes --- .../src/global_endpoint_manager.rs | 1 + sdk/cosmos/azure_data_cosmos/src/lib.rs | 3 + .../azure_data_cosmos/src/location_cache.rs | 95 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 sdk/cosmos/azure_data_cosmos/src/global_endpoint_manager.rs create mode 100644 sdk/cosmos/azure_data_cosmos/src/location_cache.rs diff --git a/sdk/cosmos/azure_data_cosmos/src/global_endpoint_manager.rs b/sdk/cosmos/azure_data_cosmos/src/global_endpoint_manager.rs new file mode 100644 index 0000000000..1d08124e02 --- /dev/null +++ b/sdk/cosmos/azure_data_cosmos/src/global_endpoint_manager.rs @@ -0,0 +1 @@ +pub struct GlobalEndpointManager {} diff --git a/sdk/cosmos/azure_data_cosmos/src/lib.rs b/sdk/cosmos/azure_data_cosmos/src/lib.rs index 8a31e045a7..b76f3cba80 100644 --- a/sdk/cosmos/azure_data_cosmos/src/lib.rs +++ b/sdk/cosmos/azure_data_cosmos/src/lib.rs @@ -23,6 +23,9 @@ pub(crate) mod utils; pub mod models; +mod global_endpoint_manager; +mod location_cache; + #[doc(inline)] pub use clients::CosmosClient; diff --git a/sdk/cosmos/azure_data_cosmos/src/location_cache.rs b/sdk/cosmos/azure_data_cosmos/src/location_cache.rs new file mode 100644 index 0000000000..2272c0d6eb --- /dev/null +++ b/sdk/cosmos/azure_data_cosmos/src/location_cache.rs @@ -0,0 +1,95 @@ +use std::collections::HashMap; + +use url::Url; + +#[derive(Clone)] +pub struct DatabaseAccountLocationsInfo { + pub preferred_locations: Vec, + available_write_locations: Vec, + available_read_locations: Vec, + available_write_endpoints_by_location: HashMap, + available_read_endpoints_by_location: HashMap, + write_endpoints: Vec, + read_endpoints: Vec, +} + +impl Default for DatabaseAccountLocationsInfo { + fn default() -> Self { + DatabaseAccountLocationsInfo { + preferred_locations: Vec::new(), + available_write_locations: Vec::new(), + available_read_locations: Vec::new(), + available_write_endpoints_by_location: HashMap::new(), + available_read_endpoints_by_location: HashMap::new(), + write_endpoints: Vec::new(), + read_endpoints: Vec::new(), + } + } +} + +pub struct LocationCache { + pub default_endpoint: Url, + pub preferred_locations: Vec, + pub locations_info: DatabaseAccountLocationsInfo, +} + +impl LocationCache { + pub fn new(default_endpoint: Url, preferred_locations: Vec) -> Self { + Self { + default_endpoint, + preferred_locations, + locations_info: DatabaseAccountLocationsInfo { + preferred_locations, + ..Default::default() + }, + } + } + + pub fn update_location_cache( + &mut self, + write_locations: HashMap, + read_locations: HashMap, + preferred_locations: Vec, + ) { + let mut locations_info_copy = self.locations_info.clone(); + + if !preferred_locations.is_empty() { + locations_info_copy.preferred_locations = preferred_locations; + } + + if !write_locations.is_empty() { + let (available_write_endpoints_by_location, available_write_locations) = + self.get_endpoints_by_location(write_locations); + locations_info_copy.available_write_endpoints_by_location = + available_write_endpoints_by_location; + locations_info_copy.available_write_locations = available_write_locations; + } + + if !read_locations.is_empty() { + let (available_read_endpoints_by_location, available_read_locations) = + self.get_endpoints_by_location(read_locations); + locations_info_copy.available_read_endpoints_by_location = + available_read_endpoints_by_location; + locations_info_copy.available_read_locations = available_read_locations; + } + + self.locations_info = locations_info_copy; + } + + pub fn get_endpoints_by_location( + &mut self, + locations: HashMap, + ) -> (HashMap, Vec) { + let mut endpoints_by_location: HashMap = HashMap::new(); + let mut parsed_locations: Vec = Vec::new(); + + for (location, url) in locations { + if location != "" { + endpoints_by_location.insert(location.clone(), url.clone()); + parsed_locations.push(location); + } + } + + (endpoints_by_location, parsed_locations) + } +}