16
16
17
17
package io .aiven .kafka .tieredstorage ;
18
18
19
- import javax .crypto .SecretKey ;
20
- import javax .crypto .spec .SecretKeySpec ;
21
-
22
19
import java .io .ByteArrayInputStream ;
23
20
import java .io .File ;
24
21
import java .io .IOException ;
35
32
import org .apache .kafka .server .log .remote .storage .RemoteLogSegmentMetadata ;
36
33
import org .apache .kafka .server .log .remote .storage .RemoteStorageException ;
37
34
38
- import io .aiven .kafka .tieredstorage .manifest .SegmentEncryptionMetadataV1 ;
39
35
import io .aiven .kafka .tieredstorage .manifest .SegmentManifest ;
40
- import io .aiven .kafka .tieredstorage .manifest .SegmentManifestV1 ;
41
- import io .aiven .kafka .tieredstorage .manifest .index .ChunkIndex ;
42
- import io .aiven .kafka .tieredstorage .manifest .serde .DataKeyDeserializer ;
43
- import io .aiven .kafka .tieredstorage .manifest .serde .DataKeySerializer ;
44
36
import io .aiven .kafka .tieredstorage .metrics .Metrics ;
45
- import io .aiven .kafka .tieredstorage .security .AesEncryptionProvider ;
46
- import io .aiven .kafka .tieredstorage .security .DataKeyAndAAD ;
47
- import io .aiven .kafka .tieredstorage .security .RsaEncryptionProvider ;
48
37
import io .aiven .kafka .tieredstorage .storage .BytesRange ;
49
38
import io .aiven .kafka .tieredstorage .storage .ObjectDeleter ;
50
39
import io .aiven .kafka .tieredstorage .storage .ObjectFetcher ;
51
40
import io .aiven .kafka .tieredstorage .storage .ObjectUploader ;
52
41
import io .aiven .kafka .tieredstorage .storage .StorageBackendException ;
53
- import io .aiven .kafka .tieredstorage .transform .BaseTransformChunkEnumeration ;
54
- import io .aiven .kafka .tieredstorage .transform .CompressionChunkEnumeration ;
55
- import io .aiven .kafka .tieredstorage .transform .EncryptionChunkEnumeration ;
56
42
import io .aiven .kafka .tieredstorage .transform .FetchChunkEnumeration ;
57
- import io .aiven .kafka .tieredstorage .transform .TransformChunkEnumeration ;
58
43
import io .aiven .kafka .tieredstorage .transform .TransformFinisher ;
44
+ import io .aiven .kafka .tieredstorage .transform .TransformPipeline ;
59
45
60
- import com .fasterxml .jackson .databind .ObjectMapper ;
61
- import com .fasterxml .jackson .databind .module .SimpleModule ;
62
- import com .fasterxml .jackson .datatype .jdk8 .Jdk8Module ;
63
46
import org .slf4j .Logger ;
64
47
import org .slf4j .LoggerFactory ;
65
48
@@ -83,13 +66,9 @@ public class RemoteStorageManager implements org.apache.kafka.server.log.remote.
83
66
private ObjectDeleter deleter ;
84
67
private boolean compressionEnabled ;
85
68
private boolean compressionHeuristic ;
86
- private boolean encryptionEnabled ;
87
- private int chunkSize ;
88
- private RsaEncryptionProvider rsaEncryptionProvider ;
89
- private AesEncryptionProvider aesEncryptionProvider ;
90
- private ObjectMapper mapper ;
91
69
private ChunkManager chunkManager ;
92
70
private ObjectKey objectKey ;
71
+ private TransformPipeline transformPipeline ;
93
72
94
73
private SegmentManifestProvider segmentManifestProvider ;
95
74
@@ -111,49 +90,27 @@ public void configure(final Map<String, ?> configs) {
111
90
uploader = config .storage ();
112
91
deleter = config .storage ();
113
92
objectKey = new ObjectKey (config .keyPrefix ());
114
- encryptionEnabled = config .encryptionEnabled ();
115
- if (encryptionEnabled ) {
116
- rsaEncryptionProvider = RsaEncryptionProvider .of (
117
- config .encryptionPublicKeyFile (),
118
- config .encryptionPrivateKeyFile ()
119
- );
120
- aesEncryptionProvider = new AesEncryptionProvider ();
121
- }
122
- chunkManager = new ChunkManager (
123
- fetcher ,
124
- objectKey ,
125
- aesEncryptionProvider ,
126
- config .chunkCache ()
127
- );
128
93
129
- chunkSize = config .chunkSize ();
130
94
compressionEnabled = config .compressionEnabled ();
131
95
compressionHeuristic = config .compressionHeuristicEnabled ();
132
96
133
- mapper = getObjectMapper ();
97
+ transformPipeline = TransformPipeline . newBuilder (). fromConfig ( config ). build ();
134
98
99
+ chunkManager = new ChunkManager (
100
+ fetcher ,
101
+ objectKey ,
102
+ config .chunkCache (),
103
+ transformPipeline
104
+ );
135
105
segmentManifestProvider = new SegmentManifestProvider (
136
106
objectKey ,
137
107
config .segmentManifestCacheSize (),
138
108
config .segmentManifestCacheRetention (),
139
109
fetcher ,
140
- mapper ,
110
+ transformPipeline . objectMapper () ,
141
111
executor );
142
112
}
143
113
144
- private ObjectMapper getObjectMapper () {
145
- final ObjectMapper objectMapper = new ObjectMapper ();
146
- objectMapper .registerModule (new Jdk8Module ());
147
- if (encryptionEnabled ) {
148
- final SimpleModule simpleModule = new SimpleModule ();
149
- simpleModule .addSerializer (SecretKey .class , new DataKeySerializer (rsaEncryptionProvider ::encryptDataKey ));
150
- simpleModule .addDeserializer (SecretKey .class , new DataKeyDeserializer (
151
- b -> new SecretKeySpec (rsaEncryptionProvider .decryptDataKey (b ), "AES" )));
152
- objectMapper .registerModule (simpleModule );
153
- }
154
- return objectMapper ;
155
- }
156
-
157
114
@ Override
158
115
public void copyLogSegmentData (final RemoteLogSegmentMetadata remoteLogSegmentMetadata ,
159
116
final LogSegmentData logSegmentData ) throws RemoteStorageException {
@@ -165,27 +122,11 @@ public void copyLogSegmentData(final RemoteLogSegmentMetadata remoteLogSegmentMe
165
122
final long startedMs = time .milliseconds ();
166
123
167
124
try {
168
- TransformChunkEnumeration transformEnum = new BaseTransformChunkEnumeration (
169
- Files .newInputStream (logSegmentData .logSegment ()), chunkSize );
170
- SegmentEncryptionMetadataV1 encryptionMetadata = null ;
171
- final boolean requiresCompression = requiresCompression (logSegmentData );
172
- if (requiresCompression ) {
173
- transformEnum = new CompressionChunkEnumeration (transformEnum );
174
- }
175
- if (encryptionEnabled ) {
176
- final DataKeyAndAAD dataKeyAndAAD = aesEncryptionProvider .createDataKeyAndAAD ();
177
- transformEnum = new EncryptionChunkEnumeration (
178
- transformEnum ,
179
- () -> aesEncryptionProvider .encryptionCipher (dataKeyAndAAD ));
180
- encryptionMetadata = new SegmentEncryptionMetadataV1 (dataKeyAndAAD .dataKey , dataKeyAndAAD .aad );
181
- }
182
- final TransformFinisher transformFinisher =
183
- new TransformFinisher (transformEnum , remoteLogSegmentMetadata .segmentSizeInBytes ());
125
+ final var inboundTransformChain = transformPipeline .inboundTransformChain (logSegmentData .logSegment ());
126
+ final var transformFinisher = inboundTransformChain .complete ();
184
127
uploadSegmentLog (remoteLogSegmentMetadata , transformFinisher );
185
128
186
- final ChunkIndex chunkIndex = transformFinisher .chunkIndex ();
187
- final SegmentManifest segmentManifest =
188
- new SegmentManifestV1 (chunkIndex , requiresCompression , encryptionMetadata );
129
+ final SegmentManifest segmentManifest = transformPipeline .segmentManifest (transformFinisher .chunkIndex ());
189
130
uploadManifest (remoteLogSegmentMetadata , segmentManifest );
190
131
191
132
final InputStream offsetIndex = Files .newInputStream (logSegmentData .offsetIndex ());
@@ -248,10 +189,9 @@ private void uploadIndexFile(final RemoteLogSegmentMetadata remoteLogSegmentMeta
248
189
private void uploadManifest (final RemoteLogSegmentMetadata remoteLogSegmentMetadata ,
249
190
final SegmentManifest segmentManifest )
250
191
throws StorageBackendException , IOException {
251
- final String manifest = mapper .writeValueAsString (segmentManifest );
252
- final String manifestFileKey = objectKey .key (remoteLogSegmentMetadata , ObjectKey .Suffix .MANIFEST );
253
-
254
- try (final ByteArrayInputStream manifestContent = new ByteArrayInputStream (manifest .getBytes ())) {
192
+ final byte [] manifestBytes = transformPipeline .objectMapper ().writeValueAsBytes (segmentManifest );
193
+ try (final var manifestContent = new ByteArrayInputStream (manifestBytes )) {
194
+ final String manifestFileKey = objectKey .key (remoteLogSegmentMetadata , ObjectKey .Suffix .MANIFEST );
255
195
uploader .upload (manifestContent , manifestFileKey );
256
196
}
257
197
}
0 commit comments