Skip to content

Commit 239f913

Browse files
runtime: rework vote states for performance
1 parent 2ceb327 commit 239f913

File tree

18 files changed

+411
-403
lines changed

18 files changed

+411
-403
lines changed

src/disco/gui/fd_gui_tile.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,8 @@ after_frag( fd_gui_ctx_t * ctx,
309309
ctx->peers->votes[ vote_count ].last_vote_slot = vote_state->last_vote_slot;
310310
ctx->peers->votes[ vote_count ].last_vote_timestamp = vote_state->last_vote_timestamp;
311311
ctx->peers->votes[ vote_count ].commission = vote_state->commission;
312-
ctx->peers->votes[ vote_count ].epoch = fd_ulong_if( !vote_state->credits_cnt, ULONG_MAX, vote_state->epoch[ 0 ] );
313-
ctx->peers->votes[ vote_count ].epoch_credits = fd_ulong_if( !vote_state->credits_cnt, ULONG_MAX, vote_state->credits[ 0 ] );
312+
// ctx->peers->votes[ vote_count ].epoch = fd_ulong_if( !vote_state->credits_cnt, ULONG_MAX, vote_state->epoch[ 0 ] );
313+
// ctx->peers->votes[ vote_count ].epoch_credits = fd_ulong_if( !vote_state->credits_cnt, ULONG_MAX, vote_state->credits[ 0 ] );
314314

315315
vote_count++;
316316
}

src/discof/replay/fd_replay_tile.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,11 @@ struct fd_replay_tile {
382382
} metrics;
383383

384384
uchar __attribute__((aligned(FD_MULTI_EPOCH_LEADERS_ALIGN))) mleaders_mem[ FD_MULTI_EPOCH_LEADERS_FOOTPRINT ];
385+
386+
/* Vote state credits as of the end of the previous epoch. This only
387+
used at boot to recalculate partitioned epoch rewards if needed and
388+
is not updated after. */
389+
fd_vote_state_credits_t vote_state_credits[ FD_RUNTIME_MAX_VOTE_ACCOUNTS ];
385390
};
386391

387392
typedef struct fd_replay_tile fd_replay_tile_t;
@@ -1125,7 +1130,7 @@ init_after_snapshot( fd_replay_tile_t * ctx ) {
11251130
/* After both snapshots have been loaded in, we can determine if we should
11261131
start distributing rewards. */
11271132

1128-
fd_rewards_recalculate_partitioned_rewards( ctx->banks, bank, ctx->funk, &xid, ctx->capture_ctx );
1133+
fd_rewards_recalculate_partitioned_rewards( ctx->banks, bank, ctx->funk, &xid, ctx->vote_state_credits, ctx->capture_ctx );
11291134

11301135
ulong snapshot_slot = fd_bank_slot_get( bank );
11311136
if( FD_UNLIKELY( !snapshot_slot ) ) {
@@ -1458,7 +1463,6 @@ on_snapshot_message( fd_replay_tile_t * ctx,
14581463
fd_sched_block_add_done( ctx->sched, bank->idx, ULONG_MAX );
14591464
FD_TEST( bank->idx==0UL );
14601465

1461-
14621466
fd_funk_txn_xid_t xid = { .ul = { snapshot_slot, FD_REPLAY_BOOT_BANK_IDX } };
14631467

14641468
fd_features_restore( bank, ctx->funk, &xid );
@@ -1493,7 +1497,10 @@ on_snapshot_message( fd_replay_tile_t * ctx,
14931497
if( FD_UNLIKELY( chunk<ctx->in[ in_idx ].chunk0 || chunk>ctx->in[ in_idx ].wmark ) )
14941498
FD_LOG_ERR(( "chunk %lu from in %d corrupt, not in range [%lu,%lu]", chunk, ctx->in_kind[ in_idx ], ctx->in[ in_idx ].chunk0, ctx->in[ in_idx ].wmark ));
14951499

1496-
fd_ssload_recover( fd_chunk_to_laddr( ctx->in[ in_idx ].mem, chunk ), ctx->banks, fd_banks_bank_query( ctx->banks, FD_REPLAY_BOOT_BANK_IDX ) );
1500+
fd_ssload_recover( fd_chunk_to_laddr( ctx->in[ in_idx ].mem, chunk ),
1501+
ctx->banks,
1502+
fd_banks_bank_query( ctx->banks, FD_REPLAY_BOOT_BANK_IDX ),
1503+
ctx->vote_state_credits );
14971504
break;
14981505
}
14991506
default: {

src/discof/restore/utils/fd_ssload.c

Lines changed: 47 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ blockhashes_recover( fd_blockhashes_t * blockhashes,
5757
}
5858

5959
void
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
}

src/discof/restore/utils/fd_ssload.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ blockhashes_recover( fd_blockhashes_t * blockhashes,
1313
ulong seed );
1414

1515
void
16-
fd_ssload_recover( fd_snapshot_manifest_t * manifest,
17-
fd_banks_t * banks,
18-
fd_bank_t * bank );
16+
fd_ssload_recover( fd_snapshot_manifest_t * manifest,
17+
fd_banks_t * banks,
18+
fd_bank_t * bank,
19+
fd_vote_state_credits_t * vote_state_credits );
1920

2021
FD_PROTOTYPES_END
2122

0 commit comments

Comments
 (0)