@@ -474,7 +474,9 @@ impl<T: Trait> Module<T> {
474
474
475
475
let when = match when {
476
476
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 ( ) )
478
480
} ;
479
481
480
482
if when <= now {
@@ -894,7 +896,7 @@ mod tests {
894
896
new_test_ext ( ) . execute_with ( || {
895
897
let call = Call :: Logger ( logger:: Call :: log ( 42 , 1000 ) ) ;
896
898
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) ) ;
898
900
run_to_block ( 3 ) ;
899
901
assert ! ( logger:: log( ) . is_empty( ) ) ;
900
902
run_to_block ( 4 ) ;
@@ -910,10 +912,26 @@ mod tests {
910
912
run_to_block ( 2 ) ;
911
913
let call = Call :: Logger ( logger:: Call :: log ( 42 , 1000 ) ) ;
912
914
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) ) ;
916
917
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 ) ;
917
935
assert_eq ! ( logger:: log( ) , vec![ ( root( ) , 42u32 ) ] ) ;
918
936
run_to_block ( 100 ) ;
919
937
assert_eq ! ( logger:: log( ) , vec![ ( root( ) , 42u32 ) ] ) ;
@@ -924,9 +942,9 @@ mod tests {
924
942
fn periodic_scheduling_works ( ) {
925
943
new_test_ext ( ) . execute_with ( || {
926
944
// at #4, every 3 blocks, 3 times.
927
- let _ = Scheduler :: do_schedule (
945
+ assert_ok ! ( Scheduler :: do_schedule(
928
946
DispatchTime :: At ( 4 ) , Some ( ( 3 , 3 ) ) , 127 , root( ) , Call :: Logger ( logger:: Call :: log( 42 , 1000 ) )
929
- ) ;
947
+ ) ) ;
930
948
run_to_block ( 3 ) ;
931
949
assert ! ( logger:: log( ) . is_empty( ) ) ;
932
950
run_to_block ( 4 ) ;
@@ -1091,19 +1109,19 @@ mod tests {
1091
1109
#[ test]
1092
1110
fn scheduler_respects_weight_limits ( ) {
1093
1111
new_test_ext ( ) . execute_with ( || {
1094
- let _ = Scheduler :: do_schedule (
1112
+ assert_ok ! ( Scheduler :: do_schedule(
1095
1113
DispatchTime :: At ( 4 ) ,
1096
1114
None ,
1097
1115
127 ,
1098
1116
root( ) ,
1099
1117
Call :: Logger ( logger:: Call :: log( 42 , MaximumSchedulerWeight :: get( ) / 2 ) )
1100
- ) ;
1101
- let _ = Scheduler :: do_schedule (
1118
+ ) ) ;
1119
+ assert_ok ! ( Scheduler :: do_schedule(
1102
1120
DispatchTime :: At ( 4 ) ,
1103
1121
None ,
1104
1122
127 ,
1105
1123
root( ) , Call :: Logger ( logger:: Call :: log( 69 , MaximumSchedulerWeight :: get( ) / 2 ) )
1106
- ) ;
1124
+ ) ) ;
1107
1125
// 69 and 42 do not fit together
1108
1126
run_to_block ( 4 ) ;
1109
1127
assert_eq ! ( logger:: log( ) , vec![ ( root( ) , 42u32 ) ] ) ;
@@ -1115,20 +1133,20 @@ mod tests {
1115
1133
#[ test]
1116
1134
fn scheduler_respects_hard_deadlines_more ( ) {
1117
1135
new_test_ext ( ) . execute_with ( || {
1118
- let _ = Scheduler :: do_schedule (
1136
+ assert_ok ! ( Scheduler :: do_schedule(
1119
1137
DispatchTime :: At ( 4 ) ,
1120
1138
None ,
1121
1139
0 ,
1122
1140
root( ) ,
1123
1141
Call :: Logger ( logger:: Call :: log( 42 , MaximumSchedulerWeight :: get( ) / 2 ) )
1124
- ) ;
1125
- let _ = Scheduler :: do_schedule (
1142
+ ) ) ;
1143
+ assert_ok ! ( Scheduler :: do_schedule(
1126
1144
DispatchTime :: At ( 4 ) ,
1127
1145
None ,
1128
1146
0 ,
1129
1147
root( ) ,
1130
1148
Call :: Logger ( logger:: Call :: log( 69 , MaximumSchedulerWeight :: get( ) / 2 ) )
1131
- ) ;
1149
+ ) ) ;
1132
1150
// With base weights, 69 and 42 should not fit together, but do because of hard deadlines
1133
1151
run_to_block ( 4 ) ;
1134
1152
assert_eq ! ( logger:: log( ) , vec![ ( root( ) , 42u32 ) , ( root( ) , 69u32 ) ] ) ;
@@ -1138,20 +1156,20 @@ mod tests {
1138
1156
#[ test]
1139
1157
fn scheduler_respects_priority_ordering ( ) {
1140
1158
new_test_ext ( ) . execute_with ( || {
1141
- let _ = Scheduler :: do_schedule (
1159
+ assert_ok ! ( Scheduler :: do_schedule(
1142
1160
DispatchTime :: At ( 4 ) ,
1143
1161
None ,
1144
1162
1 ,
1145
1163
root( ) ,
1146
1164
Call :: Logger ( logger:: Call :: log( 42 , MaximumSchedulerWeight :: get( ) / 2 ) )
1147
- ) ;
1148
- let _ = Scheduler :: do_schedule (
1165
+ ) ) ;
1166
+ assert_ok ! ( Scheduler :: do_schedule(
1149
1167
DispatchTime :: At ( 4 ) ,
1150
1168
None ,
1151
1169
0 ,
1152
1170
root( ) ,
1153
1171
Call :: Logger ( logger:: Call :: log( 69 , MaximumSchedulerWeight :: get( ) / 2 ) )
1154
- ) ;
1172
+ ) ) ;
1155
1173
run_to_block ( 4 ) ;
1156
1174
assert_eq ! ( logger:: log( ) , vec![ ( root( ) , 69u32 ) , ( root( ) , 42u32 ) ] ) ;
1157
1175
} ) ;
@@ -1160,24 +1178,24 @@ mod tests {
1160
1178
#[ test]
1161
1179
fn scheduler_respects_priority_ordering_with_soft_deadlines ( ) {
1162
1180
new_test_ext ( ) . execute_with ( || {
1163
- let _ = Scheduler :: do_schedule (
1181
+ assert_ok ! ( Scheduler :: do_schedule(
1164
1182
DispatchTime :: At ( 4 ) ,
1165
1183
None ,
1166
1184
255 ,
1167
1185
root( ) , Call :: Logger ( logger:: Call :: log( 42 , MaximumSchedulerWeight :: get( ) / 3 ) )
1168
- ) ;
1169
- let _ = Scheduler :: do_schedule (
1186
+ ) ) ;
1187
+ assert_ok ! ( Scheduler :: do_schedule(
1170
1188
DispatchTime :: At ( 4 ) ,
1171
1189
None ,
1172
1190
127 ,
1173
1191
root( ) , Call :: Logger ( logger:: Call :: log( 69 , MaximumSchedulerWeight :: get( ) / 2 ) )
1174
- ) ;
1175
- let _ = Scheduler :: do_schedule (
1192
+ ) ) ;
1193
+ assert_ok ! ( Scheduler :: do_schedule(
1176
1194
DispatchTime :: At ( 4 ) ,
1177
1195
None ,
1178
1196
126 ,
1179
1197
root( ) , Call :: Logger ( logger:: Call :: log( 2600 , MaximumSchedulerWeight :: get( ) / 2 ) )
1180
- ) ;
1198
+ ) ) ;
1181
1199
1182
1200
// 2600 does not fit with 69 or 42, but has higher priority, so will go through
1183
1201
run_to_block ( 4 ) ;
@@ -1204,21 +1222,21 @@ mod tests {
1204
1222
)
1205
1223
) ;
1206
1224
// Anon Periodic
1207
- let _ = Scheduler :: do_schedule (
1225
+ assert_ok ! ( Scheduler :: do_schedule(
1208
1226
DispatchTime :: At ( 1 ) ,
1209
1227
Some ( ( 1000 , 3 ) ) ,
1210
1228
128 ,
1211
1229
root( ) ,
1212
1230
Call :: Logger ( logger:: Call :: log( 42 , MaximumSchedulerWeight :: get( ) / 3 ) )
1213
- ) ;
1231
+ ) ) ;
1214
1232
// Anon
1215
- let _ = Scheduler :: do_schedule (
1233
+ assert_ok ! ( Scheduler :: do_schedule(
1216
1234
DispatchTime :: At ( 1 ) ,
1217
1235
None ,
1218
1236
127 ,
1219
1237
root( ) ,
1220
1238
Call :: Logger ( logger:: Call :: log( 69 , MaximumSchedulerWeight :: get( ) / 2 ) )
1221
- ) ;
1239
+ ) ) ;
1222
1240
// Named Periodic
1223
1241
assert_ok ! ( Scheduler :: do_schedule_named(
1224
1242
2u32 . encode( ) , DispatchTime :: At ( 1 ) , Some ( ( 1000 , 3 ) ) , 126 , root( ) ,
0 commit comments