in server/src/jetbrains/buildServer/sharedResources/server/SharedResourcesStartBuildPrecondition.java [300:330]
private String getNextAvailableValue(@NotNull final CustomResource resource,
@NotNull final Map<Resource, TakenLock> takenLocks,
@NotNull final DistributionDataAccessor accessor) {
final List<String> allValues = new ArrayList<>(resource.getValues());
// remove all values reserved by other builds in current distribution cycle
Map<Long, String> reservedOnDistributionCycle = accessor.getReservedValuesProvider().getReservedValues(resource);
List<String> reservedValues = new ArrayList<>(reservedOnDistributionCycle.values());
// remove values from taken locks
final TakenLock takenLock = takenLocks.get(resource);
if (takenLock != null) {
takenLock.getReadLocks().forEach((bp, val) -> {
if (reservedOnDistributionCycle.containsKey(bp.getId())) return; // already added
reservedValues.add(val);
});
}
for (String reserved: reservedValues) {
Iterator<String> availableIt = allValues.iterator();
while (availableIt.hasNext()) {
String value = availableIt.next();
if (reserved.equals(value)) {
availableIt.remove();
// we should only remove one value, not all of them
// because some resources have duplicate values configured
break;
}
}
}
return allValues.isEmpty() ? null : allValues.iterator().next();
}