Program: 91489
Project: 91489
Buggy source:
private void scheduleUpdateJob(final Collection<String> filesToUpdate,final Collection<IResource> resourcesToUpdate){
  if (!checkRepository())   return;
  Job job=new Job(getReloadJobName()){
    @Override protected IStatus run(    IProgressMonitor monitor){
      waitForWorkspaceLock();
      if (monitor.isCanceled())       return Status.CANCEL_STATUS;
      lock.lock();
      try {
        long startTime=System.currentTimeMillis();
        IndexDiffData result=calcIndexDiffData(monitor,getName(),filesToUpdate,resourcesToUpdate);
        if (monitor.isCanceled())         return Status.CANCEL_STATUS;
        indexDiffData=result;
        if (GitTraceLocation.INDEXDIFFCACHE.isActive()) {
          long time=System.currentTimeMillis() - startTime;
          StringBuilder message=new StringBuilder(NLS.bind("String_Node_Str",Integer.valueOf(resourcesToUpdate.size()),Long.valueOf(time)));
          GitTraceLocation.getTrace().trace(GitTraceLocation.INDEXDIFFCACHE.getLocation(),message.append(indexDiffData.toString()).toString());
        }
        notifyListeners();
        return Status.OK_STATUS;
      }
 catch (      RuntimeException e) {
        if (GitTraceLocation.INDEXDIFFCACHE.isActive())         GitTraceLocation.getTrace().trace(GitTraceLocation.INDEXDIFFCACHE.getLocation(),"String_Node_Str",e);
        scheduleReloadJob("String_Node_Str");
        return Status.OK_STATUS;
      }
 finally {
        lock.unlock();
      }
    }
    @Override public boolean belongsTo(    Object family){
      if (family.equals(JobFamilies.INDEX_DIFF_CACHE_UPDATE))       return true;
      return super.belongsTo(family);
    }
  }
;
  job.schedule();
}

Fixed version (ground truth):
private void scheduleUpdateJob(final Collection<String> filesToUpdate,final Collection<IResource> resourcesToUpdate){
  if (!checkRepository())   return;
  Job job=new Job(getReloadJobName()){
    @Override protected IStatus run(    IProgressMonitor monitor){
      waitForWorkspaceLock(monitor);
      if (monitor.isCanceled())       return Status.CANCEL_STATUS;
      lock.lock();
      try {
        long startTime=System.currentTimeMillis();
        IndexDiffData result=calcIndexDiffData(monitor,getName(),filesToUpdate,resourcesToUpdate);
        if (monitor.isCanceled())         return Status.CANCEL_STATUS;
        indexDiffData=result;
        if (GitTraceLocation.INDEXDIFFCACHE.isActive()) {
          long time=System.currentTimeMillis() - startTime;
          StringBuilder message=new StringBuilder(NLS.bind("String_Node_Str",Integer.valueOf(resourcesToUpdate.size()),Long.valueOf(time)));
          GitTraceLocation.getTrace().trace(GitTraceLocation.INDEXDIFFCACHE.getLocation(),message.append(indexDiffData.toString()).toString());
        }
        notifyListeners();
        return Status.OK_STATUS;
      }
 catch (      RuntimeException e) {
        if (GitTraceLocation.INDEXDIFFCACHE.isActive())         GitTraceLocation.getTrace().trace(GitTraceLocation.INDEXDIFFCACHE.getLocation(),"String_Node_Str",e);
        scheduleReloadJob("String_Node_Str");
        return Status.OK_STATUS;
      }
 finally {
        lock.unlock();
      }
    }
    @Override public boolean belongsTo(    Object family){
      if (family.equals(JobFamilies.INDEX_DIFF_CACHE_UPDATE))       return true;
      return super.belongsTo(family);
    }
  }
;
  job.schedule();
}