@@ -3,6 +3,7 @@ use crate::frame::response::event::{Event, StatusChangeEvent};
33use crate :: frame:: value:: ValueList ;
44use crate :: load_balancing:: TokenAwarePolicy ;
55use crate :: routing:: Token ;
6+ use crate :: transport:: host_filter:: HostFilter ;
67use crate :: transport:: {
78 connection:: { Connection , VerifiedKeyspaceName } ,
89 connection_pool:: PoolConfig ,
@@ -110,6 +111,10 @@ struct ClusterWorker {
110111
111112 // Keyspace send in "USE <keyspace name>" when opening each connection
112113 used_keyspace : Option < VerifiedKeyspaceName > ,
114+
115+ // The host filter determines towards which nodes we should open
116+ // connections
117+ host_filter : Option < Arc < dyn HostFilter > > ,
113118}
114119
115120#[ derive( Debug ) ]
@@ -129,6 +134,7 @@ impl Cluster {
129134 pool_config : PoolConfig ,
130135 fetch_schema_metadata : bool ,
131136 address_translator : & Option < Arc < dyn AddressTranslator > > ,
137+ host_filter : & Option < Arc < dyn HostFilter > > ,
132138 ) -> Result < Cluster , QueryError > {
133139 let ( refresh_sender, refresh_receiver) = tokio:: sync:: mpsc:: channel ( 32 ) ;
134140 let ( use_keyspace_sender, use_keyspace_receiver) = tokio:: sync:: mpsc:: channel ( 32 ) ;
@@ -141,10 +147,17 @@ impl Cluster {
141147 server_events_sender,
142148 fetch_schema_metadata,
143149 address_translator,
150+ host_filter,
144151 ) ;
145152
146153 let metadata = metadata_reader. read_metadata ( true ) . await ?;
147- let cluster_data = ClusterData :: new ( metadata, & pool_config, & HashMap :: new ( ) , & None ) ;
154+ let cluster_data = ClusterData :: new (
155+ metadata,
156+ & pool_config,
157+ & HashMap :: new ( ) ,
158+ & None ,
159+ host_filter. as_deref ( ) ,
160+ ) ;
148161 cluster_data. wait_until_all_pools_are_initialized ( ) . await ;
149162 let cluster_data: Arc < ArcSwap < ClusterData > > =
150163 Arc :: new ( ArcSwap :: from ( Arc :: new ( cluster_data) ) ) ;
@@ -160,6 +173,8 @@ impl Cluster {
160173
161174 use_keyspace_channel : use_keyspace_receiver,
162175 used_keyspace : None ,
176+
177+ host_filter : host_filter. clone ( ) ,
163178 } ;
164179
165180 let ( fut, worker_handle) = worker. work ( ) . remote_handle ( ) ;
@@ -273,6 +288,7 @@ impl ClusterData {
273288 pool_config : & PoolConfig ,
274289 known_peers : & HashMap < SocketAddr , Arc < Node > > ,
275290 used_keyspace : & Option < VerifiedKeyspaceName > ,
291+ host_filter : Option < & dyn HostFilter > ,
276292 ) -> Self {
277293 // Create new updated known_peers and ring
278294 let mut new_known_peers: HashMap < SocketAddr , Arc < Node > > =
@@ -289,13 +305,17 @@ impl ClusterData {
289305 Some ( node) if node. datacenter == peer. datacenter && node. rack == peer. rack => {
290306 node. clone ( )
291307 }
292- _ => Arc :: new ( Node :: new (
293- peer. address ,
294- pool_config. clone ( ) ,
295- peer. datacenter ,
296- peer. rack ,
297- used_keyspace. clone ( ) ,
298- ) ) ,
308+ _ => {
309+ let is_enabled = host_filter. map_or ( true , |f| f. accept ( & peer) ) ;
310+ Arc :: new ( Node :: new (
311+ peer. address ,
312+ pool_config. clone ( ) ,
313+ peer. datacenter ,
314+ peer. rack ,
315+ used_keyspace. clone ( ) ,
316+ is_enabled,
317+ ) )
318+ }
299319 } ;
300320
301321 new_known_peers. insert ( peer. address , node. clone ( ) ) ;
@@ -567,6 +587,7 @@ impl ClusterWorker {
567587 & self . pool_config ,
568588 & cluster_data. known_peers ,
569589 & self . used_keyspace ,
590+ self . host_filter . as_deref ( ) ,
570591 ) ) ;
571592
572593 new_cluster_data
0 commit comments