Skip to main content

feoxdb/
constants.rs

1use std::time::Duration;
2
3// Size units
4pub const KB: usize = 1024;
5pub const MB: usize = 1024 * KB;
6pub const GB: usize = 1024 * MB;
7
8// Size limits
9pub const MAX_KEY_SIZE: usize = 100 * KB;
10pub const MAX_VALUE_SIZE: usize = 4 * MB;
11pub const DEFAULT_MAX_MEMORY: usize = 4 * GB;
12
13// Memory alignment
14pub const PAGE_SIZE: usize = 4096;
15pub const PAGE_MASK: usize = PAGE_SIZE - 1;
16pub const MAX_CONNECTIONS: usize = 1000;
17
18// Hash table configuration
19pub const DEFAULT_HASH_BITS: u32 = 23;
20pub const KV_STORE_BUCKETS: usize = 1 << DEFAULT_HASH_BITS; // 8M buckets
21pub const HASH_SPINLOCKS_COUNT: usize = 256;
22pub const CACHE_BUCKETS: usize = 16384;
23
24// Block and sector sizes
25pub const FEOX_BLOCK_SIZE: usize = 4096;
26pub const SECTOR_SHIFT: usize = 9;
27pub const SECTOR_SIZE: usize = 512;
28pub const SECTOR_HEADER_SIZE: usize = 4;
29pub const SECTOR_MARKER: u16 = 0xABCD;
30pub(crate) const STALE_READ_RETRY_LIMIT: usize = 4;
31
32// Retired-extent marker written over every block of a freed extent.
33// Layout: tag(8) | remaining blocks(8) | sector-bound token(2) | state(1)
34pub(crate) const DELETION_MARKER: &[u8; 8] = b"\0DELETED";
35pub(crate) const DELETION_MARKER_SIZE: usize = 19;
36#[cfg(test)]
37pub(crate) const RETIREMENT_PENDING: u8 = 0;
38pub(crate) const RETIREMENT_COMPLETE: u8 = 1;
39pub(crate) const WRITE_ENTRY_RETRY_ALARM: u32 = 8;
40
41pub(crate) const MAX_RECOVERABLE_KEY_SIZE_V1: usize =
42    FEOX_BLOCK_SIZE - (SECTOR_HEADER_SIZE + 2 + 8 + 8);
43pub(crate) const MAX_RECOVERABLE_KEY_SIZE: usize =
44    FEOX_BLOCK_SIZE - (SECTOR_HEADER_SIZE + 2 + 8 + 8 + 8);
45
46// Metadata
47pub const FEOX_SIGNATURE: &[u8; 8] = b"FEOX_SIG";
48pub const FEOX_SIGNATURE_SIZE: usize = 8;
49pub const FEOX_METADATA_BLOCK: u64 = 0;
50pub(crate) const FEOX_METADATA_BACKUP_BLOCK: u64 = 7;
51pub const FEOX_METADATA_SIZE: usize = PAGE_SIZE;
52pub const FEOX_DATA_START_BLOCK: u64 = 16;
53pub const FEOX_WRITE_BUFFER_SIZE: usize = 16 * MB;
54pub const FEOX_ALIGNMENT: usize = 512;
55
56// Memory allocation thresholds
57pub const KMALLOC_LIMIT: usize = 8192;
58pub const LARGE_ALLOC_THRESHOLD: usize = 8192;
59
60// Write buffer configuration
61pub const WRITE_BUFFER_SIZE: usize = 1024;
62pub const WRITE_BUFFER_FLUSH_INTERVAL: Duration = Duration::from_millis(100);
63pub const WORK_TIMEOUT_MS: u64 = 5000;
64pub const WRITE_BUFFER_WORKER_RATIO: usize = 2;
65
66// Cache configuration
67pub const CACHE_HIGH_WATERMARK_MB: usize = 100;
68pub const CACHE_LOW_WATERMARK_MB: usize = 50;
69pub const CACHE_MAX_SIZE: usize = GB; // 1GB max cache
70pub const CACHE_ADJUST_INTERVAL: Duration = Duration::from_secs(5);
71pub const CACHE_CLOCK_HAND_ADVANCE: usize = 100;
72
73// Tenant configuration
74pub const TENANT_ID_SIZE: usize = 4;
75
76// Device limits
77pub const MAX_DEVICE_SIZE: u64 = 1u64 << 40; // 1TB
78pub const DEFAULT_DEVICE_SIZE: u64 = GB as u64; // 1GB default
79
80// io_uring configuration
81pub const IOURING_QUEUE_SIZE: u32 = 256;
82pub const IOURING_MAX_BATCH: usize = 128; // Safely under queue size
83pub const IOURING_SQPOLL_IDLE_MS: u32 = 1000;
84
85// Operation types
86#[derive(Debug, Clone, Copy, PartialEq, Eq)]
87pub enum Operation {
88    Insert,
89    Update,
90    Delete,
91    Get,
92    PartialUpdate,
93}
94
95// POSIX error codes
96pub const EINVAL: i32 = 22;
97pub const ENOMEM: i32 = 12;
98pub const ENOENT: i32 = 2;
99pub const EEXIST: i32 = 17;
100pub const EAGAIN: i32 = 11;
101pub const ENOSPC: i32 = 28;
102pub const EMSGSIZE: i32 = 90;
103pub const EOVERFLOW: i32 = 75;
104pub const EIO: i32 = 5;
105pub const EFAULT: i32 = 14;
106pub const ENOTEMPTY: i32 = 39;
107pub const ENODEV: i32 = 19;