Files
rustfs/crates/rio

RustFS

RustFS Rio - High-Performance I/O

High-performance asynchronous I/O operations for RustFS distributed object storage

CI 📖 Documentation · 🐛 Bug Reports · 💬 Discussions


📖 Overview

RustFS Rio provides high-performance asynchronous I/O operations for the RustFS distributed object storage system. It implements efficient data streaming, encryption, compression, and integrity checking with zero-copy operations and optimized buffering strategies.

Note: This is a performance-critical submodule of RustFS that provides essential I/O capabilities for the distributed object storage system. For the complete RustFS experience, please visit the main RustFS repository.

Features

🚀 High-Performance I/O

  • Zero-Copy Operations: Efficient data movement without unnecessary copying
  • Async Streaming: Non-blocking streaming I/O with backpressure handling
  • Vectored I/O: Scatter-gather operations for improved throughput
  • Buffer Management: Intelligent buffer pooling and reuse

🔐 Cryptographic Operations

  • AES-GCM Encryption: Hardware-accelerated encryption/decryption
  • Streaming Encryption: Encrypt data on-the-fly without buffering
  • Key Management: Secure key derivation and rotation
  • Digital Signatures: Data integrity verification

📦 Compression Support

  • Multi-Algorithm: Support for various compression algorithms
  • Streaming Compression: Real-time compression during transfer
  • Adaptive Compression: Dynamic algorithm selection based on data
  • Compression Levels: Configurable compression vs. speed tradeoffs

🔧 Data Integrity

  • CRC32 Checksums: Fast integrity checking
  • MD5 Hashing: Legacy compatibility and verification
  • Merkle Trees: Hierarchical integrity verification
  • Error Correction: Automatic error detection and correction

📦 Installation

Add this to your Cargo.toml:

[dependencies]
rustfs-rio = "0.1.0"

🔧 Usage

Basic Streaming I/O

use rustfs_rio::{StreamReader, StreamWriter, BufferPool};
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create buffer pool for efficient memory management
    let buffer_pool = BufferPool::new(64 * 1024, 100); // 64KB buffers, 100 in pool

    // Create streaming reader
    let mut reader = StreamReader::new(input_source, buffer_pool.clone());

    // Create streaming writer
    let mut writer = StreamWriter::new(output_destination, buffer_pool.clone());

    // High-performance streaming copy
    let mut buffer = vec![0u8; 8192];
    loop {
        let n = reader.read(&mut buffer).await?;
        if n == 0 {
            break;
        }
        writer.write_all(&buffer[..n]).await?;
    }

    writer.flush().await?;
    Ok(())
}

Encrypted Streaming

use rustfs_rio::{EncryptedWriter, EncryptedReader, EncryptionKey};
use aes_gcm::{Aes256Gcm, Key, Nonce};

async fn encrypted_streaming_example() -> Result<(), Box<dyn std::error::Error>> {
    // Generate encryption key
    let key = EncryptionKey::generate()?;

    // Create encrypted writer
    let mut encrypted_writer = EncryptedWriter::new(
        output_stream,
        key.clone(),
        Aes256Gcm::new(&key.into())
    )?;

    // Write encrypted data
    encrypted_writer.write_all(b"Hello, encrypted world!").await?;
    encrypted_writer.finalize().await?;

    // Create encrypted reader
    let mut encrypted_reader = EncryptedReader::new(
        input_stream,
        key.clone(),
        Aes256Gcm::new(&key.into())
    )?;

    // Read decrypted data
    let mut decrypted_data = Vec::new();
    encrypted_reader.read_to_end(&mut decrypted_data).await?;

    println!("Decrypted: {}", String::from_utf8(decrypted_data)?);
    Ok(())
}

Compressed Streaming

use rustfs_rio::{CompressedWriter, CompressedReader, CompressionAlgorithm};

async fn compressed_streaming_example() -> Result<(), Box<dyn std::error::Error>> {
    // Create compressed writer
    let mut compressed_writer = CompressedWriter::new(
        output_stream,
        CompressionAlgorithm::Zstd,
        6 // compression level
    )?;

    // Write compressed data
    compressed_writer.write_all(b"This data will be compressed").await?;
    compressed_writer.write_all(b"and streamed efficiently").await?;
    compressed_writer.finish().await?;

    // Create compressed reader
    let mut compressed_reader = CompressedReader::new(
        input_stream,
        CompressionAlgorithm::Zstd
    )?;

    // Read decompressed data
    let mut decompressed_data = Vec::new();
    compressed_reader.read_to_end(&mut decompressed_data).await?;

    println!("Decompressed: {}", String::from_utf8(decompressed_data)?);
    Ok(())
}

Integrity Checking

use rustfs_rio::{ChecksumWriter, ChecksumReader, ChecksumAlgorithm};

async fn integrity_checking_example() -> Result<(), Box<dyn std::error::Error>> {
    // Create checksum writer
    let mut checksum_writer = ChecksumWriter::new(
        output_stream,
        ChecksumAlgorithm::Crc32
    );

    // Write data with checksum calculation
    checksum_writer.write_all(b"Data with integrity checking").await?;
    let write_checksum = checksum_writer.finalize().await?;

    println!("Write checksum: {:08x}", write_checksum);

    // Create checksum reader
    let mut checksum_reader = ChecksumReader::new(
        input_stream,
        ChecksumAlgorithm::Crc32
    );

    // Read data with checksum verification
    let mut data = Vec::new();
    checksum_reader.read_to_end(&mut data).await?;
    let read_checksum = checksum_reader.checksum();

    println!("Read checksum: {:08x}", read_checksum);

    // Verify integrity
    if write_checksum == read_checksum {
        println!("Data integrity verified!");
    } else {
        println!("Data corruption detected!");
    }

    Ok(())
}

Multi-Layer Streaming

use rustfs_rio::{MultiLayerWriter, MultiLayerReader, Layer};

async fn multi_layer_streaming_example() -> Result<(), Box<dyn std::error::Error>> {
    // Create multi-layer writer (compression + encryption + checksum)
    let mut writer = MultiLayerWriter::new(output_stream)
        .add_layer(Layer::Compression(CompressionAlgorithm::Zstd, 6))
        .add_layer(Layer::Encryption(encryption_key.clone()))
        .add_layer(Layer::Checksum(ChecksumAlgorithm::Crc32))
        .build()?;

    // Write data through all layers
    writer.write_all(b"This data will be compressed, encrypted, and checksummed").await?;
    let final_checksum = writer.finalize().await?;

    // Create multi-layer reader (reverse order)
    let mut reader = MultiLayerReader::new(input_stream)
        .add_layer(Layer::Checksum(ChecksumAlgorithm::Crc32))
        .add_layer(Layer::Decryption(encryption_key.clone()))
        .add_layer(Layer::Decompression(CompressionAlgorithm::Zstd))
        .build()?;

    // Read data through all layers
    let mut data = Vec::new();
    reader.read_to_end(&mut data).await?;

    // Verify final checksum
    if reader.verify_checksum(final_checksum)? {
        println!("All layers verified successfully!");
    }

    Ok(())
}

Vectored I/O Operations

use rustfs_rio::{VectoredWriter, VectoredReader, IoVec};

async fn vectored_io_example() -> Result<(), Box<dyn std::error::Error>> {
    // Create vectored writer
    let mut vectored_writer = VectoredWriter::new(output_stream);

    // Prepare multiple buffers
    let header = b"HEADER";
    let data = b"Important data content";
    let footer = b"FOOTER";

    // Write multiple buffers in one operation
    let io_vecs = vec![
        IoVec::new(header),
        IoVec::new(data),
        IoVec::new(footer),
    ];

    let bytes_written = vectored_writer.write_vectored(&io_vecs).await?;
    println!("Wrote {} bytes in vectored operation", bytes_written);

    // Create vectored reader
    let mut vectored_reader = VectoredReader::new(input_stream);

    // Read into multiple buffers
    let mut header_buf = vec![0u8; 6];
    let mut data_buf = vec![0u8; 22];
    let mut footer_buf = vec![0u8; 6];

    let mut read_vecs = vec![
        IoVec::new_mut(&mut header_buf),
        IoVec::new_mut(&mut data_buf),
        IoVec::new_mut(&mut footer_buf),
    ];

    let bytes_read = vectored_reader.read_vectored(&mut read_vecs).await?;
    println!("Read {} bytes in vectored operation", bytes_read);

    Ok(())
}

Async Stream Processing

use rustfs_rio::{AsyncStreamProcessor, ProcessorChain};
use futures::StreamExt;

async fn stream_processing_example() -> Result<(), Box<dyn std::error::Error>> {
    // Create processor chain
    let processor = ProcessorChain::new()
        .add_processor(Box::new(CompressionProcessor::new(CompressionAlgorithm::Zstd)))
        .add_processor(Box::new(EncryptionProcessor::new(encryption_key)))
        .add_processor(Box::new(ChecksumProcessor::new(ChecksumAlgorithm::Crc32)));

    // Create async stream processor
    let mut stream_processor = AsyncStreamProcessor::new(input_stream, processor);

    // Process stream chunks
    while let Some(chunk) = stream_processor.next().await {
        let processed_chunk = chunk?;

        // Handle processed chunk
        output_stream.write_all(&processed_chunk).await?;
    }

    Ok(())
}

🏗️ Architecture

Rio Architecture

Rio I/O Architecture:
┌─────────────────────────────────────────────────────────────┐
│                    Stream API Layer                         │
├─────────────────────────────────────────────────────────────┤
│ Encryption  │ Compression │ Checksum    │ Vectored I/O     │
├─────────────────────────────────────────────────────────────┤
│              Buffer Management                               │
├─────────────────────────────────────────────────────────────┤
│   Zero-Copy   │   Async I/O   │   Backpressure Control     │
├─────────────────────────────────────────────────────────────┤
│              Tokio Runtime Integration                       │
└─────────────────────────────────────────────────────────────┘

Performance Features

Feature Benefit Implementation
Zero-Copy Reduced memory usage Direct buffer operations
Async I/O High concurrency Tokio-based operations
Vectored I/O Reduced syscalls Scatter-gather operations
Buffer Pooling Memory efficiency Reusable buffer management

🧪 Testing

Run the test suite:

# Run all tests
cargo test

# Test streaming operations
cargo test streaming

# Test encryption
cargo test encryption

# Test compression
cargo test compression

# Run benchmarks
cargo bench

📋 Requirements

  • Rust: 1.70.0 or later
  • Platforms: Linux, macOS, Windows
  • Dependencies: Tokio async runtime
  • Hardware: AES-NI support recommended for encryption

This module is part of the RustFS ecosystem:

📚 Documentation

For comprehensive documentation, visit:

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

📄 License

Licensed under the Apache License, Version 2.0. See LICENSE for details.


RustFS is a trademark of RustFS, Inc.
All other trademarks are the property of their respective owners.

Made with 🚀 by the RustFS Team