Program: 48406
Project: 48406
Buggy source:
private boolean placeDisk(VirtualNode vNode,AbstractHost host){
  AbstractHost clonedHost=AbstractHost.clone(host);
  Map<BaseNode,List<DiskSpec>> result=new HashMap<BaseNode,List<DiskSpec>>();
  for (  BaseNode node : vNode.getBaseNodes()) {
    List<DiskSpec> disks;
    List<AbstractDatastore> imagestores=clonedHost.getDatastores(node.getImagestoreNamePattern());
    List<AbstractDatastore> diskstores=clonedHost.getDatastores(node.getDiskstoreNamePattern());
    List<DiskSpec> systemDisks=new ArrayList<DiskSpec>();
    List<DiskSpec> unseparable=new ArrayList<DiskSpec>();
    List<DiskSpec> separable=new ArrayList<DiskSpec>();
    List<DiskSpec> removed=new ArrayList<DiskSpec>();
    for (    DiskSpec disk : node.getDisks()) {
      if (disk.getSplitPolicy() != null && DiskSplitPolicy.BI_SECTOR.equals(disk.getSplitPolicy())) {
        int half=disk.getSize() / 2;
        unseparable.add(new DiskSpec(disk.getName().split("String_Node_Str")[0] + "String_Node_Str",half,node.getVmName(),false,disk.getDiskType(),disk.getController(),null,disk.getAllocType(),null,null,null));
        unseparable.add(new DiskSpec(disk.getName().split("String_Node_Str")[0] + "String_Node_Str",disk.getSize() - half,node.getVmName(),false,disk.getDiskType(),disk.getController(),null,disk.getAllocType(),null,null,null));
        removed.add(disk);
      }
    }
    node.getDisks().removeAll(removed);
    for (    DiskSpec disk : node.getDisks()) {
      if (DiskType.DATA_DISK == disk.getDiskType()) {
        if (disk.isSeparable()) {
          separable.add(disk);
        }
 else {
          unseparable.add(disk);
        }
      }
 else {
        systemDisks.add(disk);
      }
    }
    disks=placeUnSeparableDisks(systemDisks,imagestores);
    if (disks == null) {
      logger.info("String_Node_Str" + getDiskSize(systemDisks) + "String_Node_Str"+ getDsFree(imagestores)+ "String_Node_Str");
      return false;
    }
    List<DiskSpec> subDisks=null;
    if (unseparable != null && unseparable.size() != 0) {
      subDisks=placeUnSeparableDisks(unseparable,diskstores);
      if (subDisks == null) {
        logger.info("String_Node_Str" + getDiskSize(unseparable) + "String_Node_Str"+ getDsFree(diskstores)+ "String_Node_Str");
        return false;
      }
 else {
        disks.addAll(subDisks);
      }
    }
    if (separable != null && separable.size() != 0) {
      subDisks=placeSeparableDisks(separable,diskstores);
      if (subDisks == null) {
        logger.info("String_Node_Str" + getDiskSize(separable) + "String_Node_Str"+ getDsFree(diskstores)+ "String_Node_Str");
        return false;
      }
 else {
        disks.addAll(subDisks);
      }
    }
    result.put(node,disks);
  }
  for (  BaseNode node : vNode.getBaseNodes()) {
    AuAssert.check(result.get(node) != null);
    node.setDisks(result.get(node));
  }
  return true;
}

Fixed version (ground truth):
private boolean placeDisk(VirtualNode vNode,AbstractHost host){
  AbstractHost clonedHost=AbstractHost.clone(host);
  Map<BaseNode,List<DiskSpec>> result=new HashMap<BaseNode,List<DiskSpec>>();
  for (  BaseNode node : vNode.getBaseNodes()) {
    List<DiskSpec> disks;
    List<AbstractDatastore> imagestores=clonedHost.getDatastores(node.getImagestoreNamePattern());
    List<AbstractDatastore> diskstores=clonedHost.getDatastores(node.getDiskstoreNamePattern());
    List<DiskSpec> systemDisks=new ArrayList<DiskSpec>();
    List<DiskSpec> unseparable=new ArrayList<DiskSpec>();
    List<DiskSpec> separable=new ArrayList<DiskSpec>();
    List<DiskSpec> removed=new ArrayList<DiskSpec>();
    for (    DiskSpec disk : node.getDisks()) {
      if (disk.getSplitPolicy() != null && DiskSplitPolicy.BI_SECTOR.equals(disk.getSplitPolicy())) {
        int half=disk.getSize() / 2;
        unseparable.add(new DiskSpec(disk.getName().split("String_Node_Str")[0] + "String_Node_Str",half,node.getVmName(),false,disk.getDiskType(),disk.getController(),null,disk.getAllocType(),null,null,null));
        unseparable.add(new DiskSpec(disk.getName().split("String_Node_Str")[0] + "String_Node_Str",disk.getSize() - half,node.getVmName(),false,disk.getDiskType(),disk.getController(),null,disk.getAllocType(),null,null,null));
        removed.add(disk);
      }
    }
    node.getDisks().removeAll(removed);
    for (    DiskSpec disk : node.getDisks()) {
      if (DiskType.DATA_DISK == disk.getDiskType()) {
        if (disk.isSeparable()) {
          separable.add(disk);
        }
 else {
          unseparable.add(disk);
        }
      }
 else {
        systemDisks.add(disk);
      }
    }
    disks=placeUnSeparableDisks(systemDisks,imagestores);
    logger.info("String_Node_Str" + new Gson().toJson(imagestores));
    if (disks == null) {
      logger.info("String_Node_Str" + getDiskSize(systemDisks) + "String_Node_Str"+ getDsFree(imagestores)+ "String_Node_Str");
      return false;
    }
    List<DiskSpec> subDisks=null;
    if (unseparable != null && unseparable.size() != 0) {
      subDisks=placeUnSeparableDisks(unseparable,diskstores);
      if (subDisks == null) {
        logger.info("String_Node_Str" + getDiskSize(unseparable) + "String_Node_Str"+ getDsFree(diskstores)+ "String_Node_Str");
        return false;
      }
 else {
        disks.addAll(subDisks);
      }
    }
    if (separable != null && separable.size() != 0) {
      subDisks=placeSeparableDisks(separable,diskstores);
      if (subDisks == null) {
        logger.info("String_Node_Str" + getDiskSize(separable) + "String_Node_Str"+ getDsFree(diskstores)+ "String_Node_Str");
        return false;
      }
 else {
        disks.addAll(subDisks);
      }
    }
    result.put(node,disks);
  }
  for (  BaseNode node : vNode.getBaseNodes()) {
    AuAssert.check(result.get(node) != null);
    node.setDisks(result.get(node));
  }
  return true;
}