public boolean resolve()

in agent/src/jetbrains/buildServer/swabra/processes/LockedFileResolver.java [75:130]


  public boolean resolve(@NotNull File f, boolean kill, @Nullable Listener listener) {
    Collection<ProcessInfo> processes = getLockingProcesses(f, listener);
    if (processes == null) return false;

    if (processes.isEmpty()) {
      log("No processes found locking files in directory \"" + f + "\"", false, listener);
      return false;
    } else {
      final StringBuilder sb = new StringBuilder("Found ").append(StringUtil.pluralize("process", processes.size())).append(" locking files in directory \"").append(f).append("\":");
      appendProcessInfos(processes, sb);
      log(sb.toString(), true, listener);
    }

    List<ProcessInfo> ignored = new ArrayList<>();

    if (kill) {
      log("Will try to kill locking processes", false, listener);
      for (final ProcessInfo p : processes) {
        if (isIgnored(p)) {
          ignored.add(p);
          log("The following process and it's subtree has been skipped to avoid stopping of TeamCity agent:\n" + getProcessString(p), true, listener);
          continue;
        }

        try {
          if (ProcessTreeTerminator.kill(p.getPid(), new KillProcessDetails(new ProcessFilter() {
            @Override
            public boolean accept(@NotNull ProcessNode processNode) {
              return !isIgnored(processNode.getPid());
            }
          }, true))) {
            log("Process killed:\n" + getProcessString(p), false, listener);
          } else {
            logFailedToKill(p, null, listener);
          }
        } catch (Exception e) {
          logFailedToKill(p, e.getMessage(), listener);
        }
      }

      Collection<ProcessInfo> aliveProcesses = getLockingProcesses(f, listener);
      if (aliveProcesses == null) return false;

      List<ProcessInfo> processesLeft = new ArrayList<ProcessInfo>();
      processesLeft.removeAll(ignored);

      if (processesLeft.isEmpty()) return true;

      final StringBuilder sb
        = new StringBuilder("Failed to kill some of the ").append(StringUtil.pluralize("process", processesLeft.size())).append(" locking files in directory \"").append(f).append("\":");
      appendProcessInfos(processesLeft, sb);
      log(sb.toString(), true, listener);
    }

    return false;
  }