@@ -96,6 +96,19 @@ pub struct DeltaLakeCdfConfig {
9696 #[ serde( default ) ]
9797 pub ending_version : Option < i64 > ,
9898
99+ /// Maximum number of versions to process per poll cycle.
100+ ///
101+ /// When catching up on a large backlog of versions, processing too many
102+ /// versions at once can cause the query planner to hang while listing
103+ /// thousands of CDF files. This option limits how many versions are
104+ /// processed in each poll cycle, allowing incremental catchup.
105+ ///
106+ /// If not specified, all available versions are processed at once.
107+ #[ serde( default ) ]
108+ #[ configurable( metadata( docs:: examples = 100 ) ) ]
109+ #[ configurable( metadata( docs:: examples = 1000 ) ) ]
110+ pub max_versions_per_poll : Option < i64 > ,
111+
99112 /// Directory for storing checkpoints.
100113 ///
101114 /// The source persists its current position (version) to disk
@@ -177,6 +190,7 @@ impl Default for DeltaLakeCdfConfig {
177190 include_data : default_include_data ( ) ,
178191 change_types : Vec :: new ( ) ,
179192 ending_version : None ,
193+ max_versions_per_poll : None ,
180194 data_dir : None ,
181195 log_namespace : None ,
182196 }
@@ -214,6 +228,7 @@ impl GenerateConfig for DeltaLakeCdfConfig {
214228 include_data : default_include_data ( ) ,
215229 change_types : Vec :: new ( ) ,
216230 ending_version : None ,
231+ max_versions_per_poll : None ,
217232 data_dir : None ,
218233 log_namespace : None ,
219234 } )
@@ -482,4 +497,25 @@ mod tests {
482497 ) ;
483498 assert_eq ! ( ChangeType :: from_cdf_string( "unknown" ) , None ) ;
484499 }
500+
501+ #[ test]
502+ fn test_config_max_versions_per_poll ( ) {
503+ let config_str = r#"
504+ table_uri = "s3://bucket/table"
505+ max_versions_per_poll = 100
506+ "# ;
507+
508+ let config: DeltaLakeCdfConfig = toml:: from_str ( config_str) . expect ( "Config should parse" ) ;
509+ assert_eq ! ( config. max_versions_per_poll, Some ( 100 ) ) ;
510+ }
511+
512+ #[ test]
513+ fn test_config_max_versions_per_poll_default ( ) {
514+ let config_str = r#"
515+ table_uri = "s3://bucket/table"
516+ "# ;
517+
518+ let config: DeltaLakeCdfConfig = toml:: from_str ( config_str) . expect ( "Config should parse" ) ;
519+ assert_eq ! ( config. max_versions_per_poll, None ) ;
520+ }
485521}
0 commit comments