@@ -150,16 +150,16 @@ private void testKillsBiggestTasksIfAllExecuteSameTime(Duration scheduledTime, D
150
150
else {
151
151
taskInfos = ImmutableMap .of (
152
152
"q_1" , ImmutableMap .of (
153
- 1 , buildTaskInfo (taskId ("q_1" , 1 ), TaskState .RUNNING , scheduledTime , blockedTime )),
153
+ 1 , buildTaskInfo (taskId ("q_1" , 1 ), TaskState .RUNNING , scheduledTime , blockedTime , false )),
154
154
"q_2" , ImmutableMap .of (
155
- 1 , buildTaskInfo (taskId ("q_2" , 1 ), TaskState .RUNNING , scheduledTime , blockedTime ),
156
- 2 , buildTaskInfo (taskId ("q_2" , 2 ), TaskState .RUNNING , scheduledTime , blockedTime ),
157
- 3 , buildTaskInfo (taskId ("q_2" , 3 ), TaskState .RUNNING , scheduledTime , blockedTime ),
158
- 4 , buildTaskInfo (taskId ("q_2" , 4 ), TaskState .RUNNING , scheduledTime , blockedTime ),
159
- 5 , buildTaskInfo (taskId ("q_2" , 5 ), TaskState .RUNNING , scheduledTime , blockedTime ),
160
- 6 , buildTaskInfo (taskId ("q_2" , 6 ), TaskState .RUNNING , scheduledTime , blockedTime ),
161
- 7 , buildTaskInfo (taskId ("q_2" , 7 ), TaskState .RUNNING , scheduledTime , blockedTime ),
162
- 8 , buildTaskInfo (taskId ("q_2" , 8 ), TaskState .RUNNING , scheduledTime , blockedTime )));
155
+ 1 , buildTaskInfo (taskId ("q_2" , 1 ), TaskState .RUNNING , scheduledTime , blockedTime , false ),
156
+ 2 , buildTaskInfo (taskId ("q_2" , 2 ), TaskState .RUNNING , scheduledTime , blockedTime , false ),
157
+ 3 , buildTaskInfo (taskId ("q_2" , 3 ), TaskState .RUNNING , scheduledTime , blockedTime , false ),
158
+ 4 , buildTaskInfo (taskId ("q_2" , 4 ), TaskState .RUNNING , scheduledTime , blockedTime , false ),
159
+ 5 , buildTaskInfo (taskId ("q_2" , 5 ), TaskState .RUNNING , scheduledTime , blockedTime , false ),
160
+ 6 , buildTaskInfo (taskId ("q_2" , 6 ), TaskState .RUNNING , scheduledTime , blockedTime , false ),
161
+ 7 , buildTaskInfo (taskId ("q_2" , 7 ), TaskState .RUNNING , scheduledTime , blockedTime , false ),
162
+ 8 , buildTaskInfo (taskId ("q_2" , 8 ), TaskState .RUNNING , scheduledTime , blockedTime , false )));
163
163
}
164
164
165
165
assertEquals (
@@ -194,12 +194,12 @@ public void testKillsSmallerTaskIfWastedEffortRatioIsBetter()
194
194
195
195
Map <String , Map <Integer , TaskInfo >> taskInfos = ImmutableMap .of (
196
196
"q_1" , ImmutableMap .of (
197
- 1 , buildTaskInfo (taskId ("q_1" , 1 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS )),
198
- 2 , buildTaskInfo (taskId ("q_1" , 2 ), TaskState .RUNNING , new Duration (400 , SECONDS ), new Duration (200 , SECONDS ))),
197
+ 1 , buildTaskInfo (taskId ("q_1" , 1 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS ), false ),
198
+ 2 , buildTaskInfo (taskId ("q_1" , 2 ), TaskState .RUNNING , new Duration (400 , SECONDS ), new Duration (200 , SECONDS ), false )),
199
199
"q_2" , ImmutableMap .of (
200
- 1 , buildTaskInfo (taskId ("q_2" , 1 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS )),
201
- 2 , buildTaskInfo (taskId ("q_2" , 2 ), TaskState .RUNNING , new Duration (100 , SECONDS ), new Duration (100 , SECONDS )),
202
- 3 , buildTaskInfo (taskId ("q_2" , 3 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS ))));
200
+ 1 , buildTaskInfo (taskId ("q_2" , 1 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS ), false ),
201
+ 2 , buildTaskInfo (taskId ("q_2" , 2 ), TaskState .RUNNING , new Duration (100 , SECONDS ), new Duration (100 , SECONDS ), false ),
202
+ 3 , buildTaskInfo (taskId ("q_2" , 3 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS ), false )));
203
203
204
204
// q1_1; n1; walltime 60s; memory 3; ratio 0.05 (pick for n1)
205
205
// q1_2; n2; walltime 600s; memory 8; ratio 0.0133
@@ -217,7 +217,46 @@ public void testKillsSmallerTaskIfWastedEffortRatioIsBetter()
217
217
taskId ("q_2" , 3 )))));
218
218
}
219
219
220
- private static TaskInfo buildTaskInfo (TaskId taskId , TaskState state , Duration scheduledTime , Duration blockedTime )
220
+ @ Test
221
+ public void testPrefersKillingSpeculativeTasks ()
222
+ {
223
+ int memoryPool = 8 ;
224
+ Map <String , Map <String , Long >> queries = ImmutableMap .<String , Map <String , Long >>builder ()
225
+ .put ("q_1" , ImmutableMap .of ("n1" , 3L , "n2" , 8L ))
226
+ .put ("q_2" , ImmutableMap .of ("n1" , 7L , "n2" , 2L ))
227
+ .buildOrThrow ();
228
+
229
+ Map <String , Map <String , Map <Integer , Long >>> tasks = ImmutableMap .<String , Map <String , Map <Integer , Long >>>builder ()
230
+ .put ("q_1" , ImmutableMap .of (
231
+ "n1" , ImmutableMap .of (1 , 3L ),
232
+ "n2" , ImmutableMap .of (2 , 8L )))
233
+ .put ("q_2" , ImmutableMap .of (
234
+ "n1" , ImmutableMap .of (
235
+ 1 , 1L ,
236
+ 2 , 6L ),
237
+ "n2" , ImmutableMap .of (3 , 2L )))
238
+ .buildOrThrow ();
239
+
240
+ Map <String , Map <Integer , TaskInfo >> taskInfos = ImmutableMap .of (
241
+ "q_1" , ImmutableMap .of (
242
+ 1 , buildTaskInfo (taskId ("q_1" , 1 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS ), false ),
243
+ 2 , buildTaskInfo (taskId ("q_1" , 2 ), TaskState .RUNNING , new Duration (400 , SECONDS ), new Duration (200 , SECONDS ), false )),
244
+ "q_2" , ImmutableMap .of (
245
+ 1 , buildTaskInfo (taskId ("q_2" , 1 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS ), true ),
246
+ 2 , buildTaskInfo (taskId ("q_2" , 2 ), TaskState .RUNNING , new Duration (100 , SECONDS ), new Duration (100 , SECONDS ), false ),
247
+ 3 , buildTaskInfo (taskId ("q_2" , 3 ), TaskState .RUNNING , new Duration (30 , SECONDS ), new Duration (30 , SECONDS ), false )));
248
+
249
+ assertEquals (
250
+ lowMemoryKiller .chooseTargetToKill (
251
+ toRunningQueryInfoList (queries , ImmutableSet .of ("q_1" , "q_2" ), taskInfos ),
252
+ toNodeMemoryInfoList (memoryPool , queries , tasks )),
253
+ Optional .of (KillTarget .selectedTasks (
254
+ ImmutableSet .of (
255
+ taskId ("q_2" , 1 ), // if q_2_1 was not speculative then "q_1_1 would be picked
256
+ taskId ("q_2" , 3 )))));
257
+ }
258
+
259
+ private static TaskInfo buildTaskInfo (TaskId taskId , TaskState state , Duration scheduledTime , Duration blockedTime , boolean speculative )
221
260
{
222
261
return new TaskInfo (
223
262
new TaskStatus (
@@ -227,7 +266,7 @@ private static TaskInfo buildTaskInfo(TaskId taskId, TaskState state, Duration s
227
266
state ,
228
267
URI .create ("fake://task/" + taskId + "/node/some_node" ),
229
268
"some_node" ,
230
- false ,
269
+ speculative ,
231
270
ImmutableList .of (),
232
271
0 ,
233
272
0 ,
0 commit comments