@@ -155,7 +155,8 @@ pub const TowerConsensus = struct {
155155 );
156156 errdefer fork_choice .deinit (allocator );
157157
158- const root_ref = deps .slot_tracker .get (deps .slot_tracker .root ).? ;
158+ const root = deps .slot_tracker .root .load (.monotonic );
159+ const root_ref = deps .slot_tracker .get (root ).? ;
159160 const root_ancestors = & root_ref .constants .ancestors ;
160161
161162 var tower : Tower = if (deps .identity .vote_account ) | vote_account_address |
@@ -166,8 +167,8 @@ pub const TowerConsensus = struct {
166167 vote_account_address ,
167168 )
168169 else
169- .{ .root = deps . slot_tracker . root };
170- tower .setRoot (deps . slot_tracker . root );
170+ .{ .root = root };
171+ tower .setRoot (root );
171172
172173 const replay_tower : ReplayTower = try .init (
173174 .from (deps .logger ),
@@ -178,7 +179,7 @@ pub const TowerConsensus = struct {
178179 errdefer replay_tower .deinit (allocator );
179180
180181 var vote_collector : sig.consensus.VoteCollector =
181- try .init (deps .now , deps . slot_tracker . root , deps .registry );
182+ try .init (deps .now , root , deps .registry , deps . slot_tracker . latest_confirmed_slot );
182183 errdefer vote_collector .deinit (allocator );
183184
184185 return .{
@@ -207,7 +208,7 @@ pub const TowerConsensus = struct {
207208 ) ! HeaviestSubtreeForkChoice {
208209 const root_slot , const root_hash = blk : {
209210 const root = slot_tracker .getRoot ();
210- const root_slot = slot_tracker .root ;
211+ const root_slot = slot_tracker .root . load ( .monotonic ) ;
211212 const root_hash = root .state .hash .readCopy ();
212213 break :blk .{ root_slot , root_hash .? };
213214 };
@@ -586,7 +587,7 @@ pub const TowerConsensus = struct {
586587 }
587588 // Update cluster with the duplicate confirmation status.
588589 // Analogous to [ReplayStage::mark_slots_duplicate_confirmed](https://github.com/anza-xyz/agave/blob/47c0383f2301e5a739543c1af9992ae182b7e06c/core/src/replay_stage.rs#L3876)
589- const root_slot = slot_tracker .root ;
590+ const root_slot = slot_tracker .root . load ( .monotonic ) ;
590591 for (duplicate_confirmed_forks .items ) | duplicate_confirmed_fork | {
591592 const slot , const frozen_hash = duplicate_confirmed_fork .tuple ();
592593 try self .handleDuplicateConfirmedFork (
@@ -1606,7 +1607,7 @@ fn checkAndHandleNewRoot(
16061607 // Audit: The rest of the code maps to Self::handle_new_root in Agave.
16071608 // Update the slot tracker.
16081609 // Set new root.
1609- slot_tracker .root = new_root ;
1610+ slot_tracker .root . store ( new_root , .monotonic ) ;
16101611 // Prune non rooted slots
16111612 slot_tracker .pruneNonRooted (allocator );
16121613
@@ -4771,12 +4772,10 @@ test "edge cases - duplicate slot" {
47714772
47724773 const slot_tracker = & replay_state .slot_tracker ;
47734774 const progress_map = & replay_state .progress_map ;
4774- std .debug .assert (slot_tracker .root == 0 );
4775+ const root_slot0 = slot_tracker .root .load (.monotonic );
4776+ std .debug .assert (root_slot0 == 0 );
47754777
4776- const root_slot0 = slot_tracker .root ;
47774778 const root_slot0_hash = slot_tracker .getRoot ().state .hash .readCopy ().? ;
4778-
4779- std .debug .assert (root_slot0 == 0 ); // assert initial root value
47804779 std .debug .assert (root_slot0_hash .eql (.ZEROES )); // assert initial root hash
47814780
47824781 // -- slot1 -- //
@@ -4930,12 +4929,11 @@ test "edge cases - duplicate confirmed slot" {
49304929
49314930 const slot_tracker = & replay_state .slot_tracker ;
49324931 const progress_map = & replay_state .progress_map ;
4933- std .debug .assert (slot_tracker .root == 0 );
4932+ const root_slot0 = slot_tracker .root .load (.monotonic );
4933+ std .debug .assert (root_slot0 == 0 );
49344934
4935- const root_slot0 = slot_tracker .root ;
49364935 const root_slot0_hash = slot_tracker .getRoot ().state .hash .readCopy ().? ;
4937-
4938- std .debug .assert (root_slot0 == 0 ); // assert initial root value
4936+ std .debug .assert (root_slot0_hash .eql (.ZEROES )); // assert initial root hash
49394937 std .debug .assert (root_slot0_hash .eql (.ZEROES )); // assert initial root hash
49404938
49414939 // -- slot1 -- //
@@ -5090,16 +5088,14 @@ test "edge cases - gossip verified vote hashes" {
50905088
50915089 const slot_tracker = & replay_state .slot_tracker ;
50925090 const progress_map = & replay_state .progress_map ;
5093- std .debug .assert (slot_tracker .root == 0 );
5091+ const root_slot0 = slot_tracker .root .load (.monotonic );
5092+ std .debug .assert (root_slot0 == 0 ); // assert initial root value
50945093
50955094 var vote_collector : sig.consensus.vote_listener.VoteCollector =
5096- try .init (.EPOCH_ZERO , slot_tracker . root , & registry );
5095+ try .init (.EPOCH_ZERO , root_slot0 , & registry );
50975096 defer vote_collector .deinit (gpa );
50985097
5099- const root_slot0 = slot_tracker .root ;
51005098 const root_slot0_hash = slot_tracker .getRoot ().state .hash .readCopy ().? ;
5101-
5102- std .debug .assert (root_slot0 == 0 ); // assert initial root value
51035099 std .debug .assert (root_slot0_hash .eql (.ZEROES )); // assert initial root hash
51045100
51055101 // -- slot1 -- //
@@ -6019,7 +6015,7 @@ test "root advances after vote satisfies lockouts" {
60196015 consensus .replay_tower .tower .votes .len ,
60206016 );
60216017
6022- try std .testing .expectEqual (1 , slot_tracker .root );
6018+ try std .testing .expectEqual (1 , slot_tracker .root . load ( .monotonic ) );
60236019 // No longer tracking slot 0
60246020 try std .testing .expect (! slot_tracker .contains (0 ));
60256021 // Still tracking slot 1
@@ -6106,7 +6102,7 @@ test "root advances after vote satisfies lockouts" {
61066102 const last_voted = consensus .replay_tower .tower .lastVotedSlot ();
61076103 try std .testing .expectEqual (33 , last_voted );
61086104
6109- try std .testing .expectEqual (2 , slot_tracker .root );
6105+ try std .testing .expectEqual (2 , slot_tracker .root . load ( .monotonic ) );
61106106 // No longer tracking slot 0
61116107 try std .testing .expect (! slot_tracker .contains (0 ));
61126108 // No longer tracking slot 1
0 commit comments