@@ -62,6 +62,8 @@ pub const RunCmd = struct {
6262 });
6363};
6464
65+ const Logger = sig .trace .Logger ("accountsdb.fuzz" );
66+
6567pub fn run (seed : u64 , args : * std.process.ArgIterator ) ! void {
6668 var prng_state : std.Random.DefaultPrng = .init (seed );
6769 const random = prng_state .random ();
@@ -83,7 +85,7 @@ pub fn run(seed: u64, args: *std.process.ArgIterator) !void {
8385 .max_buffer = 1 << 20 ,
8486 }, null );
8587 defer std_logger .deinit ();
86- const logger = std_logger .logger ("accountsdb.fuzz" );
88+ const logger : Logger = std_logger .logger ("accountsdb.fuzz" );
8789
8890 const run_cmd : RunCmd = cmd : {
8991 var argv_list : std .ArrayListUnmanaged ([]const u8 ) = .empty ;
@@ -146,18 +148,13 @@ pub fn run(seed: u64, args: *std.process.ArgIterator) !void {
146148 try accounts_db .account_index .expandRefCapacity (1_000_000 );
147149
148150 var manager_exit : std .atomic .Value (bool ) = .init (false );
149- const manager_handle : std.Thread = try .spawn (.{}, sig .accounts_db .manager .runLoop , .{
150- & accounts_db , sig.accounts_db.manager.ManagerLoopConfig {
151- .exit = & manager_exit ,
152- .slots_per_full_snapshot = 50_000 ,
153- .slots_per_incremental_snapshot = 5_000 ,
154- .zstd_nb_workers = @intCast (std .Thread .getCpuCount () catch 0 ),
155- },
151+ var manager : sig.accounts_db.manager.Manager = try .init (allocator , & accounts_db , .{
152+ .exit = & manager_exit ,
153+ .slots_per_full_snapshot = 50_000 ,
154+ .slots_per_incremental_snapshot = 5_000 ,
155+ .zstd_nb_workers = @intCast (std .Thread .getCpuCount () catch 0 ),
156156 });
157- defer {
158- manager_exit .store (true , .release );
159- manager_handle .join ();
160- }
157+ defer manager .deinit (allocator );
161158
162159 var tracked_accounts_rw : sig .sync .RwMux (TrackedAccountsMap ) = .init (.empty );
163160 defer {
@@ -185,13 +182,13 @@ pub fn run(seed: u64, args: *std.process.ArgIterator) !void {
185182 // any validation (in the .get block of the main fuzzer
186183 // loop, we perform validation)
187184 threads .appendAssumeCapacity (try .spawn (.{}, readRandomAccounts , .{
185+ logger ,
188186 & accounts_db ,
189187 & tracked_accounts_rw ,
190188 seed + thread_i ,
191189 & reader_exit ,
192190 thread_i ,
193191 }));
194- logger .debug ().logf ("started readRandomAccounts thread: {}" , .{thread_i });
195192 }
196193
197194 var largest_rooted_slot : Slot = 0 ;
@@ -206,9 +203,12 @@ pub fn run(seed: u64, args: *std.process.ArgIterator) !void {
206203 logger .info ().logf ("reached max slots: {}" , .{max_slots });
207204 break ;
208205 };
209- defer switch (random .int (u2 )) {
210- 0 = > slot += random .intRangeAtMost (Slot , 1 , 2 ),
211- 1 , 2 , 3 = > {},
206+ const will_inc_slot = switch (random .int (u2 )) {
207+ 0 = > true ,
208+ 1 , 2 , 3 = > false ,
209+ };
210+ defer if (will_inc_slot ) {
211+ slot += random .intRangeAtMost (Slot , 1 , 2 );
212212 };
213213 try ancestors .addSlot (allocator , slot );
214214
@@ -281,7 +281,10 @@ pub fn run(seed: u64, args: *std.process.ArgIterator) !void {
281281
282282 const account =
283283 try accounts_db .getAccountWithAncestors (& pubkey , & ancestors_sub ) orelse {
284- logger .err ().logf ("accounts_db missing tracked account '{}': {}" , .{ pubkey , tracked_account });
284+ logger .err ().logf (
285+ "accounts_db missing tracked account '{}': {}" ,
286+ .{ pubkey , tracked_account },
287+ );
285288 return error .MissingAccount ;
286289 };
287290 defer account .deinit (allocator );
@@ -297,13 +300,12 @@ pub fn run(seed: u64, args: *std.process.ArgIterator) !void {
297300 },
298301 }
299302
300- const create_new_root = random .boolean () ;
301- if (create_new_root ) {
303+ const create_new_root = will_inc_slot and random .int ( u8 ) == 0 ;
304+ if (create_new_root ) snapshot_validation : {
302305 largest_rooted_slot = @min (slot , largest_rooted_slot + 2 );
303306 accounts_db .largest_rooted_slot .store (largest_rooted_slot , .monotonic );
304- }
307+ try manager . manage ( allocator );
305308
306- snapshot_validation : {
307309 // holding the lock here means that the snapshot archive(s) wont be deleted
308310 // since deletion requires a write lock
309311 const maybe_latest_snapshot_info , //
@@ -449,20 +451,21 @@ pub fn run(seed: u64, args: *std.process.ArgIterator) !void {
449451}
450452
451453fn readRandomAccounts (
454+ logger : Logger ,
452455 db : * AccountsDB ,
453456 tracked_accounts_rw : * sig .sync .RwMux (TrackedAccountsMap ),
454457 seed : u64 ,
455458 exit : * std .atomic .Value (bool ),
456459 thread_id : usize ,
457460) void {
458- var prng = std .Random .DefaultPrng .init (seed );
461+ logger .debug ().logf ("started readRandomAccounts thread: {}" , .{thread_id });
462+ defer logger .debug ().logf ("finishing readRandomAccounts thread: {}" , .{thread_id });
463+
464+ var prng : std.Random.DefaultPrng = .init (seed );
459465 const random = prng .random ();
460466
461467 while (true ) {
462- if (exit .load (.seq_cst )) {
463- std .debug .print ("finishing readRandomAccounts thread: {}\n " , .{thread_id });
464- return ;
465- }
468+ if (exit .load (.seq_cst )) return ;
466469
467470 var pubkeys : [50 ]Pubkey = undefined ;
468471 {
0 commit comments