Resource Limits Quick Reference
Resource Limits Quick Reference
Default Limits
| Resource | Default | Max | Timeout |
|---|---|---|---|
| Query Timeout | 30s | 5m | Configurable per-query |
| Connections | 10,000 | Configurable | 5m idle |
| Connections/User | 100 | Configurable | - |
| Query Memory | 1GB | Configurable | - |
| Connection Memory | 512MB | Configurable | - |
| Total Memory | 8GB | Configurable | - |
| File Descriptors | 10,000 | Configurable | 5m idle |
Quick Start
Initialize Resource Manager
use heliosdb_storage::{ResourceLimitManager, ResourceLimitsConfig};
// Use defaultslet manager = ResourceLimitManager::default_config();
// Custom configlet config = ResourceLimitsConfig { // ... customize limits ..Default::default()};let manager = ResourceLimitManager::new(config);Execute Query with Timeout
use heliosdb_compute::{ResourceAwareExecutor, QueryContext};
let executor = ResourceAwareExecutor::new(base_executor, manager);
// With default timeout (30s)let result = executor.execute(plan, "user1".to_string()).await?;
// With custom timeoutlet context = QueryContext::new("user1".to_string()) .with_timeout(60_000);let result = executor.execute_with_timeout(plan, context).await?;Manage Connections
use heliosdb_storage::ConnectionPool;
let pool = ConnectionPool::new(PoolConfig::default());
// Add and acquirelet conn_id = pool.add_connection(conn, "user1".to_string()).await?;let guard = pool.acquire("user1").await?;
// Auto-cleanuppool.cleanup_idle().await;Track Memory
use heliosdb_storage::{MemoryManager, AllocationType};
let manager = MemoryManager::new(limits);
// Allocatemanager.allocate("id", 512, AllocationType::Query, "owner")?;
// Check pressureif manager.is_under_pressure() { // Handle pressure}
// Deallocatemanager.deallocate("id");Manage File Descriptors
use heliosdb_storage::{FileDescriptorManager, FileHandleType};
let manager = FileDescriptorManager::new(limits);
// Acquire handlemanager.acquire_handle("id", "/path", FileHandleType::SSTable, "owner")?;
// Cleanupmanager.cleanup_idle_handles();
// Releasemanager.release_handle("id")?;Monitoring
Get Statistics
// Overall statisticslet stats = resource_manager.get_statistics();
// Memory statisticslet mem_stats = memory_manager.get_statistics();
// Pool statisticslet pool_stats = pool.stats();
// FD statisticslet fd_stats = fd_manager.get_statistics();Pressure Levels
- Normal: < 60% usage
- Low: 60-75% usage
- Medium: 75-85% usage (throttle new allocations)
- High: 85-95% usage (evict caches)
- Critical: > 95% usage (reject new allocations)
Error Handling
match result { Err(HeliosError::ResourceLimit(msg)) => { // Handle resource limit error match msg.as_str() { s if s.contains("timeout") => /* Query timeout */, s if s.contains("connection") => /* Connection limit */, s if s.contains("memory") => /* Memory limit */, _ => /* Other resource error */, } } Ok(data) => // Process data}Configuration Patterns
Production Settings
ResourceLimitsConfig { query: QueryConfig { timeout_ms: 60_000, // 1 minute max_timeout_ms: 600_000, // 10 minutes auto_cancel: true, }, connections: ConnectionLimits { max_connections: 10_000, max_per_user: 200, idle_timeout_ms: 600_000, // 10 minutes }, memory: MemoryLimits { max_query_memory_mb: 2048, // 2GB max_total_memory_mb: 16384, // 16GB pressure_threshold: 0.80, // 80% }, file_descriptors: FileDescriptorLimits { max_open_files: 50_000, handle_timeout_ms: 600_000, // 10 minutes auto_cleanup: true, },}Development Settings
ResourceLimitsConfig { query: QueryConfig { timeout_ms: 300_000, // 5 minutes max_timeout_ms: 3_600_000, // 1 hour auto_cancel: false, // Debug mode }, connections: ConnectionLimits { max_connections: 100, max_per_user: 10, idle_timeout_ms: 60_000, // 1 minute }, memory: MemoryLimits { max_query_memory_mb: 512, max_total_memory_mb: 2048, pressure_threshold: 0.90, pressure_detection_enabled: false, // Debug mode }, file_descriptors: FileDescriptorLimits { max_open_files: 1_000, auto_cleanup: true, },}Troubleshooting
Query Timeouts
// Increase timeout for specific querylet context = QueryContext::new(user).with_timeout(120_000);
// Check current configlet config = manager.get_config();println!("Timeout: {}ms, Max: {}ms", config.query.timeout_ms, config.query.max_timeout_ms);Connection Limits
// Check current usagelet stats = manager.get_statistics();println!("Connections: {}/{}", stats.total_connections, stats.max_connections);
// Cleanup idle connectionslet cleaned = manager.cleanup_idle_connections();Memory Pressure
// Check pressurelet level = memory_manager.get_pressure_level();println!("Pressure: {:?}", level);
// Get eviction candidateslet candidates = memory_manager.suggest_evictions(1024);for id in candidates { memory_manager.deallocate(&id);}File Descriptor Exhaustion
// Check usagelet stats = fd_manager.get_statistics();println!("Open: {}/{}", stats.open_files, stats.max_files);
// Force close LRU handleslet closed = fd_manager.force_close_lru(100);
// Cleanup by typelet cleaned = fd_manager.cleanup_by_type(FileHandleType::Temp);Best Practices
- Always use ResourceAwareExecutor for query execution
- Monitor pressure levels and respond proactively
- Set appropriate timeouts based on query complexity
- Use connection pooling instead of direct connections
- Track memory allocations by type for better visibility
- Enable auto-cleanup in production
- Configure limits based on available system resources
- Test under load to tune limits appropriately
- Monitor statistics regularly
- Handle resource errors gracefully
Common Patterns
Retry with Backoff
let mut attempts = 0;let max_attempts = 3;
while attempts < max_attempts { match executor.execute(plan, user).await { Ok(result) => return Ok(result), Err(HeliosError::ResourceLimit(_)) if attempts < max_attempts - 1 => { attempts += 1; tokio::time::sleep(Duration::from_millis(100 * attempts)).await; } Err(e) => return Err(e), }}Graceful Degradation
if memory_manager.is_under_pressure() { let level = memory_manager.get_pressure_level();
match level { PressureLevel::Medium => { // Evict non-essential caches cache.evict_cold_entries(); } PressureLevel::High => { // Evict all caches cache.clear(); } PressureLevel::Critical => { // Reject new requests return Err(HeliosError::ResourceLimit( "System under critical memory pressure".into() )); } _ => {} }}Background Cleanup
// Spawn background cleanup tasktokio::spawn(async move { let mut interval = tokio::time::interval(Duration::from_secs(60));
loop { interval.tick().await;
// Cleanup idle connections pool.cleanup_idle().await;
// Cleanup idle file handles fd_manager.cleanup_idle_handles();
// Check memory pressure if memory_manager.is_under_pressure() { let candidates = memory_manager.suggest_evictions(1024); for id in candidates { memory_manager.deallocate(&id); } } }});For detailed documentation, see /home/claude/HeliosDB/docs/RESOURCE_LEAK_PREVENTION_COMPLETE.md