Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 7b365c5

Browse files
committed
runtime: remove inactive delegation from stakes cache
1 parent 476124d commit 7b365c5

File tree

3 files changed

+50
-30
lines changed

3 files changed

+50
-30
lines changed

runtime/src/bank.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4449,6 +4449,7 @@ impl Bank {
44494449
pubkey,
44504450
account,
44514451
self.check_init_vote_data_enabled(),
4452+
self.stakes_remove_delegation_if_inactive_enabled(),
44524453
);
44534454
}
44544455
}
@@ -5170,6 +5171,7 @@ impl Bank {
51705171
pubkey,
51715172
account,
51725173
self.check_init_vote_data_enabled(),
5174+
self.stakes_remove_delegation_if_inactive_enabled(),
51735175
) {
51745176
// TODO: one of the indices is redundant.
51755177
overwritten_vote_accounts.push(OverwrittenVoteAccount {
@@ -5412,6 +5414,11 @@ impl Bank {
54125414
.is_active(&feature_set::demote_program_write_locks::id())
54135415
}
54145416

5417+
pub fn stakes_remove_delegation_if_inactive_enabled(&self) -> bool {
5418+
self.feature_set
5419+
.is_active(&feature_set::stakes_remove_delegation_if_inactive::id())
5420+
}
5421+
54155422
// Check if the wallclock time from bank creation to now has exceeded the allotted
54165423
// time for transaction processing
54175424
pub fn should_bank_still_be_processing_txs(

runtime/src/stakes.rs

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ impl Stakes {
123123
pubkey: &Pubkey,
124124
account: &AccountSharedData,
125125
check_vote_init: bool,
126+
remove_delegation_on_inactive: bool,
126127
) -> Option<VoteAccount> {
127128
if solana_vote_program::check_id(account.owner()) {
128129
// unconditionally remove existing at first; there is no dependent calculated state for
@@ -178,7 +179,13 @@ impl Stakes {
178179
}
179180
}
180181

181-
if account.lamports() == 0 {
182+
let remove_delegation = if remove_delegation_on_inactive {
183+
delegation.is_none()
184+
} else {
185+
account.lamports() == 0
186+
};
187+
188+
if remove_delegation {
182189
// when account is removed (lamports == 0), remove it from Stakes as well
183190
// so that given `pubkey` can be used for any owner in the future, while not
184191
// affecting Stakes.
@@ -297,8 +304,8 @@ pub mod tests {
297304
let ((vote_pubkey, vote_account), (stake_pubkey, mut stake_account)) =
298305
create_staked_node_accounts(10);
299306

300-
stakes.store(&vote_pubkey, &vote_account, true);
301-
stakes.store(&stake_pubkey, &stake_account, true);
307+
stakes.store(&vote_pubkey, &vote_account, true, true);
308+
stakes.store(&stake_pubkey, &stake_account, true, true);
302309
let stake = stake_state::stake_from(&stake_account).unwrap();
303310
{
304311
let vote_accounts = stakes.vote_accounts();
@@ -310,7 +317,7 @@ pub mod tests {
310317
}
311318

312319
stake_account.set_lamports(42);
313-
stakes.store(&stake_pubkey, &stake_account, true);
320+
stakes.store(&stake_pubkey, &stake_account, true, true);
314321
{
315322
let vote_accounts = stakes.vote_accounts();
316323
assert!(vote_accounts.get(&vote_pubkey).is_some());
@@ -322,7 +329,7 @@ pub mod tests {
322329

323330
// activate more
324331
let (_stake_pubkey, mut stake_account) = create_stake_account(42, &vote_pubkey);
325-
stakes.store(&stake_pubkey, &stake_account, true);
332+
stakes.store(&stake_pubkey, &stake_account, true, true);
326333
let stake = stake_state::stake_from(&stake_account).unwrap();
327334
{
328335
let vote_accounts = stakes.vote_accounts();
@@ -334,7 +341,7 @@ pub mod tests {
334341
}
335342

336343
stake_account.set_lamports(0);
337-
stakes.store(&stake_pubkey, &stake_account, true);
344+
stakes.store(&stake_pubkey, &stake_account, true, true);
338345
{
339346
let vote_accounts = stakes.vote_accounts();
340347
assert!(vote_accounts.get(&vote_pubkey).is_some());
@@ -352,14 +359,14 @@ pub mod tests {
352359
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
353360
create_staked_node_accounts(10);
354361

355-
stakes.store(&vote_pubkey, &vote_account, true);
356-
stakes.store(&stake_pubkey, &stake_account, true);
362+
stakes.store(&vote_pubkey, &vote_account, true, true);
363+
stakes.store(&stake_pubkey, &stake_account, true, true);
357364

358365
let ((vote11_pubkey, vote11_account), (stake11_pubkey, stake11_account)) =
359366
create_staked_node_accounts(20);
360367

361-
stakes.store(&vote11_pubkey, &vote11_account, true);
362-
stakes.store(&stake11_pubkey, &stake11_account, true);
368+
stakes.store(&vote11_pubkey, &vote11_account, true, true);
369+
stakes.store(&stake11_pubkey, &stake11_account, true, true);
363370

364371
let vote11_node_pubkey = VoteState::from(&vote11_account).unwrap().node_pubkey;
365372

@@ -376,8 +383,8 @@ pub mod tests {
376383
let ((vote_pubkey, mut vote_account), (stake_pubkey, stake_account)) =
377384
create_staked_node_accounts(10);
378385

379-
stakes.store(&vote_pubkey, &vote_account, true);
380-
stakes.store(&stake_pubkey, &stake_account, true);
386+
stakes.store(&vote_pubkey, &vote_account, true, true);
387+
stakes.store(&stake_pubkey, &stake_account, true, true);
381388

382389
{
383390
let vote_accounts = stakes.vote_accounts();
@@ -386,15 +393,15 @@ pub mod tests {
386393
}
387394

388395
vote_account.set_lamports(0);
389-
stakes.store(&vote_pubkey, &vote_account, true);
396+
stakes.store(&vote_pubkey, &vote_account, true, true);
390397

391398
{
392399
let vote_accounts = stakes.vote_accounts();
393400
assert!(vote_accounts.get(&vote_pubkey).is_none());
394401
}
395402

396403
vote_account.set_lamports(1);
397-
stakes.store(&vote_pubkey, &vote_account, true);
404+
stakes.store(&vote_pubkey, &vote_account, true, true);
398405

399406
{
400407
let vote_accounts = stakes.vote_accounts();
@@ -407,7 +414,7 @@ pub mod tests {
407414
let mut pushed = vote_account.data().to_vec();
408415
pushed.push(0);
409416
vote_account.set_data(pushed);
410-
stakes.store(&vote_pubkey, &vote_account, true);
417+
stakes.store(&vote_pubkey, &vote_account, true, true);
411418

412419
{
413420
let vote_accounts = stakes.vote_accounts();
@@ -418,15 +425,15 @@ pub mod tests {
418425
let default_vote_state = VoteState::default();
419426
let versioned = VoteStateVersions::new_current(default_vote_state);
420427
VoteState::to(&versioned, &mut vote_account).unwrap();
421-
stakes.store(&vote_pubkey, &vote_account, true);
428+
stakes.store(&vote_pubkey, &vote_account, true, true);
422429

423430
{
424431
let vote_accounts = stakes.vote_accounts();
425432
assert!(vote_accounts.get(&vote_pubkey).is_none());
426433
}
427434

428435
vote_account.set_data(cache_data);
429-
stakes.store(&vote_pubkey, &vote_account, true);
436+
stakes.store(&vote_pubkey, &vote_account, true, true);
430437

431438
{
432439
let vote_accounts = stakes.vote_accounts();
@@ -448,11 +455,11 @@ pub mod tests {
448455
let ((vote_pubkey2, vote_account2), (_stake_pubkey2, stake_account2)) =
449456
create_staked_node_accounts(10);
450457

451-
stakes.store(&vote_pubkey, &vote_account, true);
452-
stakes.store(&vote_pubkey2, &vote_account2, true);
458+
stakes.store(&vote_pubkey, &vote_account, true, true);
459+
stakes.store(&vote_pubkey2, &vote_account2, true, true);
453460

454461
// delegates to vote_pubkey
455-
stakes.store(&stake_pubkey, &stake_account, true);
462+
stakes.store(&stake_pubkey, &stake_account, true, true);
456463

457464
let stake = stake_state::stake_from(&stake_account).unwrap();
458465

@@ -468,7 +475,7 @@ pub mod tests {
468475
}
469476

470477
// delegates to vote_pubkey2
471-
stakes.store(&stake_pubkey, &stake_account2, true);
478+
stakes.store(&stake_pubkey, &stake_account2, true, true);
472479

473480
{
474481
let vote_accounts = stakes.vote_accounts();
@@ -493,11 +500,11 @@ pub mod tests {
493500

494501
let (stake_pubkey2, stake_account2) = create_stake_account(10, &vote_pubkey);
495502

496-
stakes.store(&vote_pubkey, &vote_account, true);
503+
stakes.store(&vote_pubkey, &vote_account, true, true);
497504

498505
// delegates to vote_pubkey
499-
stakes.store(&stake_pubkey, &stake_account, true);
500-
stakes.store(&stake_pubkey2, &stake_account2, true);
506+
stakes.store(&stake_pubkey, &stake_account, true, true);
507+
stakes.store(&stake_pubkey2, &stake_account2, true, true);
501508

502509
{
503510
let vote_accounts = stakes.vote_accounts();
@@ -512,8 +519,8 @@ pub mod tests {
512519
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
513520
create_staked_node_accounts(10);
514521

515-
stakes.store(&vote_pubkey, &vote_account, true);
516-
stakes.store(&stake_pubkey, &stake_account, true);
522+
stakes.store(&vote_pubkey, &vote_account, true, true);
523+
stakes.store(&stake_pubkey, &stake_account, true, true);
517524
let stake = stake_state::stake_from(&stake_account).unwrap();
518525

519526
{
@@ -543,8 +550,8 @@ pub mod tests {
543550
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
544551
create_staked_node_accounts(10);
545552

546-
stakes.store(&vote_pubkey, &vote_account, true);
547-
stakes.store(&stake_pubkey, &stake_account, true);
553+
stakes.store(&vote_pubkey, &vote_account, true, true);
554+
stakes.store(&stake_pubkey, &stake_account, true, true);
548555

549556
{
550557
let vote_accounts = stakes.vote_accounts();
@@ -557,6 +564,7 @@ pub mod tests {
557564
&stake_pubkey,
558565
&AccountSharedData::new(1, 0, &stake::program::id()),
559566
true,
567+
true,
560568
);
561569
{
562570
let vote_accounts = stakes.vote_accounts();
@@ -586,8 +594,8 @@ pub mod tests {
586594
let genesis_epoch = 0;
587595
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
588596
create_warming_staked_node_accounts(10, genesis_epoch);
589-
stakes.store(&vote_pubkey, &vote_account, true);
590-
stakes.store(&stake_pubkey, &stake_account, true);
597+
stakes.store(&vote_pubkey, &vote_account, true, true);
598+
stakes.store(&stake_pubkey, &stake_account, true, true);
591599

592600
assert_eq!(stakes.vote_balance_and_staked(), 11);
593601
assert_eq!(stakes.vote_balance_and_warmed_staked(), 1);

sdk/src/feature_set.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,10 @@ pub mod sol_log_data_syscall_enabled {
215215
solana_sdk::declare_id!("HYPs7jyJ3KwQFdDpuSzMtVKf1MLJDaZRv3CSWvfUqdFo");
216216
}
217217

218+
pub mod stakes_remove_delegation_if_inactive {
219+
solana_sdk::declare_id!("HFpdDDNQjvcXnXKec697HDDsyk6tFoWS2o8fkxuhQZpL");
220+
}
221+
218222
lazy_static! {
219223
/// Map of feature identifiers to user-visible description
220224
pub static ref FEATURE_NAMES: HashMap<Pubkey, &'static str> = [
@@ -264,6 +268,7 @@ lazy_static! {
264268
(fix_write_privs::id(), "fix native invoke write privileges"),
265269
(reduce_required_deploy_balance::id(), "reduce required payer balance for program deploys"),
266270
(sol_log_data_syscall_enabled::id(), "enable sol_log_data syscall"),
271+
(stakes_remove_delegation_if_inactive::id(), "remove delegations from stakes cache when inactive"),
267272
/*************** ADD NEW FEATURES HERE ***************/
268273
]
269274
.iter()

0 commit comments

Comments
 (0)