@@ -30,6 +30,7 @@ use crate::metrics::prom_utils::Metrics;
3030use crate :: rbac:: role:: model:: DefaultPrivilege ;
3131use crate :: rbac:: user:: User ;
3232use crate :: stats:: Stats ;
33+ use crate :: storage:: get_staging_metadata;
3334use crate :: storage:: object_storage:: ingestor_metadata_path;
3435use crate :: storage:: { ObjectStorageError , STREAM_ROOT_DIRECTORY } ;
3536use crate :: storage:: { ObjectStoreFormat , PARSEABLE_ROOT_DIRECTORY } ;
@@ -64,6 +65,7 @@ pub async fn sync_streams_with_ingestors(
6465 headers : HeaderMap ,
6566 body : Bytes ,
6667 stream_name : & str ,
68+ skip_ingestor : Option < String > ,
6769) -> Result < ( ) , StreamError > {
6870 let mut reqwest_headers = http_header:: HeaderMap :: new ( ) ;
6971
@@ -76,7 +78,16 @@ pub async fn sync_streams_with_ingestors(
7678 } ) ?;
7779
7880 let client = reqwest:: Client :: new ( ) ;
79- for ingestor in ingestor_infos. iter ( ) {
81+
82+ let final_ingestor_infos = match skip_ingestor {
83+ None => ingestor_infos,
84+ Some ( skip_ingestor) => ingestor_infos
85+ . into_iter ( )
86+ . filter ( |ingestor| ingestor. domain_name != to_url_string ( skip_ingestor. clone ( ) ) )
87+ . collect :: < Vec < IngestorMetadata > > ( ) ,
88+ } ;
89+
90+ for ingestor in final_ingestor_infos {
8091 if !utils:: check_liveness ( & ingestor. domain_name ) . await {
8192 log:: warn!( "Ingestor {} is not live" , ingestor. domain_name) ;
8293 continue ;
@@ -841,3 +852,62 @@ pub fn init_cluster_metrics_schedular() -> Result<(), PostError> {
841852
842853 Ok ( ( ) )
843854}
855+
856+ pub async fn forward_create_stream_request ( stream_name : & str ) -> Result < ( ) , StreamError > {
857+ let client = reqwest:: Client :: new ( ) ;
858+
859+ let staging_metadata = get_staging_metadata ( ) . unwrap ( ) . ok_or_else ( || {
860+ StreamError :: Anyhow ( anyhow:: anyhow!( "Failed to retrieve staging metadata" ) )
861+ } ) ?;
862+ let querier_endpoint = to_url_string ( staging_metadata. querier_endpoint . unwrap ( ) ) ;
863+ let token = staging_metadata. querier_auth_token . unwrap ( ) ;
864+
865+ if !check_liveness ( & querier_endpoint) . await {
866+ log:: warn!( "Querier {} is not live" , querier_endpoint) ;
867+ return Err ( StreamError :: Anyhow ( anyhow:: anyhow!( "Querier is not live" ) ) ) ;
868+ }
869+
870+ let url = format ! (
871+ "{}{}/logstream/{}?skip_ingestors={}" ,
872+ querier_endpoint,
873+ base_path_without_preceding_slash( ) ,
874+ stream_name,
875+ CONFIG . parseable. ingestor_endpoint,
876+ ) ;
877+
878+ let response = client
879+ . put ( & url)
880+ . header ( header:: AUTHORIZATION , & token)
881+ . send ( )
882+ . await
883+ . map_err ( |err| {
884+ log:: error!(
885+ "Fatal: failed to forward create stream request to querier: {}\n Error: {:?}" ,
886+ & url,
887+ err
888+ ) ;
889+ StreamError :: Network ( err)
890+ } ) ?;
891+
892+ let status = response. status ( ) ;
893+
894+ if !status. is_success ( ) {
895+ let response_text = response. text ( ) . await . map_err ( |err| {
896+ log:: error!( "Failed to read response text from querier: {}" , & url) ;
897+ StreamError :: Network ( err)
898+ } ) ?;
899+
900+ log:: error!(
901+ "Failed to forward create stream request to querier: {}\n Response Returned: {:?}" ,
902+ & url,
903+ response_text
904+ ) ;
905+
906+ return Err ( StreamError :: Anyhow ( anyhow:: anyhow!(
907+ "Request failed with status: {}" ,
908+ status,
909+ ) ) ) ;
910+ }
911+
912+ Ok ( ( ) )
913+ }
0 commit comments