feat(cli): move decompression result policy into Rust
Move mixed-format decompression status mapping and successful-file finalization into Rust. C keeps the diagnostic and private FIO context callbacks, while Rust decides pass-through/error behavior and invokes final accounting only for a successful decoded file. Test Plan: - cargo test --manifest-path rust/Cargo.toml --all-targets -- --test-threads=1 - cargo test --manifest-path rust/cli/Cargo.toml --all-targets -- --test-threads=1 - cargo clippy --manifest-path rust/Cargo.toml --tests -- -D warnings - make -B -C programs -j2 zstd - make -B -C tests -j2 test-cli-tests
This commit is contained in:
+57
-40
@@ -441,6 +441,12 @@ typedef int (*FIO_rust_decompress_frame_fn)(void* opaque,
|
||||
size_t* errorCode,
|
||||
int mode);
|
||||
typedef int (*FIO_rust_pass_through_fn)(void* opaque);
|
||||
typedef void (*FIO_rust_decompress_status_fn)(void* opaque,
|
||||
int status,
|
||||
const char* srcFileName);
|
||||
typedef void (*FIO_rust_decompress_finish_fn)(void* opaque,
|
||||
const char* srcFileName,
|
||||
U64 decodedSize);
|
||||
typedef struct {
|
||||
void* opaque;
|
||||
FIO_rust_decompress_frame_fn decode_zstd;
|
||||
@@ -448,12 +454,18 @@ typedef struct {
|
||||
FIO_rust_decompress_frame_fn decode_lzma;
|
||||
FIO_rust_decompress_frame_fn decode_lz4;
|
||||
FIO_rust_pass_through_fn pass_through;
|
||||
FIO_rust_decompress_status_fn report_status;
|
||||
FIO_rust_decompress_finish_fn finish;
|
||||
} FIO_rust_decompress_callbacks_t;
|
||||
int FIO_rust_decompressFrames(ReadPoolCtx_t* readCtx,
|
||||
const char* srcFileName,
|
||||
int passThrough,
|
||||
U64* decodedSize,
|
||||
const FIO_rust_decompress_callbacks_t* callbacks);
|
||||
int FIO_rust_finishDecompressFrames(int status,
|
||||
const char* srcFileName,
|
||||
U64 decodedSize,
|
||||
const FIO_rust_decompress_callbacks_t* callbacks);
|
||||
void FIO_rust_displayCompressionParameters(const FIO_prefs_t* prefs);
|
||||
#ifdef ZSTD_LZ4COMPRESS
|
||||
int FIO_rust_LZ4_GetBlockSize_FromBlockId(int id);
|
||||
@@ -3105,6 +3117,48 @@ static int FIO_rust_decompressPassThroughCallback(void* opaque)
|
||||
return FIO_passThrough(projection->ress);
|
||||
}
|
||||
|
||||
static void FIO_rust_decompressStatusCallback(void* opaque,
|
||||
int status,
|
||||
const char* srcFileName)
|
||||
{
|
||||
(void)opaque;
|
||||
switch (status) {
|
||||
case FIO_RUST_DECOMPRESS_EMPTY_INPUT:
|
||||
DISPLAYLEVEL(1, "zstd: %s: unexpected end of file \n", srcFileName);
|
||||
break;
|
||||
case FIO_RUST_DECOMPRESS_SHORT_INPUT:
|
||||
DISPLAYLEVEL(1, "zstd: %s: unknown header \n", srcFileName);
|
||||
break;
|
||||
case FIO_RUST_DECOMPRESS_GZIP_UNSUPPORTED:
|
||||
DISPLAYLEVEL(1, "zstd: %s: gzip file cannot be uncompressed (zstd compiled without HAVE_ZLIB) -- ignored \n", srcFileName);
|
||||
break;
|
||||
case FIO_RUST_DECOMPRESS_LZMA_UNSUPPORTED:
|
||||
DISPLAYLEVEL(1, "zstd: %s: xz/lzma file cannot be uncompressed (zstd compiled without HAVE_LZMA) -- ignored \n", srcFileName);
|
||||
break;
|
||||
case FIO_RUST_DECOMPRESS_LZ4_UNSUPPORTED:
|
||||
DISPLAYLEVEL(1, "zstd: %s: lz4 file cannot be uncompressed (zstd compiled without HAVE_LZ4) -- ignored \n", srcFileName);
|
||||
break;
|
||||
case FIO_RUST_DECOMPRESS_UNSUPPORTED_FORMAT:
|
||||
DISPLAYLEVEL(1, "zstd: %s: unsupported format \n", srcFileName);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void FIO_rust_decompressFinalCallback(void* opaque,
|
||||
const char* srcFileName,
|
||||
U64 decodedSize)
|
||||
{
|
||||
FIO_rust_decompression_projection_t* const projection =
|
||||
(FIO_rust_decompression_projection_t*)opaque;
|
||||
projection->fCtx->totalBytesOutput += (size_t)decodedSize;
|
||||
DISPLAY_PROGRESS("\r%79s\r", "");
|
||||
if (FIO_shouldDisplayFileSummary(projection->fCtx))
|
||||
DISPLAY_SUMMARY("%-20s: %llu bytes \n", srcFileName,
|
||||
(unsigned long long)decodedSize);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** FIO_decompressFrames() :
|
||||
@@ -3148,49 +3202,12 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx,
|
||||
callbacks.decode_lz4 = FIO_rust_decompressLz4FrameCallback;
|
||||
#endif
|
||||
callbacks.pass_through = FIO_rust_decompressPassThroughCallback;
|
||||
callbacks.report_status = FIO_rust_decompressStatusCallback;
|
||||
callbacks.finish = FIO_rust_decompressFinalCallback;
|
||||
|
||||
status = FIO_rust_decompressFrames(ress.readCtx, srcFileName, passThrough,
|
||||
&filesize, &callbacks);
|
||||
switch (status) {
|
||||
case FIO_RUST_DECOMPRESS_OK:
|
||||
break;
|
||||
case FIO_RUST_DECOMPRESS_PASS_THROUGH:
|
||||
return 0;
|
||||
case FIO_RUST_DECOMPRESS_EMPTY_INPUT:
|
||||
DISPLAYLEVEL(1, "zstd: %s: unexpected end of file \n", srcFileName);
|
||||
return 1;
|
||||
case FIO_RUST_DECOMPRESS_SHORT_INPUT:
|
||||
DISPLAYLEVEL(1, "zstd: %s: unknown header \n", srcFileName);
|
||||
return 1;
|
||||
case FIO_RUST_DECOMPRESS_GZIP_UNSUPPORTED:
|
||||
DISPLAYLEVEL(1, "zstd: %s: gzip file cannot be uncompressed (zstd compiled without HAVE_ZLIB) -- ignored \n", srcFileName);
|
||||
return 1;
|
||||
case FIO_RUST_DECOMPRESS_LZMA_UNSUPPORTED:
|
||||
DISPLAYLEVEL(1, "zstd: %s: xz/lzma file cannot be uncompressed (zstd compiled without HAVE_LZMA) -- ignored \n", srcFileName);
|
||||
return 1;
|
||||
case FIO_RUST_DECOMPRESS_LZ4_UNSUPPORTED:
|
||||
DISPLAYLEVEL(1, "zstd: %s: lz4 file cannot be uncompressed (zstd compiled without HAVE_LZ4) -- ignored \n", srcFileName);
|
||||
return 1;
|
||||
case FIO_RUST_DECOMPRESS_UNSUPPORTED_FORMAT:
|
||||
DISPLAYLEVEL(1, "zstd: %s: unsupported format \n", srcFileName);
|
||||
return 1;
|
||||
case FIO_RUST_DECOMPRESS_FRAME_ERROR:
|
||||
case FIO_RUST_DECOMPRESS_PASS_THROUGH_ERROR:
|
||||
case FIO_RUST_DECOMPRESS_ZSTD_UNSUPPORTED:
|
||||
return 1;
|
||||
default:
|
||||
assert(0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Final Status */
|
||||
fCtx->totalBytesOutput += (size_t)filesize;
|
||||
DISPLAY_PROGRESS("\r%79s\r", "");
|
||||
if (FIO_shouldDisplayFileSummary(fCtx))
|
||||
DISPLAY_SUMMARY("%-20s: %llu bytes \n", srcFileName,
|
||||
(unsigned long long)filesize);
|
||||
|
||||
return 0;
|
||||
return FIO_rust_finishDecompressFrames(status, srcFileName, filesize, &callbacks);
|
||||
}
|
||||
|
||||
/** FIO_decompressDstFile() :
|
||||
|
||||
Reference in New Issue
Block a user