Contributing to ApexStore
First off, thank you for considering contributing to ApexStore! ๐
This document provides guidelines and instructions for contributing to the project. Following these guidelines helps maintain code quality and makes the review process smoother.
๐ Table of Contents
- Code of Conduct
- Getting Started
- Development Workflow
- Coding Standards
- Testing Guidelines
- Commit Messages
- Pull Request Process
- Project Structure
- Areas for Contribution
๐ค Code of Conduct
Our Pledge
We are committed to providing a welcoming and inspiring community for all. We pledge to:
- Be respectful and inclusive
- Accept constructive criticism gracefully
- Focus on what is best for the community
- Show empathy towards other community members
Expected Behavior
- Use welcoming and inclusive language
- Be respectful of differing viewpoints and experiences
- Gracefully accept constructive criticism
- Focus on what is best for the community
Unacceptable Behavior
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information without explicit permission
- Other conduct which could reasonably be considered inappropriate
๐ Getting Started
Prerequisites
-
Rust Toolchain (1.70 or later)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -
Git
# Ubuntu/Debian sudo apt-get install git # macOS brew install git -
Code Editor (Recommended: VS Code with rust-analyzer)
- Install VS Code
- Install rust-analyzer extension
Initial Setup
-
Fork the Repository
- Visit https://github.com/ElioNeto/ApexStore
- Click the "Fork" button in the top-right corner
-
Clone Your Fork
git clone https://github.com/YOUR_USERNAME/ApexStore.git cd ApexStore -
Add Upstream Remote
git remote add upstream https://github.com/ElioNeto/ApexStore.git -
Install Dependencies
cargo build -
Run Tests
cargo test
For detailed setup instructions, see SETUP.md.
๐ Development Workflow
Automated Workflow Overview
ApexStore uses GitHub Actions to automate the development workflow:
- Feature/Fix branches โ Auto-create PR to
develop+ run tests - Develop โ Auto-create release PR to
main - Main โ Create release tag + close related issues
See WORKFLOWS.md for complete documentation.
1. Create a Feature Branch
# Update your fork
git checkout main
git pull upstream main
# Create a new branch from main
git checkout -b feature/your-feature-name
Branch Naming Conventions:
feature/- New features (e.g.,feature/compaction-strategy)fix/- Bug fixes (e.g.,fix/wal-corruption)docs/- Documentation changes (e.g.,docs/api-guide)refactor/- Code refactoring (e.g.,refactor/codec-interface)test/- Test additions/improvements (e.g.,test/integration-suite)perf/- Performance improvements (e.g.,perf/bloom-filter-optimization)
2. Make Your Changes
# Make changes to the code
vim src/core/engine.rs
# Test your changes
cargo test --all-features
# Format code
cargo fmt
# Check for issues
cargo clippy --all-features -- -D warnings
3. Commit Your Changes
git add .
git commit -m "feat: add compaction strategy interface (#55)"
Important: Reference issues in commit messages using #issue_number for automatic tracking.
See Commit Messages for formatting guidelines.
4. Push to Your Fork
git push origin feature/your-feature-name
What Happens Next:
- โ GitHub Actions automatically runs tests
- โ
Auto-creates PR to
developbranch - โ Adds comment to referenced issues (if any)
- โ Runs Clippy and format checks
5. Pull Request Review
Once the automated PR is created:
- Review the PR description
- Wait for CI checks to pass
- Address any reviewer feedback
- PR will be merged to
developonce approved
Note: You don't need to manually create PRs - the workflow handles this automatically!
๐ Coding Standards
Rust Style Guide
We follow the Rust API Guidelines and Rust Style Guide.
Key Principles:
-
Use
cargo fmt- All code must be formattedcargo fmt --all -
Pass
cargo clippy- Zero warnings policycargo clippy --all-features -- -D warnings -
Write Documentation - Public APIs must have doc comments
#![allow(unused)] fn main() { /// Retrieves a value from the store by key. /// /// # Arguments /// /// * `key` - The key to look up /// /// # Returns /// /// * `Ok(Some(value))` - Key found /// * `Ok(None)` - Key not found /// * `Err(e)` - Error occurred /// /// # Example /// /// ``` /// let value = engine.get(b"user:123")?; /// ``` pub fn get(&self, key: &[u8]) -> Result<Option<String>> { // Implementation } }
SOLID Principles
This project follows SOLID principles:
- Single Responsibility: Each module/struct has one clear purpose
- Open/Closed: Extend behavior through traits, not modification
- Liskov Substitution: Implementations must be interchangeable
- Interface Segregation: Small, focused traits
- Dependency Inversion: Depend on abstractions, not concretions
Example:
#![allow(unused)] fn main() { // โ Good - depends on trait pub struct LsmEngine<W: WriteAheadLog> { wal: W, } // โ Bad - depends on concrete type pub struct LsmEngine { wal: FileBasedWal, } }
Error Handling
-
Use
Result<T, LsmError>for fallible operations#![allow(unused)] fn main() { pub fn put(&mut self, key: &[u8], value: &str) -> Result<()> { self.wal.append(key, value)?; self.memtable.insert(key, value); Ok(()) } } -
Provide Context with error types
#![allow(unused)] fn main() { use thiserror::Error; #[derive(Error, Debug)] pub enum LsmError { #[error("WAL corruption at offset {0}")] WalCorruption(u64), #[error("Key too large: {size} bytes (max: {max})")] KeyTooLarge { size: usize, max: usize }, } } -
Don't Panic in library code (use
Resultinstead)
Performance Considerations
-
Minimize Allocations
#![allow(unused)] fn main() { // โ Good - reuse buffer let mut buffer = Vec::with_capacity(1024); for item in items { buffer.clear(); serialize_into(&mut buffer, item)?; } // โ Bad - allocate each iteration for item in items { let buffer = serialize(item)?; } } -
Use Appropriate Data Structures
BTreeMapfor sorted dataHashMapfor fast lookupsVecfor sequential access
-
Benchmark Changes
cargo bench
๐งช Testing Guidelines
Test Types
-
Unit Tests - Test individual functions/modules
#![allow(unused)] fn main() { #[cfg(test)] mod tests { use super::*; #[test] fn test_memtable_insert() { let mut memtable = MemTable::new(); memtable.insert(b"key", "value"); assert_eq!(memtable.get(b"key"), Some("value".to_string())); } } } -
Integration Tests - Test component interactions
#![allow(unused)] fn main() { // tests/integration_test.rs #[test] fn test_engine_recovery() { let config = LsmConfig::default(); let mut engine = LsmEngine::new(config).unwrap(); engine.put(b"key", "value").unwrap(); drop(engine); let engine = LsmEngine::new(config).unwrap(); assert_eq!(engine.get(b"key").unwrap(), Some("value".to_string())); } } -
Property Tests - Test invariants (optional, using
proptest)
Test Requirements
- All new code must have tests
- Tests must pass on all platforms
- Test coverage should increase, not decrease
- Use descriptive test names
#![allow(unused)] fn main() { #[test] fn test_get_returns_none_for_nonexistent_key() { /* ... */ } }
Running Tests
# Run all tests
cargo test --all-features
# Run specific test
cargo test test_memtable_insert
# Run with output
cargo test -- --nocapture
# Run integration tests only
cargo test --test '*'
# Run with coverage (requires tarpaulin)
cargo tarpaulin --out Html
๐ Commit Messages
We follow the Conventional Commits specification.
Format
<type>(<scope>): <subject> (#issue)
<body>
<footer>
Types
feat- New featurefix- Bug fixdocs- Documentation changesstyle- Code style changes (formatting, etc.)refactor- Code refactoringperf- Performance improvementstest- Test additions/modificationschore- Build process, dependencies, toolingci- CI/CD changes
Examples
Simple commit:
feat: add bloom filter to SSTable reader
With scope and issue:
fix(wal): prevent corruption on unclean shutdown (#42)
With body:
feat(compaction): implement leveled compaction strategy (#47)
Adds a new LeveledCompaction struct that implements the Compaction
trait. This strategy reduces read amplification by maintaining
sorted levels with exponentially increasing sizes.
Closes #47
Breaking change:
feat(api)!: change SSTable format to V2
BREAKING CHANGE: SSTable V2 is incompatible with V1.
Migration tool will be provided in v1.4.
Referencing Issues:
#123- Reference issuefixes #123,closes #123- Will auto-close issue when PR mergesresolves #123- Alternative close syntax
๐ Pull Request Process
Before Pushing
- Code compiles without errors
-
All tests pass (
cargo test --all-features) -
No clippy warnings (
cargo clippy --all-features -- -D warnings) -
Code is formatted (
cargo fmt) - Documentation is updated (if applicable)
- Tests are added for new functionality
Automated PR Creation
When you push to a feature/* or fix/* branch:
- โ Tests run automatically (CI/CD)
- โ
PR is auto-created to
developbranch - โ Issues are commented (if referenced in commits)
- โ Checks must pass before merge
Manual Steps (If Needed)
If you need to create a PR manually:
- Go to your fork on GitHub
- Click "New Pull Request"
- Select
developas the base branch - Fill out the PR template
- Submit the PR
PR Template
When creating a PR manually, use this template:
## Description
Brief description of changes.
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Related Issues
Closes #123
Related to #456
## Testing
Describe how you tested your changes:
- [ ] Unit tests added
- [ ] Integration tests added
- [ ] Manual testing performed
## Checklist
- [ ] Code compiles
- [ ] Tests pass
- [ ] Clippy checks pass
- [ ] Code is formatted
- [ ] Documentation updated
## Screenshots (if applicable)
## Additional Notes
Review Process
- Automated Checks - CI runs tests and linters
- Code Review - Maintainer reviews code
- Feedback - Address review comments
- Approval - Maintainer approves PR
- Merge - Squash and merge to
develop
Review Timeline
- Simple PRs: 1-3 days
- Complex PRs: 3-7 days
- Breaking Changes: 7-14 days
๐ Project Structure
ApexStore/
โโโ src/
โ โโโ core/ # Core domain logic
โ โ โโโ engine.rs # LSM engine orchestration
โ โ โโโ memtable.rs # In-memory storage
โ โ โโโ log_record.rs # Data model
โ โโโ storage/ # Persistence layer
โ โ โโโ wal.rs # Write-ahead log
โ โ โโโ sstable.rs # SSTable reader
โ โ โโโ builder.rs # SSTable writer
โ โโโ infra/ # Infrastructure
โ โ โโโ codec.rs # Serialization
โ โ โโโ error.rs # Error types
โ โ โโโ config.rs # Configuration
โ โโโ api/ # HTTP API (feature-gated)
โ โโโ cli/ # CLI interface
โ โโโ features/ # Feature flags
โโโ tests/ # Integration tests
โโโ benches/ # Benchmarks
โโโ docs/ # Documentation
Module Guidelines
core/- Domain logic, no external dependenciesstorage/- File I/O, persistenceinfra/- Cross-cutting concernsapi/- External interfaces (feature-gated)
๐ฏ Areas for Contribution
High Priority
-
CI/CD Testing Pipeline (#55)
- Difficulty: Easy
- Impact: High
- Skills: GitHub Actions, YAML
-
Compaction Implementation (#47)
- Difficulty: Hard
- Impact: High
- Skills: Rust, algorithms, file I/O
-
Efficient Iterators (#21, #22, #23)
- Difficulty: Medium
- Impact: High
- Skills: Rust, data structures
Medium Priority
-
Benchmarking Suite (#48)
- Difficulty: Easy
- Impact: Medium
- Skills: Rust, criterion
-
CLI Command Equalization (#65)
- Difficulty: Medium
- Impact: Medium
- Skills: Rust, CLI design
-
Checksums & Integrity (#25)
- Difficulty: Easy
- Impact: High
- Skills: Rust, CRC32
Good First Issues
-
Add More Tests
- Difficulty: Easy
- Impact: Medium
- Skills: Rust, testing
-
Binary Search Optimization (#37)
- Difficulty: Easy
- Impact: Medium
- Skills: Rust, algorithms
-
Documentation Improvements
- Difficulty: Easy
- Impact: Medium
- Skills: Technical writing
Advanced Topics
-
Replication Support
- Difficulty: Very Hard
- Impact: Very High
- Skills: Distributed systems, Raft
-
Snapshot Isolation
- Difficulty: Hard
- Impact: High
- Skills: Concurrency, MVCC
โ Questions?
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: docs/
- Email: netoo.elio@hotmail.com
๐ Ready to Contribute?
- Find an issue or create one
- Comment that you're working on it
- Fork the repo and create a branch from
main - Make your changes with tests
- Push to your fork (automated PR will be created)
- Wait for review and address feedback
Thank you for contributing! ๐
Last updated: March 2026