3
3
4
4
use crate :: default_file_storage_format;
5
5
use aptos_protos:: { indexer:: v1:: TransactionsInStorage , transaction:: v1:: Transaction } ;
6
- use flate2 :: read :: { GzDecoder , GzEncoder } ;
6
+ use lz4 :: { Decoder , EncoderBuilder } ;
7
7
use prost:: Message ;
8
8
use ripemd:: { Digest , Ripemd128 } ;
9
9
use serde:: { Deserialize , Serialize } ;
10
- use std:: io:: Read ;
10
+ use std:: io:: { Read , Write } ;
11
11
12
12
pub const FILE_ENTRY_TRANSACTION_COUNT : u64 = 1000 ;
13
13
14
14
#[ derive( Serialize , Deserialize , Debug , Copy , Clone , Eq , PartialEq ) ]
15
15
pub enum StorageFormat {
16
- GzipCompressedProto ,
16
+ Lz4CompressedProto ,
17
17
// Only used for legacy file format.
18
18
// Use by cache only.
19
19
Base64UncompressedProto ,
@@ -66,15 +66,15 @@ impl FileStoreMetadata {
66
66
}
67
67
68
68
pub enum CacheEntry {
69
- GzipCompressionProto ( Vec < u8 > ) ,
69
+ Lz4CompressionProto ( Vec < u8 > ) ,
70
70
// Only used for legacy cache entry.
71
71
Base64UncompressedProto ( Vec < u8 > ) ,
72
72
}
73
73
74
74
impl CacheEntry {
75
75
pub fn new ( bytes : Vec < u8 > , storage_format : StorageFormat ) -> Self {
76
76
match storage_format {
77
- StorageFormat :: GzipCompressedProto => Self :: GzipCompressionProto ( bytes) ,
77
+ StorageFormat :: Lz4CompressedProto => Self :: Lz4CompressionProto ( bytes) ,
78
78
// Legacy format.
79
79
StorageFormat :: Base64UncompressedProto => Self :: Base64UncompressedProto ( bytes) ,
80
80
StorageFormat :: JsonBase64UncompressedProto => {
@@ -85,14 +85,14 @@ impl CacheEntry {
85
85
86
86
pub fn into_inner ( self ) -> Vec < u8 > {
87
87
match self {
88
- CacheEntry :: GzipCompressionProto ( bytes) => bytes,
88
+ CacheEntry :: Lz4CompressionProto ( bytes) => bytes,
89
89
CacheEntry :: Base64UncompressedProto ( bytes) => bytes,
90
90
}
91
91
}
92
92
93
93
pub fn size ( & self ) -> usize {
94
94
match self {
95
- CacheEntry :: GzipCompressionProto ( bytes) => bytes. len ( ) ,
95
+ CacheEntry :: Lz4CompressionProto ( bytes) => bytes. len ( ) ,
96
96
CacheEntry :: Base64UncompressedProto ( bytes) => bytes. len ( ) ,
97
97
}
98
98
}
@@ -103,13 +103,15 @@ impl CacheEntry {
103
103
. encode ( & mut bytes)
104
104
. expect ( "proto serialization failed." ) ;
105
105
match storage_format {
106
- StorageFormat :: GzipCompressedProto => {
107
- let mut compressed = GzEncoder :: new ( bytes. as_slice ( ) , flate2:: Compression :: fast ( ) ) ;
108
- let mut result = Vec :: new ( ) ;
106
+ StorageFormat :: Lz4CompressedProto => {
107
+ let mut compressed = EncoderBuilder :: new ( )
108
+ . level ( 4 )
109
+ . build ( Vec :: new ( ) )
110
+ . expect ( "Lz4 compression failed." ) ;
109
111
compressed
110
- . read_to_end ( & mut result )
111
- . expect ( "Gzip compression failed." ) ;
112
- CacheEntry :: GzipCompressionProto ( result )
112
+ . write_all ( & bytes )
113
+ . expect ( "Lz4 compression failed." ) ;
114
+ CacheEntry :: Lz4CompressionProto ( compressed . finish ( ) . 0 )
113
115
} ,
114
116
StorageFormat :: Base64UncompressedProto => {
115
117
let base64 = base64:: encode ( bytes) . into_bytes ( ) ;
@@ -124,8 +126,8 @@ impl CacheEntry {
124
126
125
127
pub fn build_key ( version : u64 , storage_format : StorageFormat ) -> String {
126
128
match storage_format {
127
- StorageFormat :: GzipCompressedProto => {
128
- format ! ( "gz :{}" , version)
129
+ StorageFormat :: Lz4CompressedProto => {
130
+ format ! ( "l4 :{}" , version)
129
131
} ,
130
132
StorageFormat :: Base64UncompressedProto => {
131
133
format ! ( "{}" , version)
@@ -139,12 +141,12 @@ impl CacheEntry {
139
141
140
142
pub fn into_transaction ( self ) -> Transaction {
141
143
match self {
142
- CacheEntry :: GzipCompressionProto ( bytes) => {
143
- let mut decompressor = GzDecoder :: new ( & bytes[ ..] ) ;
144
+ CacheEntry :: Lz4CompressionProto ( bytes) => {
145
+ let mut decompressor = Decoder :: new ( & bytes[ ..] ) . expect ( "Lz4 decompression failed." ) ;
144
146
let mut decompressed = Vec :: new ( ) ;
145
147
decompressor
146
148
. read_to_end ( & mut decompressed)
147
- . expect ( "Gzip decompression failed." ) ;
149
+ . expect ( "Lz4 decompression failed." ) ;
148
150
Transaction :: decode ( decompressed. as_slice ( ) ) . expect ( "proto deserialization failed." )
149
151
} ,
150
152
CacheEntry :: Base64UncompressedProto ( bytes) => {
@@ -156,15 +158,15 @@ impl CacheEntry {
156
158
}
157
159
158
160
pub enum FileEntry {
159
- GzipCompressionProto ( Vec < u8 > ) ,
161
+ Lz4CompressionProto ( Vec < u8 > ) ,
160
162
// Only used for legacy file format.
161
163
JsonBase64UncompressedProto ( Vec < u8 > ) ,
162
164
}
163
165
164
166
impl FileEntry {
165
167
pub fn new ( bytes : Vec < u8 > , storage_format : StorageFormat ) -> Self {
166
168
match storage_format {
167
- StorageFormat :: GzipCompressedProto => Self :: GzipCompressionProto ( bytes) ,
169
+ StorageFormat :: Lz4CompressedProto => Self :: Lz4CompressionProto ( bytes) ,
168
170
StorageFormat :: Base64UncompressedProto => {
169
171
panic ! ( "Base64UncompressedProto is not supported." )
170
172
} ,
@@ -174,14 +176,14 @@ impl FileEntry {
174
176
175
177
pub fn into_inner ( self ) -> Vec < u8 > {
176
178
match self {
177
- FileEntry :: GzipCompressionProto ( bytes) => bytes,
179
+ FileEntry :: Lz4CompressionProto ( bytes) => bytes,
178
180
FileEntry :: JsonBase64UncompressedProto ( bytes) => bytes,
179
181
}
180
182
}
181
183
182
184
pub fn size ( & self ) -> usize {
183
185
match self {
184
- FileEntry :: GzipCompressionProto ( bytes) => bytes. len ( ) ,
186
+ FileEntry :: Lz4CompressionProto ( bytes) => bytes. len ( ) ,
185
187
FileEntry :: JsonBase64UncompressedProto ( bytes) => bytes. len ( ) ,
186
188
}
187
189
}
@@ -203,18 +205,20 @@ impl FileEntry {
203
205
panic ! ( "Starting version has to be a multiple of FILE_ENTRY_TRANSACTION_COUNT." )
204
206
}
205
207
match storage_format {
206
- StorageFormat :: GzipCompressedProto => {
208
+ StorageFormat :: Lz4CompressedProto => {
207
209
let t = TransactionsInStorage {
208
210
starting_version : Some ( transactions. first ( ) . unwrap ( ) . version ) ,
209
211
transactions,
210
212
} ;
211
213
t. encode ( & mut bytes) . expect ( "proto serialization failed." ) ;
212
- let mut compressed = GzEncoder :: new ( bytes. as_slice ( ) , flate2:: Compression :: fast ( ) ) ;
213
- let mut result = Vec :: new ( ) ;
214
+ let mut compressed = EncoderBuilder :: new ( )
215
+ . level ( 4 )
216
+ . build ( Vec :: new ( ) )
217
+ . expect ( "Lz4 compression failed." ) ;
214
218
compressed
215
- . read_to_end ( & mut result )
216
- . expect ( "Gzip compression failed." ) ;
217
- FileEntry :: GzipCompressionProto ( result )
219
+ . write_all ( & bytes )
220
+ . expect ( "Lz4 compression failed." ) ;
221
+ FileEntry :: Lz4CompressionProto ( compressed . finish ( ) . 0 )
218
222
} ,
219
223
StorageFormat :: Base64UncompressedProto => {
220
224
panic ! ( "Base64UncompressedProto is not supported." )
@@ -247,9 +251,9 @@ impl FileEntry {
247
251
hasher. update ( starting_version. to_string ( ) ) ;
248
252
let file_prefix = format ! ( "{:x}" , hasher. finalize( ) ) ;
249
253
match storage_format {
250
- StorageFormat :: GzipCompressedProto => {
254
+ StorageFormat :: Lz4CompressedProto => {
251
255
format ! (
252
- "compressed_files/gzip /{}_{}.bin" ,
256
+ "compressed_files/lz4 /{}_{}.bin" ,
253
257
file_prefix, starting_version
254
258
)
255
259
} ,
@@ -264,12 +268,12 @@ impl FileEntry {
264
268
265
269
pub fn into_transactions_in_storage ( self ) -> TransactionsInStorage {
266
270
match self {
267
- FileEntry :: GzipCompressionProto ( bytes) => {
268
- let mut decompressor = GzDecoder :: new ( & bytes[ ..] ) ;
271
+ FileEntry :: Lz4CompressionProto ( bytes) => {
272
+ let mut decompressor = Decoder :: new ( & bytes[ ..] ) . expect ( "Lz4 decompression failed." ) ;
269
273
let mut decompressed = Vec :: new ( ) ;
270
274
decompressor
271
275
. read_to_end ( & mut decompressed)
272
- . expect ( "Gzip decompression failed." ) ;
276
+ . expect ( "Lz4 decompression failed." ) ;
273
277
TransactionsInStorage :: decode ( decompressed. as_slice ( ) )
274
278
. expect ( "proto deserialization failed." )
275
279
} ,
@@ -317,7 +321,7 @@ mod tests {
317
321
}
318
322
319
323
#[ test]
320
- fn test_cache_entry_builder_gzip_compressed_proto ( ) {
324
+ fn test_cache_entry_builder_lz4_compressed_proto ( ) {
321
325
let transaction = Transaction {
322
326
version : 42 ,
323
327
epoch : 333 ,
@@ -326,7 +330,7 @@ mod tests {
326
330
let transaction_clone = transaction. clone ( ) ;
327
331
let proto_size = transaction. encoded_len ( ) ;
328
332
let cache_entry =
329
- CacheEntry :: from_transaction ( transaction, StorageFormat :: GzipCompressedProto ) ;
333
+ CacheEntry :: from_transaction ( transaction, StorageFormat :: Lz4CompressedProto ) ;
330
334
let compressed_size = cache_entry. size ( ) ;
331
335
assert ! ( compressed_size != proto_size) ;
332
336
let deserialized_transaction = cache_entry. into_transaction ( ) ;
@@ -379,7 +383,7 @@ mod tests {
379
383
}
380
384
381
385
#[ test]
382
- fn test_file_entry_builder_gzip_compressed_proto ( ) {
386
+ fn test_file_entry_builder_lz4_compressed_proto ( ) {
383
387
let transactions = ( 1000 ..2000 )
384
388
. map ( |version| Transaction {
385
389
version,
@@ -393,7 +397,7 @@ mod tests {
393
397
} ;
394
398
let transactions_in_storage_size = transactions_in_storage. encoded_len ( ) ;
395
399
let file_entry =
396
- FileEntry :: from_transactions ( transactions. clone ( ) , StorageFormat :: GzipCompressedProto ) ;
400
+ FileEntry :: from_transactions ( transactions. clone ( ) , StorageFormat :: Lz4CompressedProto ) ;
397
401
assert_ne ! ( file_entry. size( ) , transactions_in_storage_size) ;
398
402
let deserialized_transactions = file_entry. into_transactions_in_storage ( ) ;
399
403
for ( i, transaction) in transactions. iter ( ) . enumerate ( ) {
@@ -402,10 +406,10 @@ mod tests {
402
406
}
403
407
404
408
#[ test]
405
- fn test_cache_entry_key_to_string_gzip_compressed_proto ( ) {
409
+ fn test_cache_entry_key_to_string_lz4_compressed_proto ( ) {
406
410
assert_eq ! (
407
- CacheEntry :: build_key( 42 , StorageFormat :: GzipCompressedProto ) ,
408
- "gz :42"
411
+ CacheEntry :: build_key( 42 , StorageFormat :: Lz4CompressedProto ) ,
412
+ "l4 :42"
409
413
) ;
410
414
}
411
415
@@ -424,10 +428,10 @@ mod tests {
424
428
}
425
429
426
430
#[ test]
427
- fn test_file_entry_key_to_string_gzip_compressed_proto ( ) {
431
+ fn test_file_entry_key_to_string_lz4_compressed_proto ( ) {
428
432
assert_eq ! (
429
- FileEntry :: build_key( 42 , StorageFormat :: GzipCompressedProto ) ,
430
- "compressed_files/gzip /3d1bff1ba654ca5fdb6ac1370533d876_0.bin"
433
+ FileEntry :: build_key( 42 , StorageFormat :: Lz4CompressedProto ) ,
434
+ "compressed_files/lz4 /3d1bff1ba654ca5fdb6ac1370533d876_0.bin"
431
435
) ;
432
436
}
433
437
@@ -470,15 +474,15 @@ mod tests {
470
474
"chain_id": 1,
471
475
"file_folder_size": 1000,
472
476
"version": 1,
473
- "storage_format": "GzipCompressedProto "
477
+ "storage_format": "Lz4CompressedProto "
474
478
}"# ;
475
479
476
480
let file_metadata: FileStoreMetadata = serde_json:: from_str ( file_metadata_serialized_json)
477
481
. expect ( "FileStoreMetadata deserialization failed." ) ;
478
482
479
483
assert_eq ! (
480
484
file_metadata. storage_format,
481
- StorageFormat :: GzipCompressedProto
485
+ StorageFormat :: Lz4CompressedProto
482
486
) ;
483
487
assert_eq ! ( file_metadata. chain_id, 1 ) ;
484
488
assert_eq ! ( file_metadata. file_folder_size, 1000 ) ;
0 commit comments