Skip to content

Commit 6baf3a2

Browse files
committed
Single threaded accountsdb manager & misc changes
1 parent 8e1f938 commit 6baf3a2

File tree

3 files changed

+33
-30
lines changed

3 files changed

+33
-30
lines changed

src/accountsdb/db.zig

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,8 +1650,9 @@ pub const AccountsDB = struct {
16501650
self.unrooted_accounts.readWithLock();
16511651
defer unrooted_accounts_lg.unlock();
16521652

1653-
const accounts = (unrooted_accounts.get(account_ref.slot) orelse
1654-
return error.SlotNotFound).items(.account);
1653+
const slots_and_accounts = unrooted_accounts.get(account_ref.slot) orelse
1654+
return error.SlotNotFound;
1655+
const accounts: []Account = slots_and_accounts.items(.account);
16551656
const account = accounts[ref_info.index];
16561657

16571658
return try account.cloneOwned(self.allocator);

src/accountsdb/fuzz.zig

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ pub const RunCmd = struct {
6262
});
6363
};
6464

65+
const Logger = sig.trace.Logger("accountsdb.fuzz");
66+
6567
pub 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

451453
fn 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
{

src/accountsdb/manager.zig

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,7 @@ fn flushSlot(db: *AccountsDB, slot: Slot) !FileId {
301301
const unrooted_accounts, var unrooted_accounts_lg = db.unrooted_accounts.readWithLock();
302302
defer unrooted_accounts_lg.unlock();
303303

304-
const pubkeys_and_accounts = unrooted_accounts.get(slot) orelse
305-
return error.SlotNotFound;
304+
const pubkeys_and_accounts = unrooted_accounts.get(slot) orelse return error.SlotNotFound;
306305
break :blk pubkeys_and_accounts;
307306
};
308307

0 commit comments

Comments
 (0)