refactor(fileio): move separate-output routing policy to Rust
Move the separate-destination mode decision into the Rust file-iteration boundary. The projection now carries the mirror-mode bit and one callback for each destination policy, so Rust selects the callback once before preserving the existing non-short-circuiting iteration and aggregate error behavior. Keep path construction, mirror-directory diagnostics, resource ownership, and the per-file compression leaf in the opaque C callbacks. Add C/Rust layout assertions and focused tests proving mirror/flat routing and ordered error aggregation. Test Plan: - `ulimit -v 41943040; cargo +nightly fmt --manifest-path rust/Cargo.toml --all -- --check` - `ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo clippy --manifest-path rust/Cargo.toml --all-targets -- -D warnings` - `ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/Cargo.toml --all-targets` (793 tests) - `ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo clippy --manifest-path rust/cli/Cargo.toml --all-targets -- -D warnings` - `ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/cli/Cargo.toml --all-targets` (184 tests) - `ulimit -v 41943040; make -j1` - `ulimit -v 41943040; make -j1 -C tests test`
This commit is contained in:
+44
-24
@@ -1166,11 +1166,15 @@ int FIO_rust_compressMultipleFilenames(
|
||||
|
||||
typedef int (*FIO_rust_compress_multiple_separate_file_fn)(
|
||||
void* opaque, const char* srcFileName);
|
||||
/* Rust selects the destination-mode callback; both callbacks retain their
|
||||
* private resources, path construction, diagnostics, and compression leaf. */
|
||||
typedef struct {
|
||||
void* fCtx;
|
||||
const char** inFileNamesTable;
|
||||
void* opaque;
|
||||
FIO_rust_compress_multiple_separate_file_fn compressFile;
|
||||
int mirrorOutput;
|
||||
FIO_rust_compress_multiple_separate_file_fn compressMirroredFile;
|
||||
FIO_rust_compress_multiple_separate_file_fn compressFlatFile;
|
||||
} FIO_rust_compress_multiple_separate_projection_t;
|
||||
typedef char FIO_rust_compress_multiple_separate_fctx_offset[
|
||||
(offsetof(FIO_rust_compress_multiple_separate_projection_t, fCtx) == 0) ? 1 : -1];
|
||||
@@ -1180,12 +1184,22 @@ typedef char FIO_rust_compress_multiple_separate_input_names_offset[
|
||||
typedef char FIO_rust_compress_multiple_separate_opaque_offset[
|
||||
(offsetof(FIO_rust_compress_multiple_separate_projection_t, opaque)
|
||||
== 2 * sizeof(void*)) ? 1 : -1];
|
||||
typedef char FIO_rust_compress_multiple_separate_callback_offset[
|
||||
(offsetof(FIO_rust_compress_multiple_separate_projection_t, compressFile)
|
||||
typedef char FIO_rust_compress_multiple_separate_mode_offset[
|
||||
(offsetof(FIO_rust_compress_multiple_separate_projection_t, mirrorOutput)
|
||||
== 3 * sizeof(void*)) ? 1 : -1];
|
||||
typedef char FIO_rust_compress_multiple_separate_mirrored_callback_offset[
|
||||
(offsetof(FIO_rust_compress_multiple_separate_projection_t, compressMirroredFile)
|
||||
== 4 * sizeof(void*)) ? 1 : -1];
|
||||
typedef char FIO_rust_compress_multiple_separate_flat_callback_offset[
|
||||
(offsetof(FIO_rust_compress_multiple_separate_projection_t, compressFlatFile)
|
||||
== 5 * sizeof(void*)) ? 1 : -1];
|
||||
typedef char FIO_rust_compress_multiple_separate_int_size[
|
||||
(sizeof(int) <= sizeof(void*)) ? 1 : -1];
|
||||
typedef char FIO_rust_compress_multiple_separate_callback_size[
|
||||
(sizeof(FIO_rust_compress_multiple_separate_file_fn) == sizeof(void*)) ? 1 : -1];
|
||||
typedef char FIO_rust_compress_multiple_separate_projection_size[
|
||||
(sizeof(FIO_rust_compress_multiple_separate_projection_t)
|
||||
== 3 * sizeof(void*) + sizeof(FIO_rust_compress_multiple_separate_file_fn)) ? 1 : -1];
|
||||
== 6 * sizeof(void*)) ? 1 : -1];
|
||||
int FIO_rust_compressMultipleSeparateFilenames(
|
||||
const FIO_rust_compress_multiple_separate_projection_t* projection);
|
||||
|
||||
@@ -3517,30 +3531,34 @@ typedef struct {
|
||||
int compressionLevel;
|
||||
} FIO_rust_compress_multiple_separate_context_t;
|
||||
|
||||
static int FIO_rust_compressMultipleSeparateFileCallback(void* opaque,
|
||||
const char* srcFileName)
|
||||
static int FIO_rust_compressMultipleSeparateMirroredFileCallback(void* opaque,
|
||||
const char* srcFileName)
|
||||
{
|
||||
FIO_rust_compress_multiple_separate_context_t* const context =
|
||||
(FIO_rust_compress_multiple_separate_context_t*)opaque;
|
||||
const char* dstFileName;
|
||||
|
||||
if (context->outMirroredRootDirName) {
|
||||
char* const validMirroredDirName = UTIL_createMirroredDestDirName(
|
||||
srcFileName, context->outMirroredRootDirName);
|
||||
if (validMirroredDirName) {
|
||||
dstFileName = FIO_determineCompressedName(
|
||||
srcFileName, validMirroredDirName, context->suffix);
|
||||
free(validMirroredDirName);
|
||||
} else {
|
||||
DISPLAYLEVEL(2, "zstd: --output-dir-mirror cannot compress '%s' into '%s' \n",
|
||||
srcFileName, context->outMirroredRootDirName);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
dstFileName = FIO_determineCompressedName(
|
||||
srcFileName, context->outDirName, context->suffix);
|
||||
char* const validMirroredDirName = UTIL_createMirroredDestDirName(
|
||||
srcFileName, context->outMirroredRootDirName);
|
||||
if (validMirroredDirName) {
|
||||
const char* const dstFileName = FIO_determineCompressedName(
|
||||
srcFileName, validMirroredDirName, context->suffix);
|
||||
free(validMirroredDirName);
|
||||
return FIO_compressFilename_srcFile(
|
||||
context->fCtx, context->prefs, *context->ress,
|
||||
dstFileName, srcFileName, context->compressionLevel);
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(2, "zstd: --output-dir-mirror cannot compress '%s' into '%s' \n",
|
||||
srcFileName, context->outMirroredRootDirName);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int FIO_rust_compressMultipleSeparateFlatFileCallback(void* opaque,
|
||||
const char* srcFileName)
|
||||
{
|
||||
FIO_rust_compress_multiple_separate_context_t* const context =
|
||||
(FIO_rust_compress_multiple_separate_context_t*)opaque;
|
||||
const char* const dstFileName = FIO_determineCompressedName(
|
||||
srcFileName, context->outDirName, context->suffix);
|
||||
return FIO_compressFilename_srcFile(
|
||||
context->fCtx, context->prefs, *context->ress,
|
||||
dstFileName, srcFileName, context->compressionLevel);
|
||||
@@ -3598,7 +3616,9 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx,
|
||||
};
|
||||
FIO_rust_compress_multiple_separate_projection_t projection = {
|
||||
fCtx, inFileNamesTable, &callbackContext,
|
||||
FIO_rust_compressMultipleSeparateFileCallback
|
||||
outMirroredRootDirName != NULL,
|
||||
FIO_rust_compressMultipleSeparateMirroredFileCallback,
|
||||
FIO_rust_compressMultipleSeparateFlatFileCallback
|
||||
};
|
||||
if (outMirroredRootDirName)
|
||||
UTIL_mirrorSourceFilesDirectories(inFileNamesTable, (unsigned)fCtx->nbFilesTotal, outMirroredRootDirName);
|
||||
|
||||
Reference in New Issue
Block a user