feat(cli): move gzip result classification to Rust

The gzip codec loop already returns distinct status values, but the C
wrapper still owned the status branch that selected the CLI failure path.
That kept a format-result policy in the implementation-bearing C file even
though the loop itself is Rust. Add a Rust diagnostic mapping for success,
initialization, deflate, finish, end, invalid projection, and unknown
statuses. C now branches on the Rust classification while retaining zlib
result values, EXM_THROW codes, and exact diagnostic strings. This keeps the
ABI and observable behavior unchanged and leaves unrelated source-exclusion
and zstd classification seams untouched.

Test Plan:
- Nightly rustfmt check on fileio_asyncio.rs -- passed.
- Targeted git diff checks -- passed.
- Capped GCC syntax-only compile of fileio.c with codec defines -- passed.
- Focused Rust mapping tests were added; Cargo/tests were not run per the
  task's OOM constraint.
This commit is contained in:
2026-07-20 16:47:05 +02:00
parent e79a086d7b
commit 211659131d
2 changed files with 78 additions and 7 deletions
+22 -7
View File
@@ -1386,6 +1386,17 @@ enum {
FIO_RUST_GZIP_INVALID_PROJECTION = 5
};
enum {
FIO_RUST_GZIP_DIAGNOSTIC_OK = 0,
FIO_RUST_GZIP_DIAGNOSTIC_INIT_ERROR = 1,
FIO_RUST_GZIP_DIAGNOSTIC_DEFLATE_ERROR = 2,
FIO_RUST_GZIP_DIAGNOSTIC_FINISH_ERROR = 3,
FIO_RUST_GZIP_DIAGNOSTIC_END_ERROR = 4,
FIO_RUST_GZIP_DIAGNOSTIC_INVALID_PROJECTION = 5,
FIO_RUST_GZIP_DIAGNOSTIC_UNKNOWN = 6
};
int FIO_rust_gzipCompressionDiagnostic(int status);
typedef void (*FIO_rust_gzip_read_fill_fn)(
void* opaque, size_t requested, const unsigned char** buffer, size_t* loaded);
typedef void (*FIO_rust_gzip_read_consume_fn)(void* opaque, size_t consumed);
@@ -2844,6 +2855,7 @@ FIO_rust_compressGzipCallback(void* ress, const char* srcFileName,
U64 compressedSize = 0;
int zlibResult = Z_OK;
int status;
int diagnostic;
memset(&projection, 0, sizeof(projection));
projection.readOpaque = (void*)ressPtr->readCtx;
@@ -2864,19 +2876,22 @@ FIO_rust_compressGzipCallback(void* ress, const char* srcFileName,
status = FIO_rust_compressGzipFrame(
&projection, srcFileName, srcFileSize, compressionLevel,
readsize, &compressedSize, &zlibResult);
switch (status) {
case FIO_RUST_GZIP_OK:
diagnostic = FIO_rust_gzipCompressionDiagnostic(status);
switch (diagnostic) {
case FIO_RUST_GZIP_DIAGNOSTIC_OK:
return compressedSize;
case FIO_RUST_GZIP_INIT_ERROR:
case FIO_RUST_GZIP_DIAGNOSTIC_INIT_ERROR:
EXM_THROW(71, "zstd: %s: deflateInit2 error %d \n", srcFileName, zlibResult);
case FIO_RUST_GZIP_DEFLATE_ERROR:
case FIO_RUST_GZIP_DIAGNOSTIC_DEFLATE_ERROR:
EXM_THROW(72, "zstd: %s: deflate error %d \n", srcFileName, zlibResult);
case FIO_RUST_GZIP_FINISH_ERROR:
case FIO_RUST_GZIP_DIAGNOSTIC_FINISH_ERROR:
EXM_THROW(77, "zstd: %s: deflate error %d \n", srcFileName, zlibResult);
case FIO_RUST_GZIP_END_ERROR:
case FIO_RUST_GZIP_DIAGNOSTIC_END_ERROR:
EXM_THROW(79, "zstd: %s: deflateEnd error %d \n", srcFileName, zlibResult);
case FIO_RUST_GZIP_DIAGNOSTIC_INVALID_PROJECTION:
EXM_THROW(72, "zstd: %s: deflate error %d \n", srcFileName, zlibResult);
default:
assert(status == FIO_RUST_GZIP_INVALID_PROJECTION);
assert(diagnostic == FIO_RUST_GZIP_DIAGNOSTIC_UNKNOWN);
EXM_THROW(72, "zstd: %s: deflate error %d \n", srcFileName, zlibResult);
}
}