1+ use std:: sync:: Arc ;
2+
13use nodedb_columnar:: memtable:: ColumnData ;
4+ use nodedb_columnar:: writer:: PROFILE_PLAIN ;
25use nodedb_columnar:: {
36 DeleteBitmap , OwnedSegmentReader , ScanPredicate , SegmentReader , SegmentWriter ,
47} ;
8+ use nodedb_mem:: { EngineId , EngineLimits , GovernorConfig , MemoryGovernor , ScopedMemory } ;
59use nodedb_types:: columnar:: { ColumnDef , ColumnType , ColumnarSchema } ;
10+ use nodedb_types:: { DatabaseId , TenantId } ;
611use nodedb_wal:: crypto:: WalEncryptionKey ;
712
813const INPUT_PREFIX_BYTES : usize = 64 ;
@@ -17,6 +22,26 @@ const COLUMN_COUNT: usize = 5;
1722const FUZZ_KEK_BYTES : [ u8 ; 32 ] = [ 0x5a ; 32 ] ;
1823const FUZZ_KEK_EPOCH : [ u8 ; 4 ] = [ 0 ; 4 ] ;
1924
25+ /// A memory scope whose governor ceiling covers every engine's limit — the
26+ /// same shape the integration tests use. Segment writes now take mandatory
27+ /// ScopedMemory (refactor(mem): make ScopedMemory budgeting mandatory).
28+ fn fuzz_memory ( ) -> ScopedMemory {
29+ let per_engine = usize:: MAX / EngineId :: ALL . len ( ) ;
30+ let governor = Arc :: new (
31+ MemoryGovernor :: new ( GovernorConfig {
32+ global_ceiling : per_engine * EngineId :: ALL . len ( ) ,
33+ engine_limits : EngineLimits :: uniform ( per_engine) ,
34+ } )
35+ . expect ( "fuzz governor" ) ,
36+ ) ;
37+ ScopedMemory :: new (
38+ governor,
39+ DatabaseId :: DEFAULT ,
40+ TenantId :: new ( 0 ) ,
41+ EngineId :: Columnar ,
42+ )
43+ }
44+
2045fn exercise_reader ( reader : & SegmentReader < ' _ > ) {
2146 let count = reader. column_count ( ) . min ( COLUMN_COUNT ) ;
2247 for index in 0 ..count {
@@ -169,7 +194,7 @@ fn generated_segment(seed: &[u8], kek: Option<&WalEncryptionKey>) -> Option<Vec<
169194 } ,
170195 ] ;
171196
172- SegmentWriter :: plain ( )
197+ SegmentWriter :: new ( PROFILE_PLAIN , fuzz_memory ( ) )
173198 . write_segment ( & schema, & columns, ROW_COUNT , kek)
174199 . ok ( )
175200}
0 commit comments