Program: 7667
Project: 7667
Buggy source:
private void scheduleReloadJob(final String trigger){
  if (reloadJob != null)   reloadJob.cancel();
  if (!checkRepository())   return;
  reloadJob=new Job(getReloadJobName()){
    @Override protected IStatus run(    IProgressMonitor monitor){
      waitForWorkspaceLock();
      if (monitor.isCanceled())       return Status.CANCEL_STATUS;
      lock.lock();
      try {
        long startTime=System.currentTimeMillis();
        IndexDiff result=calcIndexDiff(monitor,getName());
        if (monitor.isCanceled())         return Status.CANCEL_STATUS;
        indexDiffData=new IndexDiffData(result);
        if (GitTraceLocation.INDEXDIFFCACHE.isActive()) {
          long time=System.currentTimeMillis() - startTime;
          StringBuilder message=new StringBuilder(getTraceMessage(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();
      }
    }
    private String getTraceMessage(    long time){
      return NLS.bind("String_Node_Str",new Object[]{Long.valueOf(time),trigger,repository.getWorkTree().getName()});
    }
    @Override public boolean belongsTo(    Object family){
      if (family.equals(JobFamilies.INDEX_DIFF_CACHE_UPDATE))       return true;
      return super.belongsTo(family);
    }
  }
;
  reloadJob.schedule();
}

Fixed version (ground truth):
private void scheduleReloadJob(final String trigger){
  if (reloadJob != null)   reloadJob.cancel();
  if (!checkRepository())   return;
  reloadJob=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();
        IndexDiff result=calcIndexDiff(monitor,getName());
        if (monitor.isCanceled())         return Status.CANCEL_STATUS;
        indexDiffData=new IndexDiffData(result);
        if (GitTraceLocation.INDEXDIFFCACHE.isActive()) {
          long time=System.currentTimeMillis() - startTime;
          StringBuilder message=new StringBuilder(getTraceMessage(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();
      }
    }
    private String getTraceMessage(    long time){
      return NLS.bind("String_Node_Str",new Object[]{Long.valueOf(time),trigger,repository.getWorkTree().getName()});
    }
    @Override public boolean belongsTo(    Object family){
      if (family.equals(JobFamilies.INDEX_DIFF_CACHE_UPDATE))       return true;
      return super.belongsTo(family);
    }
  }
;
  reloadJob.schedule();
}