Skip to content

Latest commit

 

History

History
309 lines (264 loc) · 12.3 KB

File metadata and controls

309 lines (264 loc) · 12.3 KB

Bump Service Development Plan

2026-07-14 Update — Hardening Pass (supersedes stale sections below)

This document was written early in the project and has drifted from the current state of the code in several places. Rather than rewrite history, this note records what actually changed in the most recent hardening pass (see CHANGELOG.md and git log --oneline main..HEAD for the authoritative commit-by-commit record) and which claims below it supersedes:

  • Queue correctness/concurrency bugs fixed. The match transaction was rewritten so all queue mutation happens under a single write lock: atomic_match now removes both paired entries (previously the new arrival could be left as an Active "ghost" and re-matched, replaying a payload to a third client); /receive now reads the payload from the live map entry instead of a clone with payload: None; state/expiry and channel-liveness are re-validated under the lock before committing a match, retrying instead of one-sided-committing on failure; a dropped handler future (client disconnect) now cleans up its queue entry via an RAII guard instead of leaking it for the full TTL; match/expiry counters are now queue-resident atomics incremented exactly once per event.
  • Config now has per-field defaults, clamps, and a weather proxy. MatchingConfig uses per-field serde defaults so a partial BUMP_* environment no longer silently resets the whole config; parse failures are now logged loudly instead of failing silently. Client-supplied ttl is clamped to 30s, JSON bodies are capped at 1 MB, and empty/whitespace custom_key values are rejected. GET /bump/weather?lat=&long= was added as a server-side OpenWeather proxy (BUMP_OPENWEATHER_KEY) so the upstream key never reaches clients.
  • Deploy was fixed. The Dockerfile's baked-in matching window (BUMP_MAX_TIME_DIFF_MS/BUMP_MAX_DISTANCE_METERS) previously made real-world matching nearly impossible; it now ships workable defaults, runs as non-root, and caches the dependency-fetch layer.
  • The "completed tests" claims in the Test Plan below were overstated. Many items marked referred to a test suite (service_test.rs, api_test.rs) that targeted an obsolete non-blocking architecture and has since been deleted as stale/broken. The real, current integration tests live in tests/integration/ (bump_matching.rs, regressions.rs) and exercise the present rendezvous-style MatchingService API — concurrent matching, payload correctness regardless of arrival order, cancelled-handler cleanup, counter accuracy, and custom-key edge cases. Treat checkmarks below describing the old suite as historical, not current, status.

Plan

Phase 1: Initial Setup and Core API

  1. Set up project structure and dependencies

    • Create minimal Cargo.toml with essential dependencies
    • Set up directory structure following Rust best practices
    • Configure logging and error handling
  2. Implement Core Types and Structures

    • Define data models for request/response types
    • Implement matching algorithm types
    • Create error types and handling utilities
  3. Create API Server

    • Set up Actix-web server (chosen for performance and ease of use)
    • Implement /bump/send and /bump/receive endpoints
    • Add basic request validation
  4. Implement Matching Service

    • Create in-memory request pool
    • Implement matching algorithm with configurable tolerances
    • Add timeout handling

Phase 2: Testing and Documentation

  1. Unit Tests

    • Test matching algorithm
    • Test request/response handling
    • Test timeout scenarios
  2. Integration Tests

    • End-to-end API tests
    • Concurrent request handling tests
    • Performance benchmarks
  3. Documentation

    • API documentation
    • Code documentation
    • Setup and deployment guide

Phase 3: Performance Optimization

  1. Performance Testing

    • Load testing
    • Memory usage analysis
    • Response time optimization
  2. Security Hardening

    • Rate limiting
    • Input validation
    • HTTPS support

Progress

Current Status

  • Initial project planning complete
  • Project structure established with modular design
  • Core matching service implemented and optimized with:
    • New matching logic with mandatory time proximity
    • Optional but weighted location and custom key matching
    • Request validation for matching criteria
  • ✅ Configuration system with environment variable support:
    • Robust validation of all configuration parameters
    • Default values for optional parameters
    • Comprehensive test coverage with serialized test execution
    • Early validation for critical parameters
  • Periodic cleanup of expired requests
  • ✅ Queue system optimized and stabilized:
    • Removed excessive debug logging for better performance
    • Fixed test suite reliability issues
    • Improved test execution speed
    • Maintained comprehensive test coverage
  • ✅ Queue system redesigned with event-based architecture:
    • Implemented trait-based queue interface
    • Added in-memory implementation using broadcast channels
    • Real-time event notifications for matches
    • Efficient request cleanup
    • Support for future Redis implementation
  • ✅ Code quality improvements:
    • Addressed all compiler warnings
    • Added appropriate dead code annotations
    • Improved test reliability with serial execution
  • ✅ Matching algorithm completely redesigned:
    • Replaced exact matching with weighted scoring approach
    • Implemented temporal proximity scoring (configurable window, default 500ms)
    • Added spatial proximity scoring (configurable distance, default 5m)
    • Developed custom key matching with higher score boost
    • Created different thresholds for matches with/without custom keys
  • ✅ Fixed critical architecture bug in MemoryQueue::clone():
    • Implemented Arc<RwLock<HashMap>> to ensure shared state
    • All queue clones now share the same underlying data
  • ✅ Made matching parameters configurable:
    • Added configuration methods to MemoryQueue
    • Created clean interface for accessing configuration values
  • ✅ Added comprehensive documentation:
    • Created detailed matching algorithm documentation in docs/matching-algorithm.md
    • Included examples, configuration options, and future enhancements
  • Current Focus: Integrating matching configuration with core config system

Problems and Learnings

Design Evolution

  1. Initial Queue Implementation:

    • Using HashMap with RwLock for thread safety
    • Polling-based matching strategy (every 50ms)
    • Limitations:
      • Inefficient active polling
      • No real-time notification system
      • Not easily extensible for different storage backends
  2. Implemented Queue Redesign:

    • ✅ Created an abstract Queue trait for send/receive operations
    • ✅ Implemented using Arc<RwLock> for shared state
    • ✅ Added configurable matching algorithm with score-based approach
    • ✅ Improved thread safety with proper clone semantics

Technical Decisions

  1. Choice of Web Framework: Actix-web

    • Pros: High performance, async support, mature ecosystem
    • Cons: Slightly more complex than alternatives like Rocket
    • Decision: Performance is a key requirement, making Actix-web the better choice
  2. In-Memory Storage & Concurrency:

    • Implemented using HashMap with parking_lot::RwLock
    • Chose parking_lot over std::sync for better performance
    • Optimized lock patterns to minimize contention
    • Added efficient cleanup mechanism for expired requests
  3. Matching Algorithm Design:

    • ✅ Implemented weighted scoring system with configurable weights
    • ✅ Used Haversine formula for accurate distance calculation
    • ✅ Added early filtering to reduce computation load
    • ✅ Enhanced custom key matching with score boosting
    • ✅ Created different matching thresholds based on presence of custom keys

Queue Design Considerations

  1. Interface Requirements:

    • Async-first design
    • Support for timeout-based operations
    • Efficient matching criteria evaluation
    • Clear ownership and lifecycle management
  2. Implementation Options:

    • tokio::sync::broadcast for notifications
    • Custom channel implementation for complex matching
    • Potential for distributed queue support

Anticipated Challenges

  1. Concurrency Handling

    • Need careful design of the request pool to handle concurrent access
    • Must ensure thread safety without sacrificing performance
  2. Timeout Management

    • Efficient cleanup of timed-out requests
    • Balancing between memory usage and performance
  3. Location Matching

    • Efficient spatial indexing for location-based matching
    • Handling edge cases in location accuracy

Test Plan

1. Unit Tests

Queue Implementation

✅ Basic Operations:

  • ✅ Test queue operations (add, remove, find) in service_test.rs
  • ✅ Test cleanup of expired requests (test_queue_cleanup)
  • ✅ Test error conditions (test_queue_full)

✅ Advanced Queue Testing:

  • ✅ Test event broadcasting with multiple subscribers (test_event_broadcasting, test_advanced_event_broadcasting)
  • ✅ Validate thread safety with concurrent operations (test_thread_safety_with_clones)
  • ✅ Test race conditions in matching process (test_race_conditions_in_matching)
  • ✅ Test concurrent queue operations (test_concurrent_queue_operations)
  • ✅ Test system stability under load (test_queue_stress)
Matching Service

✅ Request Processing:

  • ✅ Test send request processing (test_send_endpoint)
  • ✅ Test receive request processing (test_receive_endpoint)
  • ✅ Test timeouts (test_timeout)
  • ✅ Test error cases (test_queue_full)

✅ Matching Algorithm:

  • ✅ Test exact matches (test_exact_match)
  • ✅ Test temporal matching (test_temporal_match)
  • ✅ Test spatial matching (test_spatial_match)
  • ✅ Test combined criteria (test_matching_flow)
  • ✅ Test score-based matching algorithm
  • ✅ Test different thresholds for custom key presence
Configuration

✅ Configuration Management:

  • ✅ Test environment variable loading
  • ✅ Validate default values
  • ✅ Test invalid configurations
  • ✅ Test serialized environment updates

2. Integration Tests

API Endpoints

✅ Basic Functionality:

  • ✅ Test successful send/receive flow
  • ✅ Test error handling
  • ✅ Test timeout scenarios

✅ Basic Advanced Scenarios:

  • ✅ Load testing with moderate request volume (test_queue_stress)
  • ✅ Error recovery with concurrent operations (test_concurrent_queue_operations)
  • ✅ Edge case handling (all event broadcasting tests)

❌ Extended Advanced Scenarios (To Be Implemented):

  • Very high volume load testing (10k+ requests)
  • System recovery after crash scenarios
  • Network partition scenarios
Concurrent Operations

✅ Concurrency Testing:

  • ✅ Test multiple simultaneous send requests (test_concurrent_queue_operations)
  • ✅ Test multiple simultaneous receive requests (test_concurrent_matching)
  • ✅ Test mixed send/receive scenarios (test_race_conditions_in_matching)
  • ✅ Verify thread safety under load (test_thread_safety_with_clones, test_queue_stress)

3. Performance Tests (To Be Implemented)

❌ Load Testing:

  • Measure request throughput
  • Test memory usage under load
  • Verify cleanup effectiveness

❌ Latency Testing:

  • Measure matching latency
  • Test event propagation speed
  • Verify timeout accuracy

❌ Resource Usage:

  • Monitor CPU utilization
  • Track memory growth
  • Measure queue size dynamics
  • Monitor CPU usage
  • Track memory allocation
  • Measure lock contention

Next Steps

  1. ✅ Implement core test suite following the above plan
  2. ❗ Implement advanced queue testing:
    • Test event broadcasting with multiple subscribers
    • Validate thread safety with concurrent operations
    • Test race conditions in matching process
  3. Integrate matching configuration with core config system
  4. Add performance benchmarks
  5. Implement telemetry and logging
    • Add metrics to track match scores and success rates
    • Implement structured logging for debugging match decisions
  6. Consider additional features:
    • Rate limiting
    • Metrics and monitoring
    • Request validation middleware
    • Redis queue implementation
  7. Implement match feedback loop
    • Add API for clients to report successful/failed matches
    • Use feedback data to auto-tune matching parameters

Note: This document will be updated as development progresses.