11use async_trait:: async_trait;
2+ use aws_sdk_s3:: error:: { HeadBucketError , HeadBucketErrorKind } ;
23use aws_sdk_s3:: model:: { Delete , ObjectIdentifier } ;
3- use aws_sdk_s3:: types:: ByteStream ;
4+ use aws_sdk_s3:: types:: { ByteStream , SdkError } ;
45use aws_sdk_s3:: Error as AwsSdkError ;
56use aws_sdk_s3:: { Client , Credentials , Endpoint , Region } ;
67use aws_types:: credentials:: SharedCredentialsProvider ;
@@ -18,7 +19,6 @@ use std::sync::Arc;
1819use structopt:: StructOpt ;
1920use tokio_stream:: StreamExt ;
2021
21- use crate :: error:: Error ;
2222use crate :: metadata:: Stats ;
2323use crate :: option:: { StorageOpt , CONFIG } ;
2424use crate :: query:: Query ;
@@ -96,14 +96,6 @@ impl StorageOpt for S3Config {
9696 }
9797}
9898
99- impl ObjectStorageError for AwsSdkError { }
100-
101- impl From < AwsSdkError > for Error {
102- fn from ( e : AwsSdkError ) -> Self {
103- Self :: Storage ( Box :: new ( e) )
104- }
105- }
106-
10799struct S3Options {
108100 endpoint : Endpoint ,
109101 region : Region ,
@@ -304,70 +296,83 @@ impl S3 {
304296
305297#[ async_trait]
306298impl ObjectStorage for S3 {
307- async fn is_available ( & self ) -> bool {
299+ async fn check ( & self ) -> Result < ( ) , ObjectStorageError > {
308300 self . client
309301 . head_bucket ( )
310302 . bucket ( & S3_CONFIG . s3_bucket_name )
311303 . send ( )
312304 . await
313- . is_ok ( )
305+ . map ( |_| ( ) )
306+ . map_err ( |err| err. into ( ) )
314307 }
315308
316- async fn put_schema ( & self , stream_name : String , body : String ) -> Result < ( ) , Error > {
309+ async fn put_schema (
310+ & self ,
311+ stream_name : String ,
312+ body : String ,
313+ ) -> Result < ( ) , ObjectStorageError > {
317314 self . _put_schema ( stream_name, body) . await ?;
318315
319316 Ok ( ( ) )
320317 }
321318
322- async fn create_stream ( & self , stream_name : & str ) -> Result < ( ) , Error > {
319+ async fn create_stream ( & self , stream_name : & str ) -> Result < ( ) , ObjectStorageError > {
323320 self . _create_stream ( stream_name) . await ?;
324321
325322 Ok ( ( ) )
326323 }
327324
328- async fn delete_stream ( & self , stream_name : & str ) -> Result < ( ) , Error > {
325+ async fn delete_stream ( & self , stream_name : & str ) -> Result < ( ) , ObjectStorageError > {
329326 self . _delete_stream ( stream_name) . await ?;
330327
331328 Ok ( ( ) )
332329 }
333330
334- async fn create_alert ( & self , stream_name : & str , body : String ) -> Result < ( ) , Error > {
331+ async fn create_alert (
332+ & self ,
333+ stream_name : & str ,
334+ body : String ,
335+ ) -> Result < ( ) , ObjectStorageError > {
335336 self . _create_alert ( stream_name, body) . await ?;
336337
337338 Ok ( ( ) )
338339 }
339340
340- async fn get_schema ( & self , stream_name : & str ) -> Result < Bytes , Error > {
341+ async fn get_schema ( & self , stream_name : & str ) -> Result < Bytes , ObjectStorageError > {
341342 let body_bytes = self . _get_schema ( stream_name) . await ?;
342343
343344 Ok ( body_bytes)
344345 }
345346
346- async fn get_alert ( & self , stream_name : & str ) -> Result < Bytes , Error > {
347+ async fn get_alert ( & self , stream_name : & str ) -> Result < Bytes , ObjectStorageError > {
347348 let body_bytes = self . _alert_exists ( stream_name) . await ?;
348349
349350 Ok ( body_bytes)
350351 }
351352
352- async fn get_stats ( & self , stream_name : & str ) -> Result < Stats , Error > {
353+ async fn get_stats ( & self , stream_name : & str ) -> Result < Stats , ObjectStorageError > {
353354 let stats = serde_json:: from_slice ( & self . _get_stats ( stream_name) . await ?) ?;
354355
355356 Ok ( stats)
356357 }
357358
358- async fn list_streams ( & self ) -> Result < Vec < LogStream > , Error > {
359+ async fn list_streams ( & self ) -> Result < Vec < LogStream > , ObjectStorageError > {
359360 let streams = self . _list_streams ( ) . await ?;
360361
361362 Ok ( streams)
362363 }
363364
364- async fn upload_file ( & self , key : & str , path : & str ) -> Result < ( ) , Error > {
365+ async fn upload_file ( & self , key : & str , path : & str ) -> Result < ( ) , ObjectStorageError > {
365366 self . _upload_file ( key, path) . await ?;
366367
367368 Ok ( ( ) )
368369 }
369370
370- async fn query ( & self , query : & Query , results : & mut Vec < RecordBatch > ) -> Result < ( ) , Error > {
371+ async fn query (
372+ & self ,
373+ query : & Query ,
374+ results : & mut Vec < RecordBatch > ,
375+ ) -> Result < ( ) , ObjectStorageError > {
371376 let s3_file_system = Arc :: new (
372377 S3FileSystem :: new (
373378 Some ( SharedCredentialsProvider :: new ( self . options . creds . clone ( ) ) ) ,
@@ -397,9 +402,39 @@ impl ObjectStorage for S3 {
397402
398403 // execute the query and collect results
399404 let df = ctx. sql ( query. query . as_str ( ) ) . await ?;
400- results. extend ( df. collect ( ) . await . map_err ( Error :: DataFusion ) ?) ;
405+ results. extend ( df. collect ( ) . await ?) ;
401406 }
402407
403408 Ok ( ( ) )
404409 }
405410}
411+
412+ impl From < AwsSdkError > for ObjectStorageError {
413+ fn from ( error : AwsSdkError ) -> Self {
414+ ObjectStorageError :: UnhandledError ( error. into ( ) )
415+ }
416+ }
417+
418+ impl From < SdkError < HeadBucketError > > for ObjectStorageError {
419+ fn from ( error : SdkError < HeadBucketError > ) -> Self {
420+ match error {
421+ SdkError :: ServiceError {
422+ err :
423+ HeadBucketError {
424+ kind : HeadBucketErrorKind :: NotFound ( _) ,
425+ ..
426+ } ,
427+ ..
428+ } => ObjectStorageError :: NoSuchBucket ( S3_CONFIG . bucket_name ( ) . to_string ( ) ) ,
429+ SdkError :: DispatchFailure ( err) => ObjectStorageError :: ConnectionError ( err. into ( ) ) ,
430+ SdkError :: TimeoutError ( err) => ObjectStorageError :: ConnectionError ( err) ,
431+ err => ObjectStorageError :: UnhandledError ( err. into ( ) ) ,
432+ }
433+ }
434+ }
435+
436+ impl From < serde_json:: Error > for ObjectStorageError {
437+ fn from ( error : serde_json:: Error ) -> Self {
438+ ObjectStorageError :: UnhandledError ( error. into ( ) )
439+ }
440+ }
0 commit comments