19
19
import com .fasterxml .jackson .annotation .JsonCreator ;
20
20
import com .fasterxml .jackson .annotation .JsonIgnoreProperties ;
21
21
import com .fasterxml .jackson .annotation .JsonProperty ;
22
- import org .slf4j .Logger ;
23
- import org .slf4j .LoggerFactory ;
24
22
25
23
import java .util .ArrayList ;
26
24
import java .util .HashMap ;
@@ -92,14 +90,16 @@ public double getFitness() {
92
90
93
91
public static class PreferentialNamedConsumableResource {
94
92
private final double maxFitness ;
93
+ private final String hostname ;
95
94
private final int index ;
96
95
private final String attrName ;
97
96
private String resName =null ;
98
97
private final int limit ;
99
98
private final Map <String , TaskRequest .NamedResourceSetRequest > usageBy ;
100
99
private int usedSubResources =0 ;
101
100
102
- PreferentialNamedConsumableResource (int i , String attrName , int limit ) {
101
+ PreferentialNamedConsumableResource (String hostname , int i , String attrName , int limit ) {
102
+ this .hostname = hostname ;
103
103
this .index = i ;
104
104
this .attrName = attrName ;
105
105
this .limit = limit ;
@@ -131,19 +131,41 @@ public Map<String, TaskRequest.NamedResourceSetRequest> getUsageBy() {
131
131
return usedSubResources ;
132
132
}
133
133
134
- double getFitness (TaskRequest request ) {
135
- String r = getResNameVal (attrName , request );
136
- if (resName == null )
137
- return 0.5 / maxFitness ; // unassigned: 0.0 indicates no fitness, so return 0.5, which is less than
138
- // the case of assigned with 0 sub-resources
139
- if (!resName .equals (r ))
134
+ double getFitness (TaskRequest request , PreferentialNamedConsumableResourceEvaluator evaluator ) {
135
+ TaskRequest .NamedResourceSetRequest setRequest = request .getCustomNamedResources ()==null
136
+ ? null
137
+ : request .getCustomNamedResources ().get (attrName );
138
+
139
+ // This particular resource type is not requested. We assign to it virtual resource name 'CustomResAbsentKey',
140
+ // and request 0 sub-resources.
141
+ if (setRequest == null ) {
142
+ if (resName == null ) {
143
+ return evaluator .evaluateIdle (hostname , CustomResAbsentKey , index , 0 , limit );
144
+ }
145
+ if (resName .equals (CustomResAbsentKey )) {
146
+ return evaluator .evaluate (hostname , CustomResAbsentKey , index , 0 , usedSubResources , limit );
147
+ }
140
148
return 0.0 ;
141
- final TaskRequest .NamedResourceSetRequest setRequest = request .getCustomNamedResources ()==null ?
142
- null : request .getCustomNamedResources ().get (attrName );
143
- double subResNeed = setRequest ==null ? 0.0 : setRequest .getNumSubResources ();
144
- if (usedSubResources + subResNeed > limit )
149
+ }
150
+
151
+ double subResNeed = setRequest .getNumSubResources ();
152
+
153
+ // Resource not assigned yet to any task
154
+ if (resName == null ) {
155
+ if (subResNeed > limit ) {
156
+ return 0.0 ;
157
+ }
158
+ return evaluator .evaluateIdle (hostname , setRequest .getResValue (), index , subResNeed , limit );
159
+ }
160
+
161
+ // Resource assigned different name than requested
162
+ if (!resName .equals (setRequest .getResValue ())) {
163
+ return 0.0 ;
164
+ }
165
+ if (usedSubResources + subResNeed > limit ) {
145
166
return 0.0 ;
146
- return Math .min (1.0 , usedSubResources + subResNeed + 1.0 / maxFitness );
167
+ }
168
+ return evaluator .evaluate (hostname , setRequest .getResValue (), index , subResNeed , usedSubResources , limit );
147
169
}
148
170
149
171
void consume (TaskRequest request ) {
@@ -190,11 +212,11 @@ boolean release(TaskRequest request) {
190
212
private final String name ;
191
213
private final List <PreferentialNamedConsumableResource > usageBy ;
192
214
193
- public PreferentialNamedConsumableResourceSet (String name , int val0 , int val1 ) {
215
+ public PreferentialNamedConsumableResourceSet (String hostname , String name , int val0 , int val1 ) {
194
216
this .name = name ;
195
217
usageBy = new ArrayList <>(val0 );
196
218
for (int i =0 ; i <val0 ; i ++)
197
- usageBy .add (new PreferentialNamedConsumableResource (i , name , val1 ));
219
+ usageBy .add (new PreferentialNamedConsumableResource (hostname , i , name , val1 ));
198
220
}
199
221
200
222
public String getName () {
@@ -209,8 +231,8 @@ public String getName() {
209
231
// return false;
210
232
// }
211
233
212
- ConsumeResult consume (TaskRequest request ) {
213
- return consumeIntl (request , false );
234
+ ConsumeResult consume (TaskRequest request , PreferentialNamedConsumableResourceEvaluator evaluator ) {
235
+ return consumeIntl (request , false , evaluator );
214
236
}
215
237
216
238
void assign (TaskRequest request ) {
@@ -233,15 +255,15 @@ void assign(TaskRequest request) {
233
255
}
234
256
235
257
// returns 0.0 for no fitness at all, or <=1.0 for fitness
236
- double getFitness (TaskRequest request ) {
237
- return consumeIntl (request , true ).fitness ;
258
+ double getFitness (TaskRequest request , PreferentialNamedConsumableResourceEvaluator evaluator ) {
259
+ return consumeIntl (request , true , evaluator ).fitness ;
238
260
}
239
261
240
- private ConsumeResult consumeIntl (TaskRequest request , boolean skipConsume ) {
262
+ private ConsumeResult consumeIntl (TaskRequest request , boolean skipConsume , PreferentialNamedConsumableResourceEvaluator evaluator ) {
241
263
PreferentialNamedConsumableResource best = null ;
242
264
double bestFitness =0.0 ;
243
265
for (PreferentialNamedConsumableResource r : usageBy ) {
244
- double f = r .getFitness (request );
266
+ double f = r .getFitness (request , evaluator );
245
267
if (f == 0.0 )
246
268
continue ;
247
269
if (bestFitness < f ) {
0 commit comments