Skip to content

Commit c8cbd42

Browse files
authored
Allow schedule_after(0, ...) to work (#7284)
* Allow schedule_after(0) to work * better choice
1 parent 307b21a commit c8cbd42

File tree

1 file changed

+47
-29
lines changed

1 file changed

+47
-29
lines changed

src/lib.rs

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,9 @@ impl<T: Trait> Module<T> {
474474

475475
let when = match when {
476476
DispatchTime::At(x) => x,
477-
DispatchTime::After(x) => now.saturating_add(x)
477+
// The current block has already completed it's scheduled tasks, so
478+
// Schedule the task at lest one block after this current block.
479+
DispatchTime::After(x) => now.saturating_add(x).saturating_add(One::one())
478480
};
479481

480482
if when <= now {
@@ -894,7 +896,7 @@ mod tests {
894896
new_test_ext().execute_with(|| {
895897
let call = Call::Logger(logger::Call::log(42, 1000));
896898
assert!(!<Test as frame_system::Trait>::BaseCallFilter::filter(&call));
897-
let _ = Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), call);
899+
assert_ok!(Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), call));
898900
run_to_block(3);
899901
assert!(logger::log().is_empty());
900902
run_to_block(4);
@@ -910,10 +912,26 @@ mod tests {
910912
run_to_block(2);
911913
let call = Call::Logger(logger::Call::log(42, 1000));
912914
assert!(!<Test as frame_system::Trait>::BaseCallFilter::filter(&call));
913-
let _ = Scheduler::do_schedule(DispatchTime::After(3), None, 127, root(), call);
914-
run_to_block(4);
915-
assert!(logger::log().is_empty());
915+
// This will schedule the call 3 blocks after the next block... so block 3 + 3 = 6
916+
assert_ok!(Scheduler::do_schedule(DispatchTime::After(3), None, 127, root(), call));
916917
run_to_block(5);
918+
assert!(logger::log().is_empty());
919+
run_to_block(6);
920+
assert_eq!(logger::log(), vec![(root(), 42u32)]);
921+
run_to_block(100);
922+
assert_eq!(logger::log(), vec![(root(), 42u32)]);
923+
});
924+
}
925+
926+
#[test]
927+
fn schedule_after_zero_works() {
928+
new_test_ext().execute_with(|| {
929+
run_to_block(2);
930+
let call = Call::Logger(logger::Call::log(42, 1000));
931+
assert!(!<Test as frame_system::Trait>::BaseCallFilter::filter(&call));
932+
assert_ok!(Scheduler::do_schedule(DispatchTime::After(0), None, 127, root(), call));
933+
// Will trigger on the next block.
934+
run_to_block(3);
917935
assert_eq!(logger::log(), vec![(root(), 42u32)]);
918936
run_to_block(100);
919937
assert_eq!(logger::log(), vec![(root(), 42u32)]);
@@ -924,9 +942,9 @@ mod tests {
924942
fn periodic_scheduling_works() {
925943
new_test_ext().execute_with(|| {
926944
// at #4, every 3 blocks, 3 times.
927-
let _ = Scheduler::do_schedule(
945+
assert_ok!(Scheduler::do_schedule(
928946
DispatchTime::At(4), Some((3, 3)), 127, root(), Call::Logger(logger::Call::log(42, 1000))
929-
);
947+
));
930948
run_to_block(3);
931949
assert!(logger::log().is_empty());
932950
run_to_block(4);
@@ -1091,19 +1109,19 @@ mod tests {
10911109
#[test]
10921110
fn scheduler_respects_weight_limits() {
10931111
new_test_ext().execute_with(|| {
1094-
let _ = Scheduler::do_schedule(
1112+
assert_ok!(Scheduler::do_schedule(
10951113
DispatchTime::At(4),
10961114
None,
10971115
127,
10981116
root(),
10991117
Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
1100-
);
1101-
let _ = Scheduler::do_schedule(
1118+
));
1119+
assert_ok!(Scheduler::do_schedule(
11021120
DispatchTime::At(4),
11031121
None,
11041122
127,
11051123
root(), Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
1106-
);
1124+
));
11071125
// 69 and 42 do not fit together
11081126
run_to_block(4);
11091127
assert_eq!(logger::log(), vec![(root(), 42u32)]);
@@ -1115,20 +1133,20 @@ mod tests {
11151133
#[test]
11161134
fn scheduler_respects_hard_deadlines_more() {
11171135
new_test_ext().execute_with(|| {
1118-
let _ = Scheduler::do_schedule(
1136+
assert_ok!(Scheduler::do_schedule(
11191137
DispatchTime::At(4),
11201138
None,
11211139
0,
11221140
root(),
11231141
Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
1124-
);
1125-
let _ = Scheduler::do_schedule(
1142+
));
1143+
assert_ok!(Scheduler::do_schedule(
11261144
DispatchTime::At(4),
11271145
None,
11281146
0,
11291147
root(),
11301148
Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
1131-
);
1149+
));
11321150
// With base weights, 69 and 42 should not fit together, but do because of hard deadlines
11331151
run_to_block(4);
11341152
assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 69u32)]);
@@ -1138,20 +1156,20 @@ mod tests {
11381156
#[test]
11391157
fn scheduler_respects_priority_ordering() {
11401158
new_test_ext().execute_with(|| {
1141-
let _ = Scheduler::do_schedule(
1159+
assert_ok!(Scheduler::do_schedule(
11421160
DispatchTime::At(4),
11431161
None,
11441162
1,
11451163
root(),
11461164
Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
1147-
);
1148-
let _ = Scheduler::do_schedule(
1165+
));
1166+
assert_ok!(Scheduler::do_schedule(
11491167
DispatchTime::At(4),
11501168
None,
11511169
0,
11521170
root(),
11531171
Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
1154-
);
1172+
));
11551173
run_to_block(4);
11561174
assert_eq!(logger::log(), vec![(root(), 69u32), (root(), 42u32)]);
11571175
});
@@ -1160,24 +1178,24 @@ mod tests {
11601178
#[test]
11611179
fn scheduler_respects_priority_ordering_with_soft_deadlines() {
11621180
new_test_ext().execute_with(|| {
1163-
let _ = Scheduler::do_schedule(
1181+
assert_ok!(Scheduler::do_schedule(
11641182
DispatchTime::At(4),
11651183
None,
11661184
255,
11671185
root(), Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
1168-
);
1169-
let _ = Scheduler::do_schedule(
1186+
));
1187+
assert_ok!(Scheduler::do_schedule(
11701188
DispatchTime::At(4),
11711189
None,
11721190
127,
11731191
root(), Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
1174-
);
1175-
let _ = Scheduler::do_schedule(
1192+
));
1193+
assert_ok!(Scheduler::do_schedule(
11761194
DispatchTime::At(4),
11771195
None,
11781196
126,
11791197
root(), Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
1180-
);
1198+
));
11811199

11821200
// 2600 does not fit with 69 or 42, but has higher priority, so will go through
11831201
run_to_block(4);
@@ -1204,21 +1222,21 @@ mod tests {
12041222
)
12051223
);
12061224
// Anon Periodic
1207-
let _ = Scheduler::do_schedule(
1225+
assert_ok!(Scheduler::do_schedule(
12081226
DispatchTime::At(1),
12091227
Some((1000, 3)),
12101228
128,
12111229
root(),
12121230
Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
1213-
);
1231+
));
12141232
// Anon
1215-
let _ = Scheduler::do_schedule(
1233+
assert_ok!(Scheduler::do_schedule(
12161234
DispatchTime::At(1),
12171235
None,
12181236
127,
12191237
root(),
12201238
Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
1221-
);
1239+
));
12221240
// Named Periodic
12231241
assert_ok!(Scheduler::do_schedule_named(
12241242
2u32.encode(), DispatchTime::At(1), Some((1000, 3)), 126, root(),

0 commit comments

Comments
 (0)