1
1
use async_trait:: async_trait;
2
2
use aws_sdk_s3:: error:: { HeadBucketError , HeadBucketErrorKind } ;
3
- use aws_sdk_s3:: model:: { Delete , ObjectIdentifier } ;
3
+ use aws_sdk_s3:: model:: { CommonPrefix , Delete , ObjectIdentifier } ;
4
4
use aws_sdk_s3:: types:: { ByteStream , SdkError } ;
5
5
use aws_sdk_s3:: Error as AwsSdkError ;
6
6
use aws_sdk_s3:: { Client , Credentials , Endpoint , Region } ;
@@ -18,7 +18,6 @@ use futures::StreamExt;
18
18
use http:: Uri ;
19
19
use object_store:: aws:: AmazonS3Builder ;
20
20
use object_store:: limit:: LimitStore ;
21
- use std:: collections:: HashSet ;
22
21
use std:: fs;
23
22
use std:: iter:: Iterator ;
24
23
use std:: sync:: Arc ;
@@ -298,23 +297,22 @@ impl S3 {
298
297
. client
299
298
. list_objects_v2 ( )
300
299
. bucket ( & S3_CONFIG . s3_bucket_name )
300
+ . delimiter ( '/' )
301
301
. send ( )
302
302
. await ?;
303
- let body = resp. contents ( ) . unwrap_or_default ( ) ;
304
- // make a set of unique prefixes at the root level
305
- let mut hs = HashSet :: < String > :: new ( ) ;
306
- for logstream in body {
307
- let name = logstream. key ( ) . unwrap_or_default ( ) . to_string ( ) ;
308
- let tokens = name. split ( '/' ) . collect :: < Vec < & str > > ( ) ;
309
- hs. insert ( tokens[ 0 ] . to_string ( ) ) ;
310
- }
311
- // transform that hashset to a vector before returning
312
- let mut streams = Vec :: new ( ) ;
313
- for v in hs {
314
- streams. push ( LogStream { name : v } ) ;
315
- }
316
303
317
- Ok ( streams)
304
+ let common_prefixes = resp. common_prefixes ( ) . unwrap_or_default ( ) ;
305
+
306
+ // return prefixes at the root level
307
+ let logstreams: Vec < _ > = common_prefixes
308
+ . iter ( )
309
+ . filter_map ( CommonPrefix :: prefix)
310
+ . filter_map ( |name| name. strip_suffix ( '/' ) )
311
+ . map ( String :: from)
312
+ . map ( |name| LogStream { name } )
313
+ . collect ( ) ;
314
+
315
+ Ok ( logstreams)
318
316
}
319
317
320
318
async fn _upload_file ( & self , key : & str , path : & str ) -> Result < ( ) , AwsSdkError > {
0 commit comments