Use case: queue X has all of its workload in non-default (exclusive) partition P (by setting app submission context's node label set to P). Node in partition Q != P heartbeats to RM. Capacity scheduler loops through every application in X, and every scheduler key in this application, and fails to allocate each time since the app's requested label and the node's label don't match. This causes huge performance degradation when number of apps in X is large.
To fix the issue, allow RM to configure partitions as "forced-exclusive". If partition P is "forced-exclusive", then:
- 1a. If app sets its submission context's node label to P, all its resource requests will be overridden to P
- 1b. If app sets its submission context's node label Q, any of its resource requests whose labels are P will be overridden to Q
- 2. In the scheduler, we add apps with node label expression P to a separate data structure. When a node in partition P heartbeats to scheduler, we only try to schedule apps in this data structure. When a node in partition Q heartbeats to scheduler, we schedule the rest of the apps as normal.