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

Commit 572c0af

Browse files
committed
runtime: remove inactive delegation from stakes cache
1 parent 0a3bf17 commit 572c0af

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
@@ -4061,6 +4061,7 @@ impl Bank {
40614061
account,
40624062
self.stake_program_v2_enabled(),
40634063
self.check_init_vote_data_enabled(),
4064+
self.stakes_remove_delegation_if_inactive_enabled(),
40644065
);
40654066
}
40664067
}
@@ -4640,6 +4641,7 @@ impl Bank {
46404641
account,
46414642
self.stake_program_v2_enabled(),
46424643
self.check_init_vote_data_enabled(),
4644+
self.stakes_remove_delegation_if_inactive_enabled(),
46434645
) {
46444646
// TODO: one of the indices is redundant.
46454647
overwritten_vote_accounts.push(OverwrittenVoteAccount {
@@ -4881,6 +4883,11 @@ impl Bank {
48814883
.is_active(&feature_set::merge_nonce_error_into_system_error::id())
48824884
}
48834885

4886+
pub fn stakes_remove_delegation_if_inactive_enabled(&self) -> bool {
4887+
self.feature_set
4888+
.is_active(&feature_set::stakes_remove_delegation_if_inactive::id())
4889+
}
4890+
48844891
// Check if the wallclock time from bank creation to now has exceeded the allotted
48854892
// time for transaction processing
48864893
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
@@ -121,6 +121,7 @@ impl Stakes {
121121
account: &AccountSharedData,
122122
fix_stake_deactivate: bool,
123123
check_vote_init: bool,
124+
remove_delegation_on_inactive: bool,
124125
) -> Option<ArcVoteAccount> {
125126
if solana_vote_program::check_id(&account.owner) {
126127
// unconditionally remove existing at first; there is no dependent calculated state for
@@ -187,7 +188,13 @@ impl Stakes {
187188
}
188189
}
189190

190-
if account.lamports == 0 {
191+
let remove_delegation = if remove_delegation_on_inactive {
192+
delegation.is_none()
193+
} else {
194+
account.lamports == 0
195+
};
196+
197+
if remove_delegation {
191198
// when account is removed (lamports == 0), remove it from Stakes as well
192199
// so that given `pubkey` can be used for any owner in the future, while not
193200
// affecting Stakes.
@@ -306,8 +313,8 @@ pub mod tests {
306313
let ((vote_pubkey, vote_account), (stake_pubkey, mut stake_account)) =
307314
create_staked_node_accounts(10);
308315

309-
stakes.store(&vote_pubkey, &vote_account, true, true);
310-
stakes.store(&stake_pubkey, &stake_account, true, true);
316+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
317+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
311318
let stake = StakeState::stake_from(&stake_account).unwrap();
312319
{
313320
let vote_accounts = stakes.vote_accounts();
@@ -319,7 +326,7 @@ pub mod tests {
319326
}
320327

321328
stake_account.lamports = 42;
322-
stakes.store(&stake_pubkey, &stake_account, true, true);
329+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
323330
{
324331
let vote_accounts = stakes.vote_accounts();
325332
assert!(vote_accounts.get(&vote_pubkey).is_some());
@@ -331,7 +338,7 @@ pub mod tests {
331338

332339
// activate more
333340
let (_stake_pubkey, mut stake_account) = create_stake_account(42, &vote_pubkey);
334-
stakes.store(&stake_pubkey, &stake_account, true, true);
341+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
335342
let stake = StakeState::stake_from(&stake_account).unwrap();
336343
{
337344
let vote_accounts = stakes.vote_accounts();
@@ -343,7 +350,7 @@ pub mod tests {
343350
}
344351

345352
stake_account.lamports = 0;
346-
stakes.store(&stake_pubkey, &stake_account, true, true);
353+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
347354
{
348355
let vote_accounts = stakes.vote_accounts();
349356
assert!(vote_accounts.get(&vote_pubkey).is_some());
@@ -361,14 +368,14 @@ pub mod tests {
361368
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
362369
create_staked_node_accounts(10);
363370

364-
stakes.store(&vote_pubkey, &vote_account, true, true);
365-
stakes.store(&stake_pubkey, &stake_account, true, true);
371+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
372+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
366373

367374
let ((vote11_pubkey, vote11_account), (stake11_pubkey, stake11_account)) =
368375
create_staked_node_accounts(20);
369376

370-
stakes.store(&vote11_pubkey, &vote11_account, true, true);
371-
stakes.store(&stake11_pubkey, &stake11_account, true, true);
377+
stakes.store(&vote11_pubkey, &vote11_account, true, true, true);
378+
stakes.store(&stake11_pubkey, &stake11_account, true, true, true);
372379

373380
let vote11_node_pubkey = VoteState::from(&vote11_account).unwrap().node_pubkey;
374381

@@ -385,8 +392,8 @@ pub mod tests {
385392
let ((vote_pubkey, mut vote_account), (stake_pubkey, stake_account)) =
386393
create_staked_node_accounts(10);
387394

388-
stakes.store(&vote_pubkey, &vote_account, true, true);
389-
stakes.store(&stake_pubkey, &stake_account, true, true);
395+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
396+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
390397

391398
{
392399
let vote_accounts = stakes.vote_accounts();
@@ -395,15 +402,15 @@ pub mod tests {
395402
}
396403

397404
vote_account.lamports = 0;
398-
stakes.store(&vote_pubkey, &vote_account, true, true);
405+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
399406

400407
{
401408
let vote_accounts = stakes.vote_accounts();
402409
assert!(vote_accounts.get(&vote_pubkey).is_none());
403410
}
404411

405412
vote_account.lamports = 1;
406-
stakes.store(&vote_pubkey, &vote_account, true, true);
413+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
407414

408415
{
409416
let vote_accounts = stakes.vote_accounts();
@@ -414,7 +421,7 @@ pub mod tests {
414421
// Vote account too big
415422
let cache_data = vote_account.data().to_vec();
416423
vote_account.data.push(0);
417-
stakes.store(&vote_pubkey, &vote_account, true, true);
424+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
418425

419426
{
420427
let vote_accounts = stakes.vote_accounts();
@@ -425,15 +432,15 @@ pub mod tests {
425432
let default_vote_state = VoteState::default();
426433
let versioned = VoteStateVersions::new_current(default_vote_state);
427434
VoteState::to(&versioned, &mut vote_account).unwrap();
428-
stakes.store(&vote_pubkey, &vote_account, true, true);
435+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
429436

430437
{
431438
let vote_accounts = stakes.vote_accounts();
432439
assert!(vote_accounts.get(&vote_pubkey).is_none());
433440
}
434441

435442
vote_account.set_data(cache_data);
436-
stakes.store(&vote_pubkey, &vote_account, true, true);
443+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
437444

438445
{
439446
let vote_accounts = stakes.vote_accounts();
@@ -455,11 +462,11 @@ pub mod tests {
455462
let ((vote_pubkey2, vote_account2), (_stake_pubkey2, stake_account2)) =
456463
create_staked_node_accounts(10);
457464

458-
stakes.store(&vote_pubkey, &vote_account, true, true);
459-
stakes.store(&vote_pubkey2, &vote_account2, true, true);
465+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
466+
stakes.store(&vote_pubkey2, &vote_account2, true, true, true);
460467

461468
// delegates to vote_pubkey
462-
stakes.store(&stake_pubkey, &stake_account, true, true);
469+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
463470

464471
let stake = StakeState::stake_from(&stake_account).unwrap();
465472

@@ -475,7 +482,7 @@ pub mod tests {
475482
}
476483

477484
// delegates to vote_pubkey2
478-
stakes.store(&stake_pubkey, &stake_account2, true, true);
485+
stakes.store(&stake_pubkey, &stake_account2, true, true, true);
479486

480487
{
481488
let vote_accounts = stakes.vote_accounts();
@@ -500,11 +507,11 @@ pub mod tests {
500507

501508
let (stake_pubkey2, stake_account2) = create_stake_account(10, &vote_pubkey);
502509

503-
stakes.store(&vote_pubkey, &vote_account, true, true);
510+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
504511

505512
// delegates to vote_pubkey
506-
stakes.store(&stake_pubkey, &stake_account, true, true);
507-
stakes.store(&stake_pubkey2, &stake_account2, true, true);
513+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
514+
stakes.store(&stake_pubkey2, &stake_account2, true, true, true);
508515

509516
{
510517
let vote_accounts = stakes.vote_accounts();
@@ -519,8 +526,8 @@ pub mod tests {
519526
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
520527
create_staked_node_accounts(10);
521528

522-
stakes.store(&vote_pubkey, &vote_account, true, true);
523-
stakes.store(&stake_pubkey, &stake_account, true, true);
529+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
530+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
524531
let stake = StakeState::stake_from(&stake_account).unwrap();
525532

526533
{
@@ -550,8 +557,8 @@ pub mod tests {
550557
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
551558
create_staked_node_accounts(10);
552559

553-
stakes.store(&vote_pubkey, &vote_account, true, true);
554-
stakes.store(&stake_pubkey, &stake_account, true, true);
560+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
561+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
555562

556563
{
557564
let vote_accounts = stakes.vote_accounts();
@@ -565,6 +572,7 @@ pub mod tests {
565572
&AccountSharedData::new(1, 0, &solana_stake_program::id()),
566573
true,
567574
true,
575+
true,
568576
);
569577
{
570578
let vote_accounts = stakes.vote_accounts();
@@ -594,8 +602,8 @@ pub mod tests {
594602
let genesis_epoch = 0;
595603
let ((vote_pubkey, vote_account), (stake_pubkey, stake_account)) =
596604
create_warming_staked_node_accounts(10, genesis_epoch);
597-
stakes.store(&vote_pubkey, &vote_account, true, true);
598-
stakes.store(&stake_pubkey, &stake_account, true, true);
605+
stakes.store(&vote_pubkey, &vote_account, true, true, true);
606+
stakes.store(&stake_pubkey, &stake_account, true, true, true);
599607

600608
assert_eq!(stakes.vote_balance_and_staked(), 11);
601609
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
@@ -170,6 +170,10 @@ pub mod demote_program_write_locks {
170170
solana_sdk::declare_id!("3E3jV7v9VcdJL8iYZUMax9DiDno8j7EWUVbhm9RtShj2");
171171
}
172172

173+
pub mod stakes_remove_delegation_if_inactive {
174+
solana_sdk::declare_id!("HFpdDDNQjvcXnXKec697HDDsyk6tFoWS2o8fkxuhQZpL");
175+
}
176+
173177
lazy_static! {
174178
/// Map of feature identifiers to user-visible description
175179
pub static ref FEATURE_NAMES: HashMap<Pubkey, &'static str> = [
@@ -211,6 +215,7 @@ lazy_static! {
211215
(merge_nonce_error_into_system_error::id(), "merge NonceError into SystemError"),
212216
(spl_token_v2_set_authority_fix::id(), "spl-token set_authority fix"),
213217
(demote_program_write_locks::id(), "demote program write locks to readonly #19593"),
218+
(stakes_remove_delegation_if_inactive::id(), "remove delegations from stakes cache when inactive"),
214219
/*************** ADD NEW FEATURES HERE ***************/
215220
]
216221
.iter()

0 commit comments

Comments
 (0)