11use async_trait:: async_trait;
22use aws_sdk_s3:: error:: { HeadBucketError , HeadBucketErrorKind } ;
3- use aws_sdk_s3:: model:: { Delete , ObjectIdentifier } ;
3+ use aws_sdk_s3:: model:: { CommonPrefix , Delete , ObjectIdentifier } ;
44use aws_sdk_s3:: types:: { ByteStream , SdkError } ;
55use aws_sdk_s3:: Error as AwsSdkError ;
66use aws_sdk_s3:: { Client , Credentials , Endpoint , Region } ;
@@ -18,7 +18,6 @@ use futures::StreamExt;
1818use http:: Uri ;
1919use object_store:: aws:: AmazonS3Builder ;
2020use object_store:: limit:: LimitStore ;
21- use std:: collections:: HashSet ;
2221use std:: fs;
2322use std:: iter:: Iterator ;
2423use std:: sync:: Arc ;
@@ -298,23 +297,22 @@ impl S3 {
298297 . client
299298 . list_objects_v2 ( )
300299 . bucket ( & S3_CONFIG . s3_bucket_name )
300+ . delimiter ( '/' )
301301 . send ( )
302302 . 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- }
316303
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+ . into_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)
318316 }
319317
320318 async fn _upload_file ( & self , key : & str , path : & str ) -> Result < ( ) , AwsSdkError > {
0 commit comments