code: void doneTasklets(final String workerId, final List<Integer> taskletIds) {
      lock.lock();
      try {
        if (!terminated && runningWorkers.containsKey(workerId)) { // Preemption can come before
          final VortexWorkerManager worker = this.runningWorkers.get(workerId);
          final List<Tasklet> tasklets = worker.taskletsDone(taskletIds);
          this.schedulingPolicy.taskletsDone(worker, tasklets);
  
          taskletsToCancel.removeAll(taskletIds); // cleanup to prevent memory leak.
  
          // Notify (possibly) waiting scheduler
          noWorkerOrResource.signal();
        }
      } finally {
        lock.unlock();
      }
    }
docs: Concurrency: Called by multiple threads.
  Parameter: Same arguments can come in multiple times.
  (e.g. preemption message coming before tasklet completion message multiple times)