@@ -103,6 +103,8 @@ pub(crate) struct VortexOpener {
103103 pub layout_readers : Arc < DashMap < Path , Weak < dyn LayoutReader > > > ,
104104 /// Shared full-file natural split ranges keyed by file path.
105105 pub natural_split_ranges : Arc < DashMap < Path , Arc < [ Range < u64 > ] > > > ,
106+ /// Shared V2 file handles keyed by file path.
107+ pub vortex_files : Arc < DashMap < Path , Arc < VortexFile > > > ,
106108 /// Whether the query has output ordering specified
107109 pub has_output_ordering : bool ,
108110
@@ -139,6 +141,7 @@ impl FileOpener for VortexOpener {
139141 let limit = self . limit ;
140142 let layout_readers = Arc :: clone ( & self . layout_readers ) ;
141143 let natural_split_ranges = Arc :: clone ( & self . natural_split_ranges ) ;
144+ let vortex_files = Arc :: clone ( & self . vortex_files ) ;
142145 let has_output_ordering = self . has_output_ordering ;
143146 let scan_concurrency = self . scan_concurrency ;
144147
@@ -216,10 +219,24 @@ impl FileOpener for VortexOpener {
216219 open_opts = open_opts. with_footer ( footer) ;
217220 }
218221
219- let vxf = open_opts
220- . open_read ( reader)
221- . await
222- . map_err ( |e| exec_datafusion_err ! ( "Failed to open Vortex file {e}" ) ) ?;
222+ let vxf = if let Some ( hit) = vortex_files. get ( & file. object_meta . location ) {
223+ Arc :: clone ( hit. value ( ) )
224+ } else {
225+ let opened = Arc :: new (
226+ open_opts
227+ . open_read ( reader)
228+ . await
229+ . map_err ( |e| exec_datafusion_err ! ( "Failed to open Vortex file {e}" ) ) ?,
230+ ) ;
231+
232+ match vortex_files. entry ( file. object_meta . location . clone ( ) ) {
233+ Entry :: Occupied ( entry) => Arc :: clone ( entry. get ( ) ) ,
234+ Entry :: Vacant ( entry) => {
235+ entry. insert ( Arc :: clone ( & opened) ) ;
236+ opened
237+ }
238+ }
239+ } ;
223240
224241 // On a miss, cache the parsed footer so other partitions and later executions
225242 // skip the footer fetch and parse. `infer_schema`/`infer_stats` also populate
@@ -915,6 +932,7 @@ mod tests {
915932 metrics_registry : Arc :: new ( DefaultMetricsRegistry :: default ( ) ) ,
916933 layout_readers : Default :: default ( ) ,
917934 natural_split_ranges : Default :: default ( ) ,
935+ vortex_files : Default :: default ( ) ,
918936 has_output_ordering : false ,
919937 expression_convertor : Arc :: new ( DefaultExpressionConvertor :: default ( ) ) ,
920938 file_metadata_cache : None ,
@@ -1111,6 +1129,7 @@ mod tests {
11111129 metrics_registry : Arc :: new ( DefaultMetricsRegistry :: default ( ) ) ,
11121130 layout_readers : Default :: default ( ) ,
11131131 natural_split_ranges : Default :: default ( ) ,
1132+ vortex_files : Default :: default ( ) ,
11141133 has_output_ordering : false ,
11151134 expression_convertor : Arc :: new ( DefaultExpressionConvertor :: default ( ) ) ,
11161135 file_metadata_cache : None ,
@@ -1199,6 +1218,7 @@ mod tests {
11991218 metrics_registry : Arc :: new ( DefaultMetricsRegistry :: default ( ) ) ,
12001219 layout_readers : Default :: default ( ) ,
12011220 natural_split_ranges : Default :: default ( ) ,
1221+ vortex_files : Default :: default ( ) ,
12021222 has_output_ordering : false ,
12031223 expression_convertor : Arc :: new ( DefaultExpressionConvertor :: default ( ) ) ,
12041224 file_metadata_cache : None ,
@@ -1357,6 +1377,7 @@ mod tests {
13571377 metrics_registry : Arc :: new ( DefaultMetricsRegistry :: default ( ) ) ,
13581378 layout_readers : Default :: default ( ) ,
13591379 natural_split_ranges : Default :: default ( ) ,
1380+ vortex_files : Default :: default ( ) ,
13601381 has_output_ordering : false ,
13611382 expression_convertor : Arc :: new ( DefaultExpressionConvertor :: default ( ) ) ,
13621383 file_metadata_cache : None ,
@@ -1418,6 +1439,7 @@ mod tests {
14181439 metrics_registry : Arc :: new ( DefaultMetricsRegistry :: default ( ) ) ,
14191440 layout_readers : Default :: default ( ) ,
14201441 natural_split_ranges : Default :: default ( ) ,
1442+ vortex_files : Default :: default ( ) ,
14211443 has_output_ordering : false ,
14221444 expression_convertor : Arc :: new ( DefaultExpressionConvertor :: default ( ) ) ,
14231445 file_metadata_cache : None ,
@@ -1628,6 +1650,7 @@ mod tests {
16281650 metrics_registry : Arc :: new ( DefaultMetricsRegistry :: default ( ) ) ,
16291651 layout_readers : Default :: default ( ) ,
16301652 natural_split_ranges : Default :: default ( ) ,
1653+ vortex_files : Default :: default ( ) ,
16311654 has_output_ordering : false ,
16321655 expression_convertor : Arc :: new ( DefaultExpressionConvertor :: default ( ) ) ,
16331656 file_metadata_cache : None ,
0 commit comments