@@ -38,6 +38,7 @@ use jni::{
3838 sys:: { jbyteArray, jint, jlong, jlongArray} ,
3939 JNIEnv ,
4040} ;
41+ use std:: path:: PathBuf ;
4142use std:: time:: { Duration , Instant } ;
4243use std:: { collections:: HashMap , sync:: Arc , task:: Poll } ;
4344
@@ -167,6 +168,7 @@ pub unsafe extern "system" fn Java_org_apache_comet_Native_createPlan(
167168 metrics_node : JObject ,
168169 metrics_update_interval : jlong ,
169170 comet_task_memory_manager_obj : JObject ,
171+ local_dirs : jobjectArray ,
170172 batch_size : jint ,
171173 off_heap_mode : jboolean ,
172174 memory_pool_type : jstring ,
@@ -208,6 +210,8 @@ pub unsafe extern "system" fn Java_org_apache_comet_Native_createPlan(
208210 let input_source = Arc :: new ( jni_new_global_ref ! ( env, input_source) ?) ;
209211 input_sources. push ( input_source) ;
210212 }
213+
214+ // Create DataFusion memory pool
211215 let task_memory_manager =
212216 Arc :: new ( jni_new_global_ref ! ( env, comet_task_memory_manager_obj) ?) ;
213217
@@ -221,10 +225,21 @@ pub unsafe extern "system" fn Java_org_apache_comet_Native_createPlan(
221225 let memory_pool =
222226 create_memory_pool ( & memory_pool_config, task_memory_manager, task_attempt_id) ;
223227
228+ // Get local directories for storing spill files
229+ let local_dirs_array = JObjectArray :: from_raw ( local_dirs) ;
230+ let num_local_dirs = env. get_array_length ( & local_dirs_array) ?;
231+ let mut local_dirs = vec ! [ ] ;
232+ for i in 0 ..num_local_dirs {
233+ let local_dir: JString = env. get_object_array_element ( & local_dirs_array, i) ?. into ( ) ;
234+ let local_dir = env. get_string ( & local_dir) ?;
235+ local_dirs. push ( local_dir. into ( ) ) ;
236+ }
237+
224238 // We need to keep the session context alive. Some session state like temporary
225239 // dictionaries are stored in session context. If it is dropped, the temporary
226240 // dictionaries will be dropped as well.
227- let session = prepare_datafusion_session_context ( batch_size as usize , memory_pool) ?;
241+ let session =
242+ prepare_datafusion_session_context ( batch_size as usize , memory_pool, local_dirs) ?;
228243
229244 let plan_creation_time = start. elapsed ( ) ;
230245
@@ -262,8 +277,11 @@ pub unsafe extern "system" fn Java_org_apache_comet_Native_createPlan(
262277fn prepare_datafusion_session_context (
263278 batch_size : usize ,
264279 memory_pool : Arc < dyn MemoryPool > ,
280+ local_dirs : Vec < String > ,
265281) -> CometResult < SessionContext > {
266- let mut rt_config = RuntimeEnvBuilder :: new ( ) . with_disk_manager ( DiskManagerConfig :: NewOs ) ;
282+ let disk_manager_config =
283+ DiskManagerConfig :: NewSpecified ( local_dirs. into_iter ( ) . map ( PathBuf :: from) . collect ( ) ) ;
284+ let mut rt_config = RuntimeEnvBuilder :: new ( ) . with_disk_manager ( disk_manager_config) ;
267285 rt_config = rt_config. with_memory_pool ( memory_pool) ;
268286
269287 // Get Datafusion configuration from Spark Execution context
0 commit comments