[pallet_broker] Remove leases that have already expired in rotate_sale (#3213)

Leases can be force set, but since `Leases` is a `StorageValue`, if a
lease misses its sale rotation in which it should expire, it can never
be cleared.

This can happen if a lease is added with an `until` timeslice that lies
in a region whose sale has already started or has passed, even if the
timeslice itself hasn't passed.

This solves that issue in a minimal way, with all expired leases being
cleaned up in each sale rotation, not just the ones that are expiring in
the coming region.

TODO:
- [x] Write test
This commit is contained in:
Dónal Murray
2024-02-08 12:23:36 +00:00
committed by GitHub
parent 2556e33fb4
commit 2ea6bcf195
2 changed files with 27 additions and 2 deletions
+4 -2
View File
@@ -216,7 +216,9 @@ 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;
// Separate these to avoid missed expired leases hanging around forever.
let expired = until < region_end;
let expiring = until >= region_begin && expired;
if expiring {
// last time for this one - make it renewable.
let renewal_id = AllowedRenewalId { core: first_core, when: region_end };
@@ -231,7 +233,7 @@ impl<T: Config> Pallet<T> {
Self::deposit_event(Event::LeaseEnding { when: region_end, task });
}
first_core.saturating_inc();
!expiring
!expired
});
Leases::<T>::put(&leases);