1 | // $Id: PartitionManager.java,v 1.5 2007-08-09 20:17:48 tigran Exp $ |
2 | package diskCacheV111.poolManager ; |
3 | |
4 | import java.io.PrintWriter; |
5 | import java.io.Serializable; |
6 | import java.util.HashMap; |
7 | import java.util.Map; |
8 | |
9 | import org.dcache.cells.AbstractCellComponent; |
10 | import org.dcache.cells.CellCommandListener; |
11 | |
12 | import dmg.util.Args; |
13 | |
14 | public class PartitionManager |
15 | extends AbstractCellComponent |
16 | implements Serializable, CellCommandListener |
17 | { |
18 | public static class Info implements Serializable |
19 | { |
20 | private final String _name ; |
21 | private final PoolManagerParameter _parameter ; |
22 | |
23 | private Info( String name , Info info ){ |
24 | _name = name ; |
25 | _parameter = new PoolManagerParameter( info._parameter ) ; |
26 | _parameter.setValid(false); |
27 | } |
28 | private Info( String name ){ |
29 | _name = name ; |
30 | _parameter = new PoolManagerParameter() ; |
31 | if( name.equals("default") )_parameter.setValid(true); |
32 | } |
33 | public String getName(){ return _name ; } |
34 | public PoolManagerParameter getParameter(){ return _parameter ; } |
35 | } |
36 | private final Info _defaultPartitionInfo ; |
37 | private final Map<String, Info> _infoMap = new HashMap<String, Info>() ; |
38 | |
39 | public PartitionManager(){ |
40 | |
41 | _defaultPartitionInfo = new Info("default"); |
42 | _infoMap.put( "default" , _defaultPartitionInfo ) ; |
43 | |
44 | } |
45 | public void clear(){ |
46 | _infoMap.clear() ; |
47 | _infoMap.put( "default" , _defaultPartitionInfo ) ; |
48 | } |
49 | public Map<String,PoolManagerParameter > getParameterMap(){ |
50 | Map<String,PoolManagerParameter > map = new HashMap<String,PoolManagerParameter >() ; |
51 | for( Info info: _infoMap.values() ){ |
52 | map.put( info.getName() , new PoolManagerParameter( info.getParameter() ) ) ; |
53 | } |
54 | return map ; |
55 | } |
56 | public Info getDefaultPartitionInfo(){ return _defaultPartitionInfo ; } |
57 | public PoolManagerParameter getParameterCopyOf( ){ |
58 | return new PoolManagerParameter( _defaultPartitionInfo.getParameter() ) ; |
59 | } |
60 | public PoolManagerParameter getParameterCopyOf( String partitionName ){ |
61 | |
62 | PoolManagerParameter defaultParameter = new PoolManagerParameter( _defaultPartitionInfo.getParameter() ) ; |
63 | if( partitionName == null )return defaultParameter; |
64 | |
65 | Info info = _infoMap.get( partitionName ) ; |
66 | if( info == null )return defaultParameter ; |
67 | return defaultParameter.merge( info.getParameter() ) ; |
68 | } |
69 | public Info getInfoPartitionByName( String partitionName ){ |
70 | |
71 | return _infoMap.get( partitionName ) ; |
72 | |
73 | } |
74 | /** |
75 | * New way of setting 'partitioned parameters'. |
76 | * |
77 | */ |
78 | public String hh_pmx_get_map = "" ; |
79 | public Object ac_pmx_get_map( Args args ){ |
80 | return getParameterMap() ; |
81 | } |
82 | |
83 | public String fh_pm_set = |
84 | "pm set [<partitionName>|default] OPTIONS\n"+ |
85 | " OPTIONS\n"+ |
86 | " -spacecostfactor=<scf>|off\n"+ |
87 | " -cpucostfactor=<ccf>|off\n"+ |
88 | " -max-pnfs-copies=<ccf>|off\n"+ |
89 | " -idle=<value>|off\n"+ |
90 | " -p2p=<value>|off\n"+ |
91 | " -alert=<value>|off\n"+ |
92 | " -panic=<value>|off\n"+ |
93 | " -fallback=<value>|off\n"+ |
94 | " -slope=<value>|off\n"+ |
95 | " -p2p-allowed=yes|no|off\n"+ |
96 | " -p2p-oncost=yes|no|off\n"+ |
97 | " -p2p-fortransfer=yes|no|off\n"+ |
98 | " -stage-allowed=yes|no|off\n"+ |
99 | " -stage-oncost=yes|no|off\n"+ |
100 | ""; |
101 | public String hh_pm_set = "[<partitionName>] OPTIONS # help pm set" ; |
102 | public String ac_pm_set_$_0_1( Args args ){ |
103 | String returnMessage = ""; |
104 | String name = args.argc() == 0 ? "default" : args.argv(0) ; |
105 | Info info = _infoMap.get(name) ; |
106 | |
107 | //TODO: ultimately we want to remove support for this behaviour |
108 | if( info == null ) { |
109 | _infoMap.put( name , info = new Info( name , _defaultPartitionInfo ) ) ; |
110 | returnMessage = "partition " + name + " created"; |
111 | } |
112 | |
113 | scanParameter( args , info._parameter ) ; |
114 | |
115 | return returnMessage; |
116 | } |
117 | |
118 | public String hh_pm_create = "<partitionName>"; |
119 | public String ac_pm_create_$_1( Args args) { |
120 | String name = args.argv(0); |
121 | |
122 | if( _infoMap.containsKey( name)) { |
123 | return "Partition " + name + " already exists."; |
124 | } |
125 | |
126 | _infoMap.put(name, new Info(name, _defaultPartitionInfo)); |
127 | |
128 | return "" ; |
129 | } |
130 | public String hh_pm_destroy = "<partitionName> # destroys parameter partition" ; |
131 | public String ac_pm_destroy_$_1( Args args ){ |
132 | |
133 | String name = args.argv(0) ; |
134 | if( name.equals("default") ) |
135 | throw new |
136 | IllegalArgumentException("Can't destroy default parameter partition"); |
137 | |
138 | Info info = _infoMap.get(name) ; |
139 | if( info == null ) |
140 | throw new |
141 | IllegalArgumentException("No such parameter partition "+name); |
142 | |
143 | _infoMap.remove( name ) ; |
144 | |
145 | return "" ; |
146 | } |
147 | public String hh_pm_ls = "[<section>] [-l]" ; |
148 | public String ac_pm_ls_$_0_1( Args args ){ |
149 | |
150 | StringBuffer sb = new StringBuffer() ; |
151 | boolean extended = args.getOpt("l") != null ; |
152 | if( args.argc() == 0 ){ |
153 | if( extended ){ |
154 | for( Info info: _infoMap.values() ){ |
155 | sb.append(info._name).append("\n"); |
156 | printParameterSet( sb , info._parameter ) ; |
157 | } |
158 | }else{ |
159 | for( String sectionName : _infoMap.keySet() ){ |
160 | sb.append(sectionName).append("\n"); |
161 | } |
162 | } |
163 | }else{ |
164 | String sectionName = args.argv(0) ; |
165 | Info info = _infoMap.get(sectionName) ; |
166 | if( info == null ) |
167 | throw new |
168 | IllegalArgumentException("Section not found : "+sectionName ) ; |
169 | |
170 | sb.append(info._name).append("\n"); |
171 | printParameterSet( sb , info._parameter ) ; |
172 | |
173 | |
174 | } |
175 | return sb.toString() ; |
176 | } |
177 | private void printParameterSet( StringBuffer sb , PoolManagerParameter para ){ |
178 | |
179 | if(para._performanceCostFactorSet)sb.append(" -cpucostfactor=").append(para._performanceCostFactor).append("\n"); |
180 | if(para._spaceCostFactorSet )sb.append(" -spacecostfactor=").append(para._spaceCostFactor).append("\n"); |
181 | if(para._minCostCutSet )sb.append(" -idle=").append(para._minCostCut).append("\n"); |
182 | if(para._costCutSet )sb.append(" -p2p=").append(para.getCostCutString()).append("\n"); |
183 | if(para._alertCostCutSet )sb.append(" -alert=").append(para._alertCostCut).append("\n"); |
184 | if(para._panicCostCutSet )sb.append(" -halt=").append(para._panicCostCut).append("\n"); |
185 | if(para._fallbackCostCutSet )sb.append(" -fallback=").append(para._fallbackCostCut).append("\n"); |
186 | if(para._p2pAllowedSet )sb.append(" -p2p-allowed=").append(para._p2pAllowed).append("\n"); |
187 | if(para._p2pOnCostSet )sb.append(" -p2p-oncost=").append(para._p2pOnCost).append("\n"); |
188 | if(para._p2pForTransferSet )sb.append(" -p2p-fortransfer=").append(para._p2pForTransfer).append("\n"); |
189 | if(para._hasHsmBackendSet )sb.append(" -stage-allowed=").append(para._hasHsmBackend).append("\n"); |
190 | if(para._stageOnCostSet )sb.append(" -stage-oncost=").append(para._stageOnCost).append("\n"); |
191 | if(para._maxPnfsFileCopiesSet )sb.append(" -max-copies=").append(para._maxPnfsFileCopies).append("\n") ; |
192 | |
193 | return ; |
194 | } |
195 | /** |
196 | * Legacy command : are treated as 'default' dCache partition. |
197 | * |
198 | */ |
199 | public String hh_rc_set_max_copies = "<maxNumberOfP2pCopies>" ; |
200 | public String ac_rc_set_max_copies_$_1(Args args ){ |
201 | |
202 | _defaultPartitionInfo._parameter._maxPnfsFileCopies = Integer.parseInt(args.argv(0)); |
203 | return "" ; |
204 | } |
205 | public String hh_set_pool_decision = |
206 | "[-spacecostfactor=<scf>] [-cpucostfactor=<ccf>] # values for default dCache partition" ; |
207 | |
208 | public String ac_set_pool_decision( Args args )throws Exception { |
209 | |
210 | scanParameter( args , _defaultPartitionInfo._parameter ) ; |
211 | |
212 | return "scf="+_defaultPartitionInfo._parameter._spaceCostFactor+ |
213 | ";ccf="+_defaultPartitionInfo._parameter._performanceCostFactor ; |
214 | } |
215 | public String hh_rc_set_p2p = "on|off|oncost|fortransfer|notfortransfer" ; |
216 | public String ac_rc_set_p2p_$_1( Args args ){ |
217 | |
218 | PoolManagerParameter para = _defaultPartitionInfo._parameter ; |
219 | |
220 | String mode = args.argv(0) ; |
221 | |
222 | if( mode.equals("on") ){ |
223 | para._p2pAllowed = true ; |
224 | para._p2pOnCost = false ; |
225 | para._p2pForTransfer = false ; |
226 | }else if( mode.equals("oncost") ){ |
227 | para._p2pOnCost = true ; |
228 | para._p2pAllowed = true ; |
229 | }else if( mode.equals("off") ){ |
230 | para._p2pOnCost = false ; |
231 | para._p2pAllowed = false ; |
232 | para._p2pForTransfer = false ; |
233 | }else if( mode.equals("fortransfer") ){ |
234 | para._p2pForTransfer = true ; |
235 | para._p2pAllowed = true ; |
236 | }else throw new |
237 | IllegalArgumentException("Usage : rc set p2p on|off|oncost|fortransfer"); |
238 | |
239 | return "p2p="+( para._p2pAllowed ? "on" : "off" )+ |
240 | ";oncost="+( para._p2pOnCost ? "on" : "off" )+ |
241 | ";fortransfer="+( para._p2pForTransfer ? "on" : "off" ) ; |
242 | } |
243 | public String hh_rc_set_stage = "[oncost] on|off" ; |
244 | public String ac_rc_set_stage_$_1_2( Args args ){ |
245 | |
246 | PoolManagerParameter para = _defaultPartitionInfo._parameter ; |
247 | String help = "rc set stage "+hh_rc_set_stage; |
248 | String oncost = args.argv(0) ; |
249 | |
250 | if( oncost.equals( "on" ) ){ |
251 | para._hasHsmBackend = true ; |
252 | return "stage on" ; |
253 | }else if( oncost.equals( "off" ) ){ |
254 | para._hasHsmBackend = false ; |
255 | return "stage off" ; |
256 | }else if( oncost.equals( "oncost" ) ){ |
257 | if( args.argc() < 2 ) |
258 | throw new |
259 | IllegalArgumentException(help); |
260 | |
261 | String mode = args.argv(1) ; |
262 | if( mode.equals("on") ){ |
263 | para._stageOnCost = true ; |
264 | para._hasHsmBackend = true ; |
265 | }else if( mode.equals("off") ){ |
266 | para._stageOnCost = false ; |
267 | }else{ |
268 | throw new |
269 | IllegalArgumentException(help); |
270 | } |
271 | return "stage-oncost="+(para._stageOnCost?"on":"off") ; |
272 | }else |
273 | throw new |
274 | IllegalArgumentException(help); |
275 | |
276 | } |
277 | public String fh_set_costcuts = |
278 | " set costcuts [-<options>=<value> ... ]\n"+ |
279 | "\n"+ |
280 | " Options | Default | Description\n"+ |
281 | " -------------------------------------------------------------------\n"+ |
282 | " idle | 0.0 | below 'idle' : 'reduce duplicate' mode\n"+ |
283 | " p2p | 0.0 | above : start pool to pool mode\n"+ |
284 | " | | If p2p value is a percent then p2p is dynamically\n"+ |
285 | " | | assigned that percentile value of pool performance costs\n"+ |
286 | " alert | 0.0 | stop pool 2 pool mode, start stage only mode\n"+ |
287 | " halt | 0.0 | suspend system\n"+ |
288 | " fallback | 0.0 | Allow fallback in Permission matrix on high load\n"+ |
289 | "\n"+ |
290 | " A value of zero disabled the corresponding value\n\n"; |
291 | public String hh_set_costcuts = "[-<option>=<value> ...] # see 'help set costcuts'" ; |
292 | public String ac_set_costcuts( Args args ){ |
293 | |
294 | PoolManagerParameter para = _defaultPartitionInfo._parameter ; |
295 | |
296 | String value = args.getOpt("idle") ; |
297 | if( value != null )para._minCostCut = Double.parseDouble(value) ; |
298 | value = args.getOpt("p2p") ; |
299 | if( value != null ) para.setCostCut( value); |
300 | value = args.getOpt("alert") ; |
301 | if( value != null )para._alertCostCut = Double.parseDouble(value) ; |
302 | value = args.getOpt("halt") ; |
303 | if( value != null )para._panicCostCut = Double.parseDouble(value) ; |
304 | value = args.getOpt("fallback") ; |
305 | if( value != null )para._fallbackCostCut = Double.parseDouble(value) ; |
306 | |
307 | |
308 | return "costcuts;idle="+para._minCostCut+ |
309 | ";p2p="+para.getCostCutString()+ |
310 | ";alert="+para._alertCostCut+ |
311 | ";halt="+para._panicCostCut+ |
312 | ";fallback="+para._fallbackCostCut ; |
313 | } |
314 | public String hh_rc_set_slope = "<p2p source/destination slope>" ; |
315 | public String ac_rc_set_slope_$_1( Args args ){ |
316 | |
317 | PoolManagerParameter para = _defaultPartitionInfo._parameter ; |
318 | |
319 | double d = Double.parseDouble(args.argv(0)); |
320 | if( ( d < 0.0 ) || ( d > 1.0 ) ) |
321 | throw new |
322 | IllegalArgumentException("0 < slope < 1"); |
323 | |
324 | para._slope = d ; |
325 | return "p2p slope set to "+para._slope ; |
326 | } |
327 | /** |
328 | * COSTFACTORS |
329 | * |
330 | * spacecostfactor double |
331 | * cpucostfactor double |
332 | * |
333 | * COSTCUTS |
334 | * |
335 | * idle double |
336 | * p2p double |
337 | * alert double |
338 | * panic double |
339 | * slope double |
340 | * fallback double |
341 | * |
342 | * P2P |
343 | * |
344 | * p2p-allowed boolean |
345 | * p2p-oncost boolean |
346 | * p2p-fortransfer boolean |
347 | * |
348 | * STAGING |
349 | * |
350 | * stage-allowed boolean |
351 | * stage-oncost boolean |
352 | * |
353 | * OTHER |
354 | * max-copies int |
355 | * |
356 | */ |
357 | private void scanParameter( Args args , PoolManagerParameter parameter ){ |
358 | |
359 | PoolManagerParameter paramDefault = _defaultPartitionInfo._parameter; |
360 | |
361 | String tmp = args.getOpt("spacecostfactor") ; |
362 | if( tmp != null ){ |
363 | if( tmp.equals("off") ){ |
364 | parameter.unsetSpaceCostFactor(); |
365 | parameter._spaceCostFactor = paramDefault._spaceCostFactor; |
366 | } else { |
367 | parameter.setSpaceCostFactor(Double.parseDouble(tmp)); |
368 | } |
369 | } |
370 | if( ( tmp = args.getOpt("cpucostfactor") ) != null ){ |
371 | if( tmp.equals("off") ){ |
372 | parameter.unsetPerformanceCostFactor(); |
373 | parameter._performanceCostFactor = paramDefault._performanceCostFactor; |
374 | } else { |
375 | parameter.setPerformanceCostFactor(Double.parseDouble(tmp)); |
376 | } |
377 | } |
378 | |
379 | if( ( tmp = args.getOpt("idle") ) != null ){ |
380 | if( tmp.equals("off") ){ |
381 | parameter.unsetMinCostCut(); |
382 | parameter._minCostCut = paramDefault._minCostCut; |
383 | } else { |
384 | parameter.setMinCostCut(Double.parseDouble(tmp)); |
385 | } |
386 | } |
387 | if( ( tmp = args.getOpt("p2p") ) != null ){ |
388 | if( tmp.equals("off") ){ |
389 | parameter.setCostCut( paramDefault.getCostCutString()); |
390 | parameter.unsetCostCut(); |
391 | } else { |
392 | parameter.setCostCut(tmp); |
393 | } |
394 | } |
395 | if( ( tmp = args.getOpt("alert") ) != null ){ |
396 | if( tmp.equals("off") ){ |
397 | parameter.unsetAlertCostCut(); |
398 | parameter._alertCostCut = paramDefault._alertCostCut; |
399 | } else { |
400 | parameter.setAlertCostCut(Double.parseDouble(tmp)); |
401 | } |
402 | } |
403 | if( ( tmp = args.getOpt("panic") ) != null ){ |
404 | if( tmp.equals("off") ){ |
405 | parameter.unsetPanicCostCut(); |
406 | parameter._panicCostCut = paramDefault._panicCostCut; |
407 | } else { |
408 | parameter.setPanicCostCut(Double.parseDouble(tmp)); |
409 | } |
410 | } |
411 | if( ( tmp = args.getOpt("slope") ) != null ){ |
412 | if( tmp.equals("off") ){ |
413 | parameter.unsetSlope(); |
414 | parameter._slope = paramDefault._slope; |
415 | } else { |
416 | parameter.setSlope(Double.parseDouble(tmp)); |
417 | } |
418 | } |
419 | |
420 | if( ( tmp = args.getOpt("fallback") ) != null ){ |
421 | if( tmp.equals("off") ){ |
422 | parameter.unsetFallbackCostCut(); |
423 | parameter._fallbackCostCut = paramDefault._fallbackCostCut; |
424 | } else { |
425 | parameter.setFallbackCostCut(Double.parseDouble(tmp)); |
426 | } |
427 | } |
428 | |
429 | if( ( tmp = args.getOpt("max-copies") ) != null ){ |
430 | if( tmp.equals("off") ){ |
431 | parameter.unsetMaxPnfsFileCopies(); |
432 | parameter._maxPnfsFileCopies = paramDefault._maxPnfsFileCopies; |
433 | } else { |
434 | parameter.setMaxPnfsFileCopies(Integer.parseInt(tmp)); |
435 | } |
436 | } |
437 | |
438 | if( ( tmp = args.getOpt("p2p-allowed") ) != null ){ |
439 | if( tmp.equals("off") ){ |
440 | parameter.unsetP2pAllowed(); |
441 | parameter._p2pAllowed = paramDefault._p2pAllowed; |
442 | |
443 | parameter.unsetP2pOnCost(); |
444 | parameter._p2pOnCost = paramDefault._p2pOnCost; |
445 | |
446 | parameter.unsetP2pForTransfer(); |
447 | parameter._p2pForTransfer = paramDefault._p2pForTransfer; |
448 | } else if( tmp.equals("yes") ){ |
449 | parameter.setP2pAllowed(true); |
450 | } else if( tmp.equals("no") ) { |
451 | parameter.setP2pAllowed(false); |
452 | parameter.setP2pOnCost(false); |
453 | parameter.setP2pForTransfer(false); |
454 | } else throw new |
455 | IllegalArgumentException("Usage: ... -p2p-allowed=yes|no|off"); |
456 | } |
457 | |
458 | if( ( tmp = args.getOpt("p2p-oncost") ) != null ){ |
459 | if( tmp.equals("off") ){ |
460 | parameter.unsetP2pOnCost(); |
461 | parameter._p2pOnCost = paramDefault._p2pOnCost; |
462 | } else if( tmp.equals("yes")){ |
463 | parameter.setP2pOnCost(true); |
464 | parameter.setP2pAllowed(true); |
465 | } else if( tmp.equals("no")){ |
466 | parameter.setP2pOnCost(false); |
467 | } else throw new |
468 | IllegalArgumentException("Usage: ... -p2p-oncost=yes|no|off"); |
469 | } |
470 | |
471 | if( ( tmp = args.getOpt("p2p-fortransfer") ) != null ){ |
472 | if( tmp.equals("off") ){ |
473 | parameter.unsetP2pForTransfer(); |
474 | parameter._p2pForTransfer = paramDefault._p2pForTransfer; |
475 | } else if( tmp.equals("yes") ){ |
476 | parameter.setP2pForTransfer(true); |
477 | parameter.setP2pAllowed(true); |
478 | } else if( tmp.equals("no") ){ |
479 | parameter.setP2pForTransfer(false); |
480 | } else throw new |
481 | IllegalArgumentException("Usage: ... -p2p-fortransfer=yes|no|off"); |
482 | } |
483 | |
484 | if( ( tmp = args.getOpt("stage-allowed") ) != null ){ |
485 | if( tmp.equals("off") ){ |
486 | parameter.unsetHasHsmBackend(); |
487 | parameter._hasHsmBackend = paramDefault._hasHsmBackend; |
488 | |
489 | parameter.unsetStageOnCost(); |
490 | parameter._stageOnCost = paramDefault._stageOnCost; |
491 | } else if( tmp.equals("yes") ){ |
492 | parameter.setHasHsmBackend(true); |
493 | } else if( tmp.equals("no") ){ |
494 | parameter.setHasHsmBackend(false); |
495 | parameter.setStageOnCost(false); |
496 | } else throw new |
497 | IllegalArgumentException("Usage: ... -stage-allowed=yes|no|off"); |
498 | } |
499 | |
500 | if( ( tmp = args.getOpt("stage-oncost") ) != null ){ |
501 | if( tmp.equals("off") ){ |
502 | parameter.unsetStageOnCost(); |
503 | parameter._stageOnCost = paramDefault._stageOnCost; |
504 | } else if( tmp.equals("yes") ){ |
505 | parameter.setStageOnCost(true); |
506 | parameter.setHasHsmBackend(true); |
507 | } else if( tmp.equals("no") ){ |
508 | parameter.setStageOnCost(false); |
509 | } else throw new |
510 | IllegalArgumentException("Usage: ... -stage-oncost=yes|no|off") ; |
511 | } |
512 | |
513 | } |
514 | private boolean _useLegacySetupPrintout = true ; |
515 | |
516 | @Override |
517 | public void beforeSetup() |
518 | { |
519 | clear(); |
520 | } |
521 | |
522 | @Override |
523 | public void printSetup(PrintWriter pw) |
524 | { |
525 | if (_useLegacySetupPrintout) { |
526 | dumpLegacyDefaultInfo(pw, _defaultPartitionInfo); |
527 | } else { |
528 | Info info = _infoMap.get("default"); |
529 | dumpInfo(pw, info); |
530 | } |
531 | for (Info info: _infoMap.values()) { |
532 | if (info._name.equals("default")) |
533 | continue; |
534 | pw.append("pm create ").append(info._name).append("\n"); |
535 | dumpInfo(pw, info); |
536 | } |
537 | } |
538 | |
539 | private void dumpInfo(PrintWriter pw, Info info) |
540 | { |
541 | PoolManagerParameter para = info._parameter; |
542 | |
543 | pw.append("pm set ").append(info._name).append(" "); |
544 | dumpCostOptions(pw, para); |
545 | pw.append("\n") ; |
546 | |
547 | pw.append("pm set ").append(info._name).append(" "); |
548 | dumpThresholdOptions(pw, para); |
549 | pw.append("\n"); |
550 | |
551 | pw.append("pm set ").append(info._name).append(" "); |
552 | dumpP2pOptions(pw, para); |
553 | pw.append("\n"); |
554 | |
555 | pw.append("pm set ").append(info._name).append(" "); |
556 | dumpStageOptions(pw, para); |
557 | pw.append("\n"); |
558 | |
559 | pw.append("pm set ").append(info._name).append(" "); |
560 | dumpMiscOptions(pw, para); |
561 | pw.append("\n"); |
562 | } |
563 | |
564 | private void dumpCostOptions(PrintWriter pw, PoolManagerParameter para) |
565 | { |
566 | pw.append(" -cpucostfactor=").print(para._performanceCostFactor); |
567 | pw.append(" -spacecostfactor=").print(para._spaceCostFactor); |
568 | } |
569 | |
570 | private void dumpThresholdOptions(PrintWriter pw, PoolManagerParameter para) |
571 | { |
572 | pw.append(" -idle=").print(para._minCostCut); |
573 | pw.append(" -p2p=").print(para.getCostCutString()); |
574 | pw.append(" -alert=").print(para._alertCostCut); |
575 | pw.append(" -halt=").print(para._panicCostCut); |
576 | pw.append(" -fallback=").print(para._fallbackCostCut); |
577 | } |
578 | |
579 | private void dumpP2pOptions(PrintWriter pw, PoolManagerParameter para) |
580 | { |
581 | if (!para._p2pAllowed) { |
582 | pw.append(" -p2p-allowed=no"); |
583 | } else { |
584 | pw.append(" -p2p-allowed=yes"); |
585 | pw.append(" -p2p-oncost=").print(para._p2pOnCost ? "yes":"no"); |
586 | pw.append(" -p2p-fortransfer=").print(para._p2pForTransfer ? "yes":"no"); |
587 | } |
588 | } |
589 | |
590 | private void dumpStageOptions(PrintWriter pw, PoolManagerParameter para) |
591 | { |
592 | if (!para._hasHsmBackend) { |
593 | pw.append(" -stage-allowed=no"); |
594 | } else { |
595 | pw.append(" -stage-allowed=yes"); |
596 | pw.append(" -stage-oncost=").print(para._stageOnCost ? "yes":"no"); |
597 | } |
598 | } |
599 | |
600 | private void dumpMiscOptions(PrintWriter pw, PoolManagerParameter para) |
601 | { |
602 | pw.append(" -max-copies=").print(para._maxPnfsFileCopies); |
603 | } |
604 | |
605 | /** |
606 | * legacy output |
607 | */ |
608 | private void dumpLegacyDefaultInfo(PrintWriter pw, Info info) |
609 | { |
610 | PoolManagerParameter para = info._parameter; |
611 | |
612 | pw.append("set pool decision"); |
613 | dumpCostOptions(pw, para); |
614 | pw.append("\n"); |
615 | |
616 | pw.append("set costcuts") ; |
617 | dumpThresholdOptions(pw, para); |
618 | pw.append("\n"); |
619 | |
620 | dumpP2pDefaultOptions(pw, para); |
621 | } |
622 | |
623 | private void dumpP2pDefaultOptions(PrintWriter pw, PoolManagerParameter para) |
624 | { |
625 | pw.append("rc set p2p " ).println(para._p2pAllowed ? "on":"off"); |
626 | if (para._p2pOnCost) |
627 | pw.println("rc set p2p oncost"); |
628 | if (para._p2pForTransfer ) |
629 | pw.println("rc set p2p fortransfer"); |
630 | pw.append("rc set stage oncost ").println(para._stageOnCost?"on":"off"); |
631 | pw.append("rc set stage ").println(para._hasHsmBackend?"on":"off"); |
632 | pw.append("rc set slope ").println(para._slope); |
633 | pw.append("rc set max copies ").println(para._maxPnfsFileCopies); |
634 | } |
635 | } |