Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport #4089 renewals fix for pallet-broker #4194

Merged
merged 1 commit into from
Jun 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions prdoc/pr_4089.prdoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
title: "pallet_broker: Support renewing leases expired in a previous period"

doc:
- audience: Runtime User
description: |
Allow renewals of leases that ended before `start_sales` or in the first period after calling `start_sales`.
This ensures that everyone has a smooth experience when migrating to coretime and the timing of
`start_sales` isn't that important.

crates:
- name: pallet-broker
1 change: 1 addition & 0 deletions substrate/frame/broker/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ frame-system = { path = "../system", default-features = false }

[dev-dependencies]
sp-io = { path = "../../primitives/io" }
pretty_assertions = "1.3.0"

[features]
default = ["std"]
Expand Down
11 changes: 10 additions & 1 deletion substrate/frame/broker/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use frame_support::{
};
use frame_system::{EnsureRoot, EnsureSignedBy};
use sp_arithmetic::Perbill;
use sp_core::{ConstU32, ConstU64};
use sp_core::{ConstU32, ConstU64, Get};
use sp_runtime::{
traits::{BlockNumberProvider, Identity},
BuildStorage, Saturating,
Expand Down Expand Up @@ -210,6 +210,15 @@ pub fn advance_to(b: u64) {
}
}

pub fn advance_sale_period() {
let sale = SaleInfo::<Test>::get().unwrap();

let target_block_number =
sale.region_begin as u64 * <<Test as crate::Config>::TimeslicePeriod as Get<u64>>::get();

advance_to(target_block_number)
}

pub fn pot() -> u64 {
balance(Broker::account_id())
}
Expand Down
139 changes: 139 additions & 0 deletions substrate/frame/broker/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ use frame_support::{
BoundedVec,
};
use frame_system::RawOrigin::Root;
use pretty_assertions::assert_eq;
use sp_runtime::{traits::Get, TokenError};
use CoreAssignment::*;
use CoretimeTraceItem::*;
Expand Down Expand Up @@ -1064,3 +1065,141 @@ fn config_works() {
assert_noop!(Broker::configure(Root.into(), cfg), Error::<Test>::InvalidConfig);
});
}

/// Ensure that a lease that ended before `start_sales` was called can be renewed.
#[test]
fn renewal_works_leases_ended_before_start_sales() {
TestExt::new().endow(1, 1000).execute_with(|| {
let config = Configuration::<Test>::get().unwrap();

// This lease is ended before `start_stales` was called.
assert_ok!(Broker::do_set_lease(1, 1));

// Go to some block to ensure that the lease of task 1 already ended.
advance_to(5);

// This lease will end three sale periods in.
assert_ok!(Broker::do_set_lease(
2,
Broker::latest_timeslice_ready_to_commit(&config) + config.region_length * 3
));

// This intializes the first sale and the period 0.
assert_ok!(Broker::do_start_sales(100, 2));
assert_noop!(Broker::do_renew(1, 1), Error::<Test>::Unavailable);
assert_noop!(Broker::do_renew(1, 0), Error::<Test>::Unavailable);

// Lease for task 1 should have been dropped.
assert!(Leases::<Test>::get().iter().any(|l| l.task == 2));

// This intializes the second and the period 1.
advance_sale_period();

// Now we can finally renew the core 0 of task 1.
let new_core = Broker::do_renew(1, 0).unwrap();
// Renewing the active lease doesn't work.
assert_noop!(Broker::do_renew(1, 1), Error::<Test>::SoldOut);
assert_eq!(balance(1), 900);

// This intializes the third sale and the period 2.
advance_sale_period();
let new_core = Broker::do_renew(1, new_core).unwrap();

// Renewing the active lease doesn't work.
assert_noop!(Broker::do_renew(1, 0), Error::<Test>::SoldOut);
assert_eq!(balance(1), 800);

// All leases should have ended
assert!(Leases::<Test>::get().is_empty());

// This intializes the fourth sale and the period 3.
advance_sale_period();

// Renew again
assert_eq!(0, Broker::do_renew(1, new_core).unwrap());
// Renew the task 2.
assert_eq!(1, Broker::do_renew(1, 0).unwrap());
assert_eq!(balance(1), 600);

// This intializes the fifth sale and the period 4.
advance_sale_period();

assert_eq!(
CoretimeTrace::get(),
vec![
(
10,
AssignCore {
core: 0,
begin: 12,
assignment: vec![(Task(1), 57600)],
end_hint: None
}
),
(
10,
AssignCore {
core: 1,
begin: 12,
assignment: vec![(Task(2), 57600)],
end_hint: None
}
),
(
16,
AssignCore {
core: 0,
begin: 18,
assignment: vec![(Task(2), 57600)],
end_hint: None
}
),
(
16,
AssignCore {
core: 1,
begin: 18,
assignment: vec![(Task(1), 57600)],
end_hint: None
}
),
(
22,
AssignCore {
core: 0,
begin: 24,
assignment: vec![(Task(2), 57600)],
end_hint: None,
},
),
(
22,
AssignCore {
core: 1,
begin: 24,
assignment: vec![(Task(1), 57600)],
end_hint: None,
},
),
(
28,
AssignCore {
core: 0,
begin: 30,
assignment: vec![(Task(1), 57600)],
end_hint: None,
},
),
(
28,
AssignCore {
core: 1,
begin: 30,
assignment: vec![(Task(2), 57600)],
end_hint: None,
},
),
]
);
});
}
11 changes: 7 additions & 4 deletions substrate/frame/broker/src/tick_impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,10 @@ impl<T: Config> Pallet<T> {
let assignment = CoreAssignment::Task(task);
let schedule = BoundedVec::truncate_from(vec![ScheduleItem { mask, assignment }]);
Workplan::<T>::insert((region_begin, first_core), &schedule);
let expiring = until >= region_begin && until < region_end;
if expiring {
// last time for this one - make it renewable.
// Will the lease expire at the end of the period?
let expire = until < region_end;
if expire {
// last time for this one - make it renewable in the next sale.
let renewal_id = AllowedRenewalId { core: first_core, when: region_end };
let record = AllowedRenewalRecord { price, completion: Complete(schedule) };
AllowedRenewals::<T>::insert(renewal_id, &record);
Expand All @@ -230,8 +231,10 @@ impl<T: Config> Pallet<T> {
});
Self::deposit_event(Event::LeaseEnding { when: region_end, task });
}

first_core.saturating_inc();
!expiring

!expire
});
Leases::<T>::put(&leases);

Expand Down
Loading