@@ -82,7 +82,7 @@ pub struct ClusterDiscovery {
8282#[ async_trait:: async_trait]
8383pub trait ClusterHelper {
8484 fn create ( nodes : Vec < Arc < NodeInfo > > , local_id : String ) -> Arc < Cluster > ;
85- fn empty ( ) -> Arc < Cluster > ;
85+ fn empty ( node : NodeInfo ) -> Arc < Cluster > ;
8686 fn is_empty ( & self ) -> bool ;
8787 fn is_local ( & self , node : & NodeInfo ) -> bool ;
8888 fn local_id ( & self ) -> String ;
@@ -110,12 +110,10 @@ impl ClusterHelper for Cluster {
110110 } )
111111 }
112112
113- fn empty ( ) -> Arc < Cluster > {
114- Arc :: new ( Cluster {
115- unassign : false ,
116- local_id : String :: from ( "" ) ,
117- nodes : Vec :: new ( ) ,
118- } )
113+ fn empty ( node : NodeInfo ) -> Arc < Cluster > {
114+ let node_info = Arc :: new ( node) ;
115+ let local_id = node_info. id . clone ( ) ;
116+ Cluster :: create ( vec ! [ node_info] , local_id)
119117 }
120118
121119 fn is_empty ( & self ) -> bool {
@@ -321,10 +319,23 @@ impl ClusterDiscovery {
321319
322320 // compatibility, for self-managed nodes, we allow queries to continue executing even when the heartbeat fails.
323321 if cluster_nodes. is_empty ( ) && !config. query . cluster_id . is_empty ( ) {
324- let mut cluster = Cluster :: empty ( ) ;
325- let mut_cluster = Arc :: get_mut ( & mut cluster) . unwrap ( ) ;
326- mut_cluster. local_id = self . local_id . clone ( ) ;
327- return Ok ( cluster) ;
322+ let mut node_info = NodeInfo :: create (
323+ config. query . node_id . clone ( ) ,
324+ config. query . node_secret . clone ( ) ,
325+ config. query . num_cpus ,
326+ format ! (
327+ "{}:{}" ,
328+ config. query. http_handler_host, config. query. http_handler_port
329+ ) ,
330+ config. query . flight_api_address . clone ( ) ,
331+ config. query . discovery_address . clone ( ) ,
332+ String :: new ( ) ,
333+ String :: new ( ) ,
334+ ) ;
335+
336+ node_info. cluster_id = config. query . cluster_id . clone ( ) ;
337+ node_info. warehouse_id = config. query . warehouse_id . clone ( ) ;
338+ return Ok ( Cluster :: empty ( node_info) ) ;
328339 }
329340
330341 Ok ( Cluster :: create ( res, self . local_id . clone ( ) ) )
@@ -355,14 +366,49 @@ impl ClusterDiscovery {
355366 true => self . warehouse_manager . discover ( & config. query . node_id ) . await ,
356367 false => {
357368 self . warehouse_manager
358- . list_warehouse_cluster_nodes ( & self . cluster_id , & self . cluster_id )
369+ . list_warehouse_cluster_nodes (
370+ & config. query . warehouse_id ,
371+ & config. query . cluster_id ,
372+ )
359373 . await
360374 }
361375 } ;
362376
363377 self . create_cluster_with_try_connect ( config, nodes) . await
364378 }
365379
380+ pub async fn single_node_cluster ( & self , config : & InnerConfig ) -> Result < Arc < Cluster > > {
381+ match self
382+ . warehouse_manager
383+ . get_node_info ( & config. query . node_id )
384+ . await ?
385+ {
386+ None => {
387+ let mut node_info = NodeInfo :: create (
388+ config. query . node_id . clone ( ) ,
389+ config. query . node_secret . clone ( ) ,
390+ config. query . num_cpus ,
391+ format ! (
392+ "{}:{}" ,
393+ config. query. http_handler_host, config. query. http_handler_port
394+ ) ,
395+ config. query . flight_api_address . clone ( ) ,
396+ config. query . discovery_address . clone ( ) ,
397+ String :: new ( ) ,
398+ String :: new ( ) ,
399+ ) ;
400+
401+ node_info. cluster_id = config. query . cluster_id . clone ( ) ;
402+ node_info. warehouse_id = config. query . warehouse_id . clone ( ) ;
403+ Ok ( Cluster :: empty ( node_info) )
404+ }
405+ Some ( v) => Ok ( Cluster :: create (
406+ vec ! [ Arc :: new( v) ] ,
407+ config. query . node_id . clone ( ) ,
408+ ) ) ,
409+ }
410+ }
411+
366412 pub async fn find_node_by_warehouse (
367413 self : Arc < Self > ,
368414 warehouse : & str ,
0 commit comments