feat(programs): move pass-through copying into Rust
Keep decompression resource ownership and file orchestration in C while the Rust AIO module handles the pass-through byte-copy leaf through a two-pool ABI. The Rust implementation derives the block limit from the actual read and write job buffers, preventing a write-job overrun when their configured sizes differ. It preserves the existing enqueue/reacquire, consume/refill, EOF, release, and sparse-write ordering, with pool-backed coverage for synchronous and threaded operation. Test Plan: - `cargo test --manifest-path rust/Cargo.toml --no-default-features --features compression --lib fileio_asyncio` -- passed, 9 tests. - Required clippy/fmt sequence against `rust/Cargo.toml` with compression -- passed before and after nightly fmt. - `cargo test --manifest-path rust/Cargo.toml --no-default-features --features compression --lib` -- passed, 342 tests. - `make -C programs -j2 zstd` -- passed. - Manual 200 KiB and empty-input `programs/zstd -dc --pass-through` comparisons -- passed.
This commit is contained in:
+2
-18
@@ -343,6 +343,7 @@ int FIO_rust_setDictBufferMalloc(const char* fileName,
|
||||
void** buffer,
|
||||
size_t* loadedSize);
|
||||
int FIO_rust_removeFile(const char* path);
|
||||
int FIO_rust_passThrough(ReadPoolCtx_t* readCtx, WritePoolCtx_t* writeCtx);
|
||||
#ifdef ZSTD_LZ4COMPRESS
|
||||
int FIO_rust_LZ4_GetBlockSize_FromBlockId(int id);
|
||||
#endif
|
||||
@@ -2123,24 +2124,7 @@ static void FIO_freeDResources(dRess_t ress)
|
||||
* @return : 0 (no error) */
|
||||
static int FIO_passThrough(dRess_t *ress)
|
||||
{
|
||||
size_t const blockSize = MIN(MIN(64 KB, ZSTD_DStreamInSize()), ZSTD_DStreamOutSize());
|
||||
IOJob_t *writeJob = AIO_WritePool_acquireJob(ress->writeCtx);
|
||||
AIO_ReadPool_fillBuffer(ress->readCtx, blockSize);
|
||||
|
||||
while(ress->readCtx->srcBufferLoaded) {
|
||||
size_t writeSize;
|
||||
writeSize = MIN(blockSize, ress->readCtx->srcBufferLoaded);
|
||||
assert(writeSize <= writeJob->bufferSize);
|
||||
memcpy(writeJob->buffer, ress->readCtx->srcBuffer, writeSize);
|
||||
writeJob->usedBufferSize = writeSize;
|
||||
AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob);
|
||||
AIO_ReadPool_consumeBytes(ress->readCtx, writeSize);
|
||||
AIO_ReadPool_fillBuffer(ress->readCtx, blockSize);
|
||||
}
|
||||
assert(ress->readCtx->reachedEof);
|
||||
AIO_WritePool_releaseIoJob(writeJob);
|
||||
AIO_WritePool_sparseWriteEnd(ress->writeCtx);
|
||||
return 0;
|
||||
return FIO_rust_passThrough(ress->readCtx, ress->writeCtx);
|
||||
}
|
||||
|
||||
/* FIO_zstdErrorHelp() :
|
||||
|
||||
Reference in New Issue
Block a user