Program: 177417
Project: 177417
Buggy source:
/** 
 * Sets the block id, data and auxData for the block at (x, y, z), if the current data matches the expected data.<br>
 * @param x the x coordinate
 * @param y the y coordinate
 * @param z the z coordinate
 * @param expectId the expected block id
 * @param expectData the expected block data
 * @param expectAuxData the expected block auxiliary data
 * @param newId the new block id
 * @param newData the new block data
 * @param newAuxData the new block auxiliary data
 * @return true if the block was set
 */
public boolean compareAndSetBlock(int x,int y,int z,short expectId,short expectData,short newId,short newData){
  int index=getIndex(x,y,z);
  int spins=0;
  boolean interrupted=false;
  try {
    while (true) {
      if (spins++ > SPINS) {
        interrupted|=atomicWait();
      }
      checkCompressing();
      short oldBlockId=blockIds.get(index);
      boolean oldReserved=auxStore.isReserved(oldBlockId);
      if (!oldReserved) {
        if (blockIds.get(index) != expectId || expectData != 0) {
          return false;
        }
      }
 else {
        int seq=auxStore.getSequence(oldBlockId);
        short oldId=auxStore.getId(oldBlockId);
        short oldData=auxStore.getData(oldBlockId);
        if (!testSequence(x,y,z,seq)) {
          continue;
        }
        if (oldId != expectId || oldData != expectData) {
          return false;
        }
      }
      if (newData == 0 && !auxStore.isReserved(newId)) {
        if (!blockIds.compareAndSet(index,oldBlockId,newId)) {
          continue;
        }
      }
 else {
        int newIndex=auxStore.add(newId,newData);
        if (!blockIds.compareAndSet(index,oldBlockId,(short)newIndex)) {
          auxStore.remove(newIndex);
          continue;
        }
      }
      if (oldReserved) {
        auxStore.remove(oldBlockId);
      }
      markDirty(x,y,z);
      return true;
    }
  }
  finally {
    atomicNotify();
    if (interrupted) {
      Thread.currentThread().interrupt();
    }
  }
}

Fixed version (ground truth):
/** 
 * Sets the block id, data and auxData for the block at (x, y, z), if the current data matches the expected data.<br>
 * @param x the x coordinate
 * @param y the y coordinate
 * @param z the z coordinate
 * @param expectId the expected block id
 * @param expectData the expected block data
 * @param expectAuxData the expected block auxiliary data
 * @param newId the new block id
 * @param newData the new block data
 * @param newAuxData the new block auxiliary data
 * @return true if the block was set
 */
public boolean compareAndSetBlock(int x,int y,int z,short expectId,short expectData,short newId,short newData){
  int index=getIndex(x,y,z);
  int spins=0;
  boolean interrupted=false;
  try {
    while (true) {
      if (spins++ > SPINS) {
        interrupted|=atomicWait(index);
      }
      checkCompressing();
      short oldBlockId=blockIds.get(index);
      boolean oldReserved=auxStore.isReserved(oldBlockId);
      if (!oldReserved) {
        if (blockIds.get(index) != expectId || expectData != 0) {
          return false;
        }
      }
 else {
        int seq=auxStore.getSequence(oldBlockId);
        short oldId=auxStore.getId(oldBlockId);
        short oldData=auxStore.getData(oldBlockId);
        if (!testSequence(x,y,z,seq)) {
          continue;
        }
        if (oldId != expectId || oldData != expectData) {
          return false;
        }
      }
      if (newData == 0 && !auxStore.isReserved(newId)) {
        if (!blockIds.compareAndSet(index,oldBlockId,newId)) {
          continue;
        }
      }
 else {
        int newIndex=auxStore.add(newId,newData);
        if (!blockIds.compareAndSet(index,oldBlockId,(short)newIndex)) {
          auxStore.remove(newIndex);
          continue;
        }
      }
      if (oldReserved) {
        auxStore.remove(oldBlockId);
      }
      markDirty(x,y,z);
      return true;
    }
  }
  finally {
    atomicNotify(index);
    if (interrupted) {
      Thread.currentThread().interrupt();
    }
  }
}