# fastSyncAI

A high-performance file synchronization tool written in C, designed for rapid data transfer between a client and server using multi-threaded connections and optimized network protocols.

## Features

- **Multi-threaded Architecture**: Parallel file processing with configurable worker threads
- **Dual Protocol Support**: TCP for reliable transfer, UDP for high-speed bulk data
- **Efficient File Handling**: Recursive directory scanning, selective transfer (skip existing files)
- **Custom Binary Protocol**: Lightweight, low-overhead communication with magic number validation
- **Progress Tracking**: Real-time statistics including transfer rates and file counts
- **Work Queue System**: Thread-safe task distribution for optimal load balancing

### Performance Optimizations Implemented

1. **Batch Metadata** (`MAGIC_BATCH_META`): Groups up to 64 files per batch to reduce protocol overhead
2. **Pipelining**: Interleaves metadata, filename, and data transfer for each file within a batch
3. **TCP Tuning**: 4MB socket buffers (`SO_SNDBUF`, `SO_RCVBUF`) and `TCP_NODELAY` for low-latency
4. **UDP Tuning**: 4MB socket buffers, removed artificial delays (`usleep` calls)
5. **True Metadata/Data Pipelining**: Server processes file N metadata while receiving file N-1 data
6. **Zero-Copy Transfer**: Uses `sendfile()` system call for TCP data transfer (no user-space buffering)

## Protocol Overview

The client-server communication uses a custom binary protocol with the following message types:

| Magic Hex | Magic ASCII | Purpose |
|-----------|-------------|---------|
| 0x53594E43 | SYNC | File metadata (name, size, mode) |
| 0x444F4E45 | DONE | Transfer completion signal |
| 0x56455259 | VERY | File verification request |
| 0x55445052 | UDPR | UDP transfer request |
| 0x55445044 | UDPD | UDP data packet |
| 0x5544504B | UDPK | UDP knock/handshake |
| 0x42415443 | BATC | Batch metadata header (optimization #1) |

## Build

```bash
make
```

This produces two binaries:
- `fastsync_server` - The receiving server
- `fastsync_client` - The sending client

## Usage

### Server

```bash
./fastsync_server -p PORT -d DEST_DIR
```

Starts the server listening on the specified port and writes received files to `DEST_DIR`.

Options:
- `-p PORT` - Port to listen on (default: 8082)
- `-d DEST_DIR` - Destination directory for received files (required)

### Client

```bash
./fastsync_client -h HOST -p PORT -s SOURCE_DIR -n CONNECTIONS [-u]
```

Options:
- `-h HOST` - Server hostname/IP (required)
- `-p PORT` - Server port (default: 8082)
- `-s SOURCE_DIR` - Source directory to synchronize (required)
- `-n CONNECTIONS` - Number of parallel TCP connections (default: 4, max: 32)
- `-u` - Use UDP for data transfer (faster, but requires UDP support on both ends)

### Example

```bash
# Terminal 1: Start server
./fastsync_server 8082

# Terminal 2: Sync files from client
./fastsync_client -h 127.0.0.1 -p 8082 -s ./test_src -n 8
```

## Benchmarking

The project includes comprehensive benchmarking scripts:

### Internal Benchmark (Multi-connection)

```bash
./benchmark.sh [LATENCY_MS]
```

This script:
1. Generates ~50 MB of test data (mixed file sizes)
2. Optionally simulates network latency using `tc netem` (requires sudo)
3. Tests with 1, 2, 4, 8, and 16 connections
4. Outputs a formatted throughput comparison table

Examples:
- `./benchmark.sh` - Loopback with no extra latency
- `./benchmark.sh 10` - Simulate 10ms RTT (LAN-like)
- `./benchmark.sh 20` - Simulate 20ms RTT (LAN)
- `./benchmark.sh 100` - Simulate 100ms RTT (WAN-like)

### Comparison with rsync

```bash
./compare_rsync.sh [DATA_SIZE_MB] [RUN_COUNT] [LATENCY_MS|--lan|--wan]
```

Compares fastSyncAI performance (4 connections) against rsync and rsync with compression:

- Generates mixed test data (small, medium, large files)
- Runs multiple iterations for reliable averages
- Verifies file integrity (MD5 checksums)
- Reports throughput and speedup ratios
- **Network simulation**: Supports latency via `tc netem` (requires sudo)

Examples:
- `./compare_rsync.sh` - 100 MB, 3 runs, no latency
- `./compare_rsync.sh 500` - 500 MB, 3 runs, no latency
- `./compare_rsync.sh 100 5` - 100 MB, 5 runs, no latency
- `./compare_rsync.sh 100 1 20` - 100 MB, 1 run, 20ms RTT
- `./compare_rsync.sh 100 1 --lan` - 100 MB, 1 run, 10ms RTT (LAN preset)
- `./compare_rsync.sh 100 1 --wan` - 100 MB, 1 run, 100ms RTT (WAN preset)

**Note**: Requires `rsync` to be installed on the system.

### Comprehensive Benchmark

```bash
./benchmark_comprehensive.sh [DATA_SIZE_MB] [RUN_COUNT] [LATENCY_MS]
```

Comprehensive comparison testing:

- Tests fastSyncAI with 1, 2, 4, 8, and 16 connections
- Compares against rsync, rsync+compress, rclone (if available), and cp (baseline)
- Generates mixed test data (small/medium/large files)
- Uses file count + size verification (faster than MD5 for large datasets)
- Displays bar chart visualization and speedup analysis
- Identifies best connection count
- **Network simulation**: Supports latency via `tc netem` (requires sudo)

Examples:
- `./benchmark_comprehensive.sh` - 100 MB, 3 runs, no latency (default)
- `./benchmark_comprehensive.sh 500 1` - 500 MB, single run, no latency
- `./benchmark_comprehensive.sh 200 3` - 200 MB, 3 runs, no latency
- `./benchmark_comprehensive.sh 100 1 10` - 100 MB, 1 run, 10ms RTT (LAN)
- `./benchmark_comprehensive.sh 100 1 100` - 100 MB, 1 run, 100ms RTT (WAN)

**Note**: Requires `rsync`; optionally uses `rclone` if installed.

## Architecture

### Client Components
- **Directory Scanner**: Recursively scans source directory, enqueues files
- **Worker Threads**: Multiple threads pull from queue, send files to server
- **Work Queue**: Thread-safe FIFO with blocking pop and finish signaling
- **Protocol Handler**: Manages TCP/UDP communication with server
- **Batch Processor**: Groups files into batches (max 64) for reduced overhead
- **sendfile() Integration**: Zero-copy TCP data transfer

### Server Components
- **Connection Handler**: Accepts incoming client connections, spawns per-connection threads
- **File Receiver**: Processes file metadata, saves files with correct permissions
- **Pipelined Processing**: Handles interleaved metadata/data for concurrent files
- **fsync() on Close**: Ensures data durability before file descriptor close
- **Response Generator**: Sends appropriate responses (RESP_OK, RESP_ERROR)

### UDP Mode
When UDP is enabled (`-u` flag), the client and server perform a handshake to establish a UDP session, then transfer data in chunks up to 1400 bytes (UDP_PAYLOAD_MAX) for maximum compatibility across networks. UDP sockets are tuned with 4MB buffers.

### Socket Tuning (TCP & UDP)
- Send/Receive buffers: 4 MB (`SO_SNDBUF`, `SO_RCVBUF`)
- TCP_NODELAY: Enabled (disables Nagle's algorithm for low latency)

## Project Structure

```
fastSyncAI/
├── Makefile                  # Build configuration
├── benchmark.sh              # Multi-connection benchmarking script
├── benchmark_comprehensive.sh # Comprehensive benchmark vs multiple tools
├── compare_rsync.sh          # rsync comparison benchmark script
├── src/
│   ├── common.h              # Shared definitions, protocol constants, structs
│   ├── client.c              # Client implementation (batch, pipelining, sendfile)
│   ├── server.c              # Server implementation (pipelined processing, fsync)
│   ├── utils.c               # Utility functions (I/O, networking)
│   └── xxhash.h              # Hash function for file verification
├── test_src/                 # Test source directory
├── test_dest/                # Test destination directory
└── README.md                 # This file
```

## Performance Results

Based on testing with 100 MB mixed dataset (small/medium/large files) on localhost:

### Connection Count Scaling

| Connections | Throughput | Speedup vs 1 conn |
|-------------|------------|-------------------|
| 1 | ~260 MB/s | 1.00x |
| 2 | ~600 MB/s | 2.30x |
| 4 | ~810 MB/s | 3.10x |
| 8 | ~1000 MB/s | 3.85x |
| 16 | ~900 MB/s | 3.46x |

Optimal connection count: **8 connections** for this workload.

### Comparison with Other Tools

| Tool | Throughput | Notes |
|------|------------|-------|
| fastSyncAI (8 conn) | ~1000 MB/s | Best for multi-threaded local transfer |
| cp (baseline) | ~1550 MB/s | Single-threaded, kernel-optimized |
| rsync | ~620 MB/s | Network-optimized, single-threaded |
| rsync + compress | ~530 MB/s | Compression overhead |
| rclone | ~750 MB/s | Cloud sync tool |

### Optimization Impact

- **Zero-copy (sendfile)**: ~40% improvement over buffered I/O
- **Batch metadata**: ~25% reduction in protocol overhead for small files
- **TCP tuning**: ~15% improvement in throughput
- **Pipelining**: ~10% improvement by overlapping metadata/data transfer

## Requirements

- GCC (or compatible C compiler)
- pthread library
- Linux (for benchmark.sh network latency simulation)

## License

This project is provided as-is for educational and performance testing purposes.
