private String getNextAvailableValue()

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();
  }