@@ -71,7 +71,7 @@ impl PyFileStatus {
71
71
72
72
#[ pyclass( name = "FileStatusIter" ) ]
73
73
struct PyFileStatusIter {
74
- inner : ListStatusIterator ,
74
+ inner : Arc < ListStatusIterator > ,
75
75
rt : Arc < Runtime > ,
76
76
}
77
77
@@ -81,10 +81,11 @@ impl PyFileStatusIter {
81
81
slf
82
82
}
83
83
84
- fn __next__ ( mut slf : PyRefMut < ' _ , Self > ) -> PyHdfsResult < Option < PyFileStatus > > {
85
- // This is dumb, figure out how to get around the double borrow here
84
+ fn __next__ ( slf : PyRefMut < ' _ , Self > ) -> PyHdfsResult < Option < PyFileStatus > > {
85
+ // Kinda dumb, but lets us release the GIL while getting the next value
86
+ let inner = Arc :: clone ( & slf. inner ) ;
86
87
let rt = Arc :: clone ( & slf. rt ) ;
87
- if let Some ( result) = rt. block_on ( slf . inner . next ( ) ) {
88
+ if let Some ( result) = slf . py ( ) . allow_threads ( || rt. block_on ( inner. next ( ) ) ) {
88
89
Ok ( Some ( PyFileStatus :: from ( result?) ) )
89
90
} else {
90
91
Ok ( None )
@@ -150,21 +151,21 @@ impl RawFileReader {
150
151
self . inner . tell ( )
151
152
}
152
153
153
- pub fn read ( & mut self , len : i64 ) -> PyHdfsResult < Cow < [ u8 ] > > {
154
+ pub fn read ( & mut self , len : i64 , py : Python ) -> PyHdfsResult < Cow < [ u8 ] > > {
154
155
let read_len = if len < 0 {
155
156
self . inner . remaining ( )
156
157
} else {
157
158
len as usize
158
159
} ;
159
160
Ok ( Cow :: from (
160
- self . rt . block_on ( self . inner . read ( read_len) ) ?. to_vec ( ) ,
161
+ py. allow_threads ( || self . rt . block_on ( self . inner . read ( read_len) ) ) ?
162
+ . to_vec ( ) ,
161
163
) )
162
164
}
163
165
164
- pub fn read_range ( & self , offset : usize , len : usize ) -> PyHdfsResult < Cow < [ u8 ] > > {
166
+ pub fn read_range ( & self , offset : usize , len : usize , py : Python ) -> PyHdfsResult < Cow < [ u8 ] > > {
165
167
Ok ( Cow :: from (
166
- self . rt
167
- . block_on ( self . inner . read_range ( offset, len) ) ?
168
+ py. allow_threads ( || self . rt . block_on ( self . inner . read_range ( offset, len) ) ) ?
168
169
. to_vec ( ) ,
169
170
) )
170
171
}
@@ -254,12 +255,12 @@ struct RawFileWriter {
254
255
255
256
#[ pymethods]
256
257
impl RawFileWriter {
257
- pub fn write ( & mut self , buf : Vec < u8 > ) -> PyHdfsResult < usize > {
258
- Ok ( self . rt . block_on ( self . inner . write ( Bytes :: from ( buf) ) ) ?)
258
+ pub fn write ( & mut self , buf : Vec < u8 > , py : Python ) -> PyHdfsResult < usize > {
259
+ Ok ( py . allow_threads ( || self . rt . block_on ( self . inner . write ( Bytes :: from ( buf) ) ) ) ?)
259
260
}
260
261
261
- pub fn close ( & mut self ) -> PyHdfsResult < ( ) > {
262
- Ok ( self . rt . block_on ( self . inner . close ( ) ) ?)
262
+ pub fn close ( & mut self , py : Python ) -> PyHdfsResult < ( ) > {
263
+ Ok ( py . allow_threads ( || self . rt . block_on ( self . inner . close ( ) ) ) ?)
263
264
}
264
265
}
265
266
@@ -294,93 +295,109 @@ impl RawClient {
294
295
} )
295
296
}
296
297
297
- pub fn get_file_info ( & self , path : & str ) -> PyHdfsResult < PyFileStatus > {
298
- Ok ( self
299
- . rt
300
- . block_on ( self . inner . get_file_info ( path) )
301
- . map ( PyFileStatus :: from) ?)
298
+ pub fn get_file_info ( & self , path : & str , py : Python ) -> PyHdfsResult < PyFileStatus > {
299
+ Ok ( py. allow_threads ( || {
300
+ self . rt
301
+ . block_on ( self . inner . get_file_info ( path) )
302
+ . map ( PyFileStatus :: from)
303
+ } ) ?)
302
304
}
303
305
304
306
pub fn list_status ( & self , path : & str , recursive : bool ) -> PyFileStatusIter {
305
307
let inner = self . inner . list_status_iter ( path, recursive) ;
306
308
PyFileStatusIter {
307
- inner,
309
+ inner : Arc :: new ( inner ) ,
308
310
rt : Arc :: clone ( & self . rt ) ,
309
311
}
310
312
}
311
313
312
- pub fn read ( & self , path : & str ) -> PyHdfsResult < RawFileReader > {
313
- let file_reader = self . rt . block_on ( self . inner . read ( path) ) ?;
314
+ pub fn read ( & self , path : & str , py : Python ) -> PyHdfsResult < RawFileReader > {
315
+ let file_reader = py . allow_threads ( || self . rt . block_on ( self . inner . read ( path) ) ) ?;
314
316
315
317
Ok ( RawFileReader {
316
318
inner : file_reader,
317
319
rt : Arc :: clone ( & self . rt ) ,
318
320
} )
319
321
}
320
322
321
- pub fn create ( & self , src : & str , write_options : PyWriteOptions ) -> PyHdfsResult < RawFileWriter > {
322
- let file_writer = self
323
- . rt
324
- . block_on ( self . inner . create ( src, WriteOptions :: from ( write_options) ) ) ?;
323
+ pub fn create (
324
+ & self ,
325
+ src : & str ,
326
+ write_options : PyWriteOptions ,
327
+ py : Python ,
328
+ ) -> PyHdfsResult < RawFileWriter > {
329
+ let file_writer = py. allow_threads ( || {
330
+ self . rt
331
+ . block_on ( self . inner . create ( src, WriteOptions :: from ( write_options) ) )
332
+ } ) ?;
325
333
326
334
Ok ( RawFileWriter {
327
335
inner : file_writer,
328
336
rt : Arc :: clone ( & self . rt ) ,
329
337
} )
330
338
}
331
339
332
- pub fn append ( & self , src : & str ) -> PyHdfsResult < RawFileWriter > {
333
- let file_writer = self . rt . block_on ( self . inner . append ( src) ) ?;
340
+ pub fn append ( & self , src : & str , py : Python ) -> PyHdfsResult < RawFileWriter > {
341
+ let file_writer = py . allow_threads ( || self . rt . block_on ( self . inner . append ( src) ) ) ?;
334
342
335
343
Ok ( RawFileWriter {
336
344
inner : file_writer,
337
345
rt : Arc :: clone ( & self . rt ) ,
338
346
} )
339
347
}
340
348
341
- pub fn mkdirs ( & self , path : & str , permission : u32 , create_parent : bool ) -> PyHdfsResult < ( ) > {
342
- Ok ( self
343
- . rt
344
- . block_on ( self . inner . mkdirs ( path, permission, create_parent) ) ?)
349
+ pub fn mkdirs (
350
+ & self ,
351
+ path : & str ,
352
+ permission : u32 ,
353
+ create_parent : bool ,
354
+ py : Python ,
355
+ ) -> PyHdfsResult < ( ) > {
356
+ Ok ( py. allow_threads ( || {
357
+ self . rt
358
+ . block_on ( self . inner . mkdirs ( path, permission, create_parent) )
359
+ } ) ?)
345
360
}
346
361
347
- pub fn rename ( & self , src : & str , dst : & str , overwrite : bool ) -> PyHdfsResult < ( ) > {
348
- Ok ( self . rt . block_on ( self . inner . rename ( src, dst, overwrite) ) ?)
362
+ pub fn rename ( & self , src : & str , dst : & str , overwrite : bool , py : Python ) -> PyHdfsResult < ( ) > {
363
+ Ok ( py . allow_threads ( || self . rt . block_on ( self . inner . rename ( src, dst, overwrite) ) ) ?)
349
364
}
350
365
351
- pub fn delete ( & self , path : & str , recursive : bool ) -> PyHdfsResult < bool > {
352
- Ok ( self . rt . block_on ( self . inner . delete ( path, recursive) ) ?)
366
+ pub fn delete ( & self , path : & str , recursive : bool , py : Python ) -> PyHdfsResult < bool > {
367
+ Ok ( py . allow_threads ( || self . rt . block_on ( self . inner . delete ( path, recursive) ) ) ?)
353
368
}
354
369
355
- pub fn set_times ( & self , path : & str , mtime : u64 , atime : u64 ) -> PyHdfsResult < ( ) > {
356
- Ok ( self . rt . block_on ( self . inner . set_times ( path, mtime, atime) ) ?)
370
+ pub fn set_times ( & self , path : & str , mtime : u64 , atime : u64 , py : Python ) -> PyHdfsResult < ( ) > {
371
+ Ok ( py . allow_threads ( || self . rt . block_on ( self . inner . set_times ( path, mtime, atime) ) ) ?)
357
372
}
358
373
359
374
pub fn set_owner (
360
375
& self ,
361
376
path : & str ,
362
377
owner : Option < & str > ,
363
378
group : Option < & str > ,
379
+ py : Python ,
364
380
) -> PyHdfsResult < ( ) > {
365
- Ok ( self . rt . block_on ( self . inner . set_owner ( path, owner, group) ) ?)
381
+ Ok ( py . allow_threads ( || self . rt . block_on ( self . inner . set_owner ( path, owner, group) ) ) ?)
366
382
}
367
383
368
- pub fn set_permission ( & self , path : & str , permission : u32 ) -> PyHdfsResult < ( ) > {
369
- Ok ( self
370
- . rt
371
- . block_on ( self . inner . set_permission ( path, permission) ) ?)
384
+ pub fn set_permission ( & self , path : & str , permission : u32 , py : Python ) -> PyHdfsResult < ( ) > {
385
+ Ok ( py. allow_threads ( || {
386
+ self . rt
387
+ . block_on ( self . inner . set_permission ( path, permission) )
388
+ } ) ?)
372
389
}
373
390
374
- pub fn set_replication ( & self , path : & str , replication : u32 ) -> PyHdfsResult < bool > {
375
- Ok ( self
376
- . rt
377
- . block_on ( self . inner . set_replication ( path, replication) ) ?)
391
+ pub fn set_replication ( & self , path : & str , replication : u32 , py : Python ) -> PyHdfsResult < bool > {
392
+ Ok ( py. allow_threads ( || {
393
+ self . rt
394
+ . block_on ( self . inner . set_replication ( path, replication) )
395
+ } ) ?)
378
396
}
379
397
380
- pub fn get_content_summary ( & self , path : & str ) -> PyHdfsResult < PyContentSummary > {
381
- Ok ( self
382
- . rt
383
- . block_on ( self . inner . get_content_summary ( path) ) ?
398
+ pub fn get_content_summary ( & self , path : & str , py : Python ) -> PyHdfsResult < PyContentSummary > {
399
+ Ok ( py
400
+ . allow_threads ( || self . rt . block_on ( self . inner . get_content_summary ( path) ) ) ?
384
401
. into ( ) )
385
402
}
386
403
}
0 commit comments