21
21
22
22
import org .apache .hadoop .conf .Configuration ;
23
23
import org .apache .hadoop .fs .s3a .VectoredIOContext ;
24
+ import org .apache .hadoop .util .functional .CallableRaisingIOE ;
25
+ import org .apache .hadoop .util .functional .LazyAutoCloseableReference ;
24
26
27
+ import software .amazon .awssdk .services .s3 .S3AsyncClient ;
28
+ import software .amazon .awssdk .services .s3 .S3Client ;
25
29
import software .amazon .s3 .analyticsaccelerator .S3SdkObjectClient ;
26
30
import software .amazon .s3 .analyticsaccelerator .S3SeekableInputStreamConfiguration ;
27
31
import software .amazon .s3 .analyticsaccelerator .S3SeekableInputStreamFactory ;
39
43
public class AnalyticsStreamFactory extends AbstractObjectInputStreamFactory {
40
44
41
45
private S3SeekableInputStreamConfiguration seekableInputStreamConfiguration ;
42
- private S3SeekableInputStreamFactory s3SeekableInputStreamFactory ;
46
+ private LazyAutoCloseableReference < S3SeekableInputStreamFactory > s3SeekableInputStreamFactory ;
43
47
private boolean requireCrt ;
44
48
45
49
public AnalyticsStreamFactory () {
@@ -59,20 +63,17 @@ protected void serviceInit(final Configuration conf) throws Exception {
59
63
@ Override
60
64
public void bind (final FactoryBindingParameters factoryBindingParameters ) throws IOException {
61
65
super .bind (factoryBindingParameters );
62
- this .s3SeekableInputStreamFactory = new S3SeekableInputStreamFactory (
63
- new S3SdkObjectClient (callbacks ().getOrCreateAsyncClient (requireCrt )),
64
- seekableInputStreamConfiguration );
66
+ this .s3SeekableInputStreamFactory = new LazyAutoCloseableReference <>(createS3SeekableInputStreamFactory ());
67
+
65
68
}
66
69
67
70
@ Override
68
71
public ObjectInputStream readObject (final ObjectReadParameters parameters ) throws IOException {
69
72
return new AnalyticsStream (
70
73
parameters ,
71
- s3SeekableInputStreamFactory );
74
+ getOrCreateS3SeekableInputStreamFactory () );
72
75
}
73
-
74
-
75
-
76
+
76
77
@ Override
77
78
public InputStreamType streamType () {
78
79
return InputStreamType .Analytics ;
@@ -95,5 +96,15 @@ public StreamFactoryRequirements factoryRequirements() {
95
96
0 , vectorContext );
96
97
}
97
98
99
+ private S3SeekableInputStreamFactory getOrCreateS3SeekableInputStreamFactory ()
100
+ throws IOException {
101
+ return s3SeekableInputStreamFactory .eval ();
102
+ }
103
+
104
+ private CallableRaisingIOE <S3SeekableInputStreamFactory > createS3SeekableInputStreamFactory () {
105
+ return () -> new S3SeekableInputStreamFactory (
106
+ new S3SdkObjectClient (callbacks ().getOrCreateAsyncClient (requireCrt )),
107
+ seekableInputStreamConfiguration );
108
+ }
98
109
99
110
}
0 commit comments