@@ -302,55 +302,70 @@ public void reloadAllocs() throws IOException, ParserConfigurationException,
302302 throw new AllocationConfigurationException ("Bad fair scheduler config " +
303303 "file: top-level element not <allocations>" );
304304 NodeList elements = root .getChildNodes ();
305+ List <Element > queueElements = new ArrayList <Element >();
305306 for (int i = 0 ; i < elements .getLength (); i ++) {
306307 Node node = elements .item (i );
307- if (!(node instanceof Element ))
308- continue ;
309- Element element = (Element )node ;
310- if ("queue" .equals (element .getTagName ()) ||
311- "pool" .equals (element .getTagName ())) {
312- loadQueue ("root" , element , minQueueResources , maxQueueResources , queueMaxApps ,
313- userMaxApps , queueWeights , queuePolicies , minSharePreemptionTimeouts ,
314- queueAcls , queueNamesInAllocFile );
315- } else if ("user" .equals (element .getTagName ())) {
316- String userName = element .getAttribute ("name" );
317- NodeList fields = element .getChildNodes ();
318- for (int j = 0 ; j < fields .getLength (); j ++) {
319- Node fieldNode = fields .item (j );
320- if (!(fieldNode instanceof Element ))
321- continue ;
322- Element field = (Element ) fieldNode ;
323- if ("maxRunningApps" .equals (field .getTagName ())) {
324- String text = ((Text )field .getFirstChild ()).getData ().trim ();
325- int val = Integer .parseInt (text );
326- userMaxApps .put (userName , val );
308+ if (node instanceof Element ) {
309+ Element element = (Element )node ;
310+ if ("queue" .equals (element .getTagName ()) ||
311+ "pool" .equals (element .getTagName ())) {
312+ queueElements .add (element );
313+ } else if ("user" .equals (element .getTagName ())) {
314+ String userName = element .getAttribute ("name" );
315+ NodeList fields = element .getChildNodes ();
316+ for (int j = 0 ; j < fields .getLength (); j ++) {
317+ Node fieldNode = fields .item (j );
318+ if (!(fieldNode instanceof Element ))
319+ continue ;
320+ Element field = (Element ) fieldNode ;
321+ if ("maxRunningApps" .equals (field .getTagName ())) {
322+ String text = ((Text )field .getFirstChild ()).getData ().trim ();
323+ int val = Integer .parseInt (text );
324+ userMaxApps .put (userName , val );
325+ }
327326 }
327+ } else if ("userMaxAppsDefault" .equals (element .getTagName ())) {
328+ String text = ((Text )element .getFirstChild ()).getData ().trim ();
329+ int val = Integer .parseInt (text );
330+ userMaxAppsDefault = val ;
331+ } else if ("fairSharePreemptionTimeout" .equals (element .getTagName ())) {
332+ String text = ((Text )element .getFirstChild ()).getData ().trim ();
333+ long val = Long .parseLong (text ) * 1000L ;
334+ fairSharePreemptionTimeout = val ;
335+ } else if ("defaultMinSharePreemptionTimeout" .equals (element .getTagName ())) {
336+ String text = ((Text )element .getFirstChild ()).getData ().trim ();
337+ long val = Long .parseLong (text ) * 1000L ;
338+ defaultMinSharePreemptionTimeout = val ;
339+ } else if ("queueMaxAppsDefault" .equals (element .getTagName ())) {
340+ String text = ((Text )element .getFirstChild ()).getData ().trim ();
341+ int val = Integer .parseInt (text );
342+ queueMaxAppsDefault = val ;
343+ } else if ("defaultQueueSchedulingPolicy" .equals (element .getTagName ())
344+ || "defaultQueueSchedulingMode" .equals (element .getTagName ())) {
345+ String text = ((Text )element .getFirstChild ()).getData ().trim ();
346+ SchedulingPolicy .setDefault (text );
347+ defaultSchedPolicy = SchedulingPolicy .getDefault ();
348+ } else {
349+ LOG .warn ("Bad element in allocations file: " + element .getTagName ());
328350 }
329- } else if ("userMaxAppsDefault" .equals (element .getTagName ())) {
330- String text = ((Text )element .getFirstChild ()).getData ().trim ();
331- int val = Integer .parseInt (text );
332- userMaxAppsDefault = val ;
333- } else if ("fairSharePreemptionTimeout" .equals (element .getTagName ())) {
334- String text = ((Text )element .getFirstChild ()).getData ().trim ();
335- long val = Long .parseLong (text ) * 1000L ;
336- fairSharePreemptionTimeout = val ;
337- } else if ("defaultMinSharePreemptionTimeout" .equals (element .getTagName ())) {
338- String text = ((Text )element .getFirstChild ()).getData ().trim ();
339- long val = Long .parseLong (text ) * 1000L ;
340- defaultMinSharePreemptionTimeout = val ;
341- } else if ("queueMaxAppsDefault" .equals (element .getTagName ())) {
342- String text = ((Text )element .getFirstChild ()).getData ().trim ();
343- int val = Integer .parseInt (text );
344- queueMaxAppsDefault = val ;
345- } else if ("defaultQueueSchedulingPolicy" .equals (element .getTagName ())
346- || "defaultQueueSchedulingMode" .equals (element .getTagName ())) {
347- String text = ((Text )element .getFirstChild ()).getData ().trim ();
348- SchedulingPolicy .setDefault (text );
349- defaultSchedPolicy = SchedulingPolicy .getDefault ();
350- } else {
351- LOG .warn ("Bad element in allocations file: " + element .getTagName ());
352351 }
353352 }
353+
354+ // Load queue elements. A root queue can either be included or omitted. If
355+ // it's included, all other queues must be inside it.
356+ for (Element element : queueElements ) {
357+ String parent = "root" ;
358+ if (element .getAttribute ("name" ).equalsIgnoreCase ("root" )) {
359+ if (queueElements .size () > 1 ) {
360+ throw new AllocationConfigurationException ("If configuring root queue,"
361+ + " no other queues can be placed alongside it." );
362+ }
363+ parent = null ;
364+ }
365+ loadQueue (parent , element , minQueueResources , maxQueueResources , queueMaxApps ,
366+ userMaxApps , queueWeights , queuePolicies , minSharePreemptionTimeouts ,
367+ queueAcls , queueNamesInAllocFile );
368+ }
354369
355370 // Commit the reload; also create any queue defined in the alloc file
356371 // if it does not already exist, so it can be displayed on the web UI.
@@ -398,7 +413,10 @@ private void loadQueue(String parentName, Element element, Map<String, Resource>
398413 Map <String , Long > minSharePreemptionTimeouts ,
399414 Map <String , Map <QueueACL , AccessControlList >> queueAcls , List <String > queueNamesInAllocFile )
400415 throws AllocationConfigurationException {
401- String queueName = parentName + "." + element .getAttribute ("name" );
416+ String queueName = element .getAttribute ("name" );
417+ if (parentName != null ) {
418+ queueName = parentName + "." + queueName ;
419+ }
402420 Map <QueueACL , AccessControlList > acls =
403421 new HashMap <QueueACL , AccessControlList >();
404422 NodeList fields = element .getChildNodes ();
0 commit comments