@@ -57,9 +57,10 @@ blockhashes_recover( fd_blockhashes_t * blockhashes,
5757}
5858
5959void
60- fd_ssload_recover ( fd_snapshot_manifest_t * manifest ,
61- fd_banks_t * banks ,
62- fd_bank_t * bank ) {
60+ fd_ssload_recover ( fd_snapshot_manifest_t * manifest ,
61+ fd_banks_t * banks ,
62+ fd_bank_t * bank ,
63+ fd_vote_state_credits_t * vote_state_credits ) {
6364
6465 /* Slot */
6566
@@ -180,67 +181,28 @@ fd_ssload_recover( fd_snapshot_manifest_t * manifest,
180181 );
181182 }
182183
183- /* Vote states for the current epoch. */
184- fd_vote_states_t * vote_states = fd_vote_states_join ( fd_vote_states_new ( fd_bank_vote_states_locking_modify ( bank ), FD_RUNTIME_MAX_VOTE_ACCOUNTS , 999UL ) );
185- for ( ulong i = 0UL ; i < manifest -> vote_accounts_len ; i ++ ) {
186- fd_snapshot_manifest_vote_account_t const * elem = & manifest -> vote_accounts [ i ];
187- /* First convert the epoch credits to the format expected by the
188- vote states. */
189- ushort epoch_credits_epoch [ EPOCH_CREDITS_MAX ];
190- ulong epoch_credits_credits [ EPOCH_CREDITS_MAX ];
191- ulong epoch_credits_prev_credits [ EPOCH_CREDITS_MAX ];
192- for ( ulong j = 0UL ; j < elem -> epoch_credits_history_len ; j ++ ) {
193- epoch_credits_epoch [ j ] = (ushort )elem -> epoch_credits [ j ].epoch ;
194- epoch_credits_credits [ j ] = elem -> epoch_credits [ j ].credits ;
195- epoch_credits_prev_credits [ j ] = elem -> epoch_credits [ j ].prev_credits ;
196- }
197-
198- fd_vote_states_update (
199- vote_states ,
200- (fd_pubkey_t * )elem -> vote_account_pubkey ,
201- (fd_pubkey_t * )elem -> node_account_pubkey ,
202- elem -> commission ,
203- elem -> last_timestamp ,
204- elem -> last_slot ,
205- elem -> epoch_credits_history_len ,
206- epoch_credits_epoch ,
207- epoch_credits_credits ,
208- epoch_credits_prev_credits );
209- fd_vote_states_update_stake ( vote_states , (fd_pubkey_t * )elem -> vote_account_pubkey , elem -> stake );
210- }
211- fd_bank_vote_states_end_locking_modify ( bank );
212-
213184 /* Vote stakes for the previous epoch (E-1). */
214185 fd_vote_states_t * vote_stakes_prev = fd_vote_states_join ( fd_vote_states_new ( fd_bank_vote_states_prev_locking_modify ( bank ), FD_RUNTIME_MAX_VOTE_ACCOUNTS , 999UL ) );
215186 for ( ulong i = 0UL ; i < manifest -> epoch_stakes [1 ].vote_stakes_len ; i ++ ) {
216187 fd_snapshot_manifest_vote_stakes_t const * elem = & manifest -> epoch_stakes [1 ].vote_stakes [i ];
188+ if ( FD_UNLIKELY ( !elem -> stake ) ) continue ;
217189 /* First convert the epoch credits to the format expected by the
218- vote states. */
219- ushort epoch_credits_epoch [ EPOCH_CREDITS_MAX ];
220- ulong epoch_credits_credits [ EPOCH_CREDITS_MAX ];
221- ulong epoch_credits_prev_credits [ EPOCH_CREDITS_MAX ] ;
190+ vote states. We need to do this because we may need the vote
191+ state credits from the end of the previous epoch in case we need
192+ to recalculate the */
193+ vote_state_credits [ i ]. credits_cnt = elem -> epoch_credits_history_len ;
222194 for ( ulong j = 0UL ; j < elem -> epoch_credits_history_len ; j ++ ) {
223- epoch_credits_epoch [ j ] = (ushort )elem -> epoch_credits [ j ].epoch ;
224- epoch_credits_credits [ j ] = elem -> epoch_credits [ j ].credits ;
225- epoch_credits_prev_credits [ j ] = elem -> epoch_credits [ j ].prev_credits ;
195+ vote_state_credits [ i ]. epoch [ j ] = (ushort )elem -> epoch_credits [ j ].epoch ;
196+ vote_state_credits [ i ]. credits [ j ] = elem -> epoch_credits [ j ].credits ;
197+ vote_state_credits [ i ]. prev_credits [ j ] = elem -> epoch_credits [ j ].prev_credits ;
226198 }
227199
228- fd_vote_states_update (
229- vote_stakes_prev ,
230- (fd_pubkey_t * )elem -> vote ,
231- (fd_pubkey_t * )elem -> identity ,
232- elem -> commission ,
233- elem -> timestamp ,
234- elem -> slot ,
235- elem -> epoch_credits_history_len ,
236- epoch_credits_epoch ,
237- epoch_credits_credits ,
238- epoch_credits_prev_credits );
239- if ( elem -> stake ) {
240- fd_vote_states_update_stake ( vote_stakes_prev , (fd_pubkey_t * )elem -> vote , elem -> stake );
241- } else {
242- fd_vote_states_remove ( vote_stakes_prev , (fd_pubkey_t * )elem -> vote );
243- }
200+ fd_vote_state_ele_t * vote_state = fd_vote_states_update ( vote_stakes_prev , (fd_pubkey_t * )elem -> vote );
201+ vote_state -> node_account = * (fd_pubkey_t * )elem -> identity ;
202+ vote_state -> commission = elem -> commission ;
203+ vote_state -> last_vote_timestamp = elem -> timestamp ;
204+ vote_state -> last_vote_slot = elem -> slot ;
205+ vote_state -> stake = elem -> stake ;
244206 }
245207
246208 fd_bank_vote_states_prev_end_locking_modify ( bank );
@@ -273,33 +235,36 @@ fd_ssload_recover( fd_snapshot_manifest_t * manifest,
273235 fd_vote_states_t * vote_stakes_prev_prev = fd_vote_states_join ( fd_vote_states_new ( fd_bank_vote_states_prev_prev_locking_modify ( bank ), FD_RUNTIME_MAX_VOTE_ACCOUNTS , 999UL ) );
274236 for ( ulong i = 0UL ; i < manifest -> epoch_stakes [0 ].vote_stakes_len ; i ++ ) {
275237 fd_snapshot_manifest_vote_stakes_t const * elem = & manifest -> epoch_stakes [0 ].vote_stakes [i ];
276- /* First convert the epoch credits to the format expected by the
277- vote states. */
278- ushort epoch_credits_epoch [ EPOCH_CREDITS_MAX ] ;
279- ulong epoch_credits_credits [ EPOCH_CREDITS_MAX ] ;
280- ulong epoch_credits_prev_credits [ EPOCH_CREDITS_MAX ] ;
281- for ( ulong j = 0UL ; j < elem -> epoch_credits_history_len ; j ++ ) {
282- epoch_credits_epoch [ j ] = ( ushort ) elem -> epoch_credits [ j ]. epoch ;
283- epoch_credits_credits [ j ] = elem -> epoch_credits [ j ]. credits ;
284- epoch_credits_prev_credits [ j ] = elem -> epoch_credits [ j ]. prev_credits ;
285- }
286- fd_vote_states_update (
287- vote_stakes_prev_prev ,
288- ( fd_pubkey_t * ) elem -> vote ,
289- ( fd_pubkey_t * ) elem -> identity ,
290- elem -> commission ,
291- elem -> timestamp ,
292- elem -> slot ,
293- elem -> epoch_credits_history_len ,
294- epoch_credits_epoch ,
295- epoch_credits_credits ,
296- epoch_credits_prev_credits ) ;
297- if ( elem -> stake ) {
298- fd_vote_states_update_stake ( vote_stakes_prev_prev , ( fd_pubkey_t * ) elem -> vote , elem -> stake ) ;
299- } else {
300- fd_vote_states_remove ( vote_stakes_prev_prev , ( fd_pubkey_t * ) elem -> vote ) ;
301- }
238+ if ( FD_UNLIKELY ( ! elem -> stake ) ) continue ;
239+ fd_vote_state_ele_t * vote_state = fd_vote_states_update ( vote_stakes_prev_prev , ( fd_pubkey_t * ) elem -> vote );
240+ vote_state -> node_account = * ( fd_pubkey_t * ) elem -> identity ;
241+ vote_state -> commission = elem -> commission ;
242+ vote_state -> last_vote_timestamp = elem -> timestamp ;
243+ vote_state -> last_vote_slot = elem -> slot ;
244+ vote_state -> stake = elem -> stake ;
245+ vote_state -> stake = elem -> stake ;
246+ }
247+
248+ /* Vote states for the current epoch. */
249+ fd_vote_states_t * vote_states = fd_vote_states_join ( fd_vote_states_new ( fd_bank_vote_states_locking_modify ( bank ), FD_RUNTIME_MAX_VOTE_ACCOUNTS , 999UL ) );
250+ for ( ulong i = 0UL ; i < manifest -> vote_accounts_len ; i ++ ) {
251+ fd_snapshot_manifest_vote_account_t const * elem = & manifest -> vote_accounts [ i ];
252+
253+ fd_vote_state_ele_t * vote_state_prev_prev = fd_vote_states_query ( vote_stakes_prev_prev , ( fd_pubkey_t * ) elem -> vote_account_pubkey );
254+ ulong prev_prev_stake = vote_state_prev_prev ? vote_state_prev_prev -> stake : 0UL ;
255+
256+ fd_vote_state_ele_t * vote_state = fd_vote_states_update ( vote_states , ( fd_pubkey_t * ) elem -> vote_account_pubkey );
257+
258+ vote_state -> node_account = * ( fd_pubkey_t * ) elem -> node_account_pubkey ;
259+ vote_state -> commission = elem -> commission ;
260+ vote_state -> last_vote_timestamp = elem -> last_timestamp ;
261+ vote_state -> last_vote_slot = elem -> last_slot ;
262+ vote_state -> stake = elem -> stake ;
263+ vote_state -> stake_t_2 = prev_prev_stake ;
302264 }
265+ fd_bank_vote_states_end_locking_modify ( bank );
266+
303267 fd_bank_vote_states_prev_prev_end_locking_modify ( bank );
268+
304269 bank -> txncache_fork_id = (fd_txncache_fork_id_t ){ .val = manifest -> txncache_fork_id };
305270}
0 commit comments