Program: 105504
Project: 105504
Buggy source:
private KVMPhysicalDisk createDiskFromTemplateOnRBD(KVMPhysicalDisk template,String name,PhysicalDiskFormat format,Storage.ProvisioningType provisioningType,long size,KVMStoragePool destPool,int timeout){
  KVMStoragePool srcPool=template.getPool();
  KVMPhysicalDisk disk=null;
  String newUuid=name;
  format=PhysicalDiskFormat.RAW;
  disk=new KVMPhysicalDisk(destPool.getSourceDir() + "String_Node_Str" + newUuid,newUuid,destPool);
  disk.setFormat(format);
  if (size > template.getVirtualSize()) {
    disk.setSize(size);
    disk.setVirtualSize(size);
  }
 else {
    disk.setSize(template.getVirtualSize());
    disk.setVirtualSize(disk.getSize());
  }
  QemuImg qemu=new QemuImg(timeout);
  QemuImgFile srcFile;
  QemuImgFile destFile=new QemuImgFile(KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),destPool.getSourcePort(),destPool.getAuthUserName(),destPool.getAuthSecret(),disk.getPath()));
  destFile.setFormat(format);
  if (srcPool.getType() != StoragePoolType.RBD) {
    srcFile=new QemuImgFile(template.getPath(),template.getFormat());
    try {
      qemu.convert(srcFile,destFile);
    }
 catch (    QemuImgException e) {
      s_logger.error("String_Node_Str" + disk.getPath() + "String_Node_Str"+ e.getMessage());
    }
  }
 else {
    try {
      if ((srcPool.getSourceHost().equals(destPool.getSourceHost())) && (srcPool.getSourceDir().equals(destPool.getSourceDir()))) {
        s_logger.debug("String_Node_Str");
        Rados r=new Rados(srcPool.getAuthUserName());
        r.confSet("String_Node_Str",srcPool.getSourceHost() + "String_Node_Str" + srcPool.getSourcePort());
        r.confSet("String_Node_Str",srcPool.getAuthSecret());
        r.confSet("String_Node_Str","String_Node_Str");
        r.connect();
        s_logger.debug("String_Node_Str" + r.confGet("String_Node_Str"));
        IoCTX io=r.ioCtxCreate(srcPool.getSourceDir());
        Rbd rbd=new Rbd(io);
        RbdImage srcImage=rbd.open(template.getName());
        if (srcImage.isOldFormat()) {
          s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ disk.getVirtualSize()+ "String_Node_Str");
          rbd.create(disk.getName(),disk.getVirtualSize(),rbdFeatures,rbdOrder);
          RbdImage destImage=rbd.open(disk.getName());
          s_logger.debug("String_Node_Str" + srcImage.getName() + "String_Node_Str"+ destImage.getName()+ "String_Node_Str"+ srcPool.getSourceDir());
          rbd.copy(srcImage,destImage);
          s_logger.debug("String_Node_Str" + srcImage.getName() + "String_Node_Str"+ destImage.getName()+ "String_Node_Str"+ srcPool.getSourceDir());
          rbd.close(destImage);
        }
 else {
          s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ this.rbdTemplateSnapName);
          s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ rbdTemplateSnapName+ "String_Node_Str");
          List<RbdSnapInfo> snaps=srcImage.snapList();
          s_logger.debug("String_Node_Str" + snaps.size() + "String_Node_Str"+ srcPool.getSourceDir()+ "String_Node_Str"+ template.getName());
          boolean snapFound=false;
          for (          RbdSnapInfo snap : snaps) {
            if (rbdTemplateSnapName.equals(snap.name)) {
              s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ rbdTemplateSnapName+ "String_Node_Str");
              snapFound=true;
              break;
            }
          }
          if (!snapFound) {
            s_logger.debug("String_Node_Str" + rbdTemplateSnapName + "String_Node_Str"+ name);
            srcImage.snapCreate(rbdTemplateSnapName);
            s_logger.debug("String_Node_Str" + rbdTemplateSnapName + "String_Node_Str"+ name);
            srcImage.snapProtect(rbdTemplateSnapName);
          }
          rbd.clone(template.getName(),this.rbdTemplateSnapName,io,disk.getName(),this.rbdFeatures,this.rbdOrder);
          s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ this.rbdTemplateSnapName+ "String_Node_Str"+ disk.getName());
        }
        rbd.close(srcImage);
        r.ioCtxDestroy(io);
      }
 else {
        s_logger.debug("String_Node_Str");
        Rados rSrc=new Rados(srcPool.getAuthUserName());
        rSrc.confSet("String_Node_Str",srcPool.getSourceHost() + "String_Node_Str" + srcPool.getSourcePort());
        rSrc.confSet("String_Node_Str",srcPool.getAuthSecret());
        rSrc.confSet("String_Node_Str","String_Node_Str");
        rSrc.connect();
        s_logger.debug("String_Node_Str" + rSrc.confGet("String_Node_Str"));
        Rados rDest=new Rados(destPool.getAuthUserName());
        rDest.confSet("String_Node_Str",destPool.getSourceHost() + "String_Node_Str" + destPool.getSourcePort());
        rDest.confSet("String_Node_Str",destPool.getAuthSecret());
        rDest.confSet("String_Node_Str","String_Node_Str");
        rDest.connect();
        s_logger.debug("String_Node_Str" + rDest.confGet("String_Node_Str"));
        IoCTX sIO=rSrc.ioCtxCreate(srcPool.getSourceDir());
        Rbd sRbd=new Rbd(sIO);
        IoCTX dIO=rDest.ioCtxCreate(destPool.getSourceDir());
        Rbd dRbd=new Rbd(dIO);
        s_logger.debug("String_Node_Str" + disk.getName() + "String_Node_Str"+ rDest.confGet("String_Node_Str")+ "String_Node_Str"+ destPool.getSourceDir());
        dRbd.create(disk.getName(),disk.getVirtualSize(),rbdFeatures,rbdOrder);
        RbdImage srcImage=sRbd.open(template.getName());
        RbdImage destImage=dRbd.open(disk.getName());
        s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ rSrc.confGet("String_Node_Str")+ "String_Node_Str"+ disk.getName()+ "String_Node_Str"+ rDest.confGet("String_Node_Str"));
        sRbd.copy(srcImage,destImage);
        sRbd.close(srcImage);
        dRbd.close(destImage);
        rSrc.ioCtxDestroy(sIO);
        rDest.ioCtxDestroy(dIO);
      }
    }
 catch (    RadosException e) {
      s_logger.error("String_Node_Str" + e.getMessage());
      disk=null;
    }
catch (    RbdException e) {
      s_logger.error("String_Node_Str" + e.getMessage());
      disk=null;
    }
  }
  return disk;
}

Fixed version (ground truth):
private KVMPhysicalDisk createDiskFromTemplateOnRBD(KVMPhysicalDisk template,String name,PhysicalDiskFormat format,Storage.ProvisioningType provisioningType,long size,KVMStoragePool destPool,int timeout){
  KVMStoragePool srcPool=template.getPool();
  KVMPhysicalDisk disk=null;
  String newUuid=name;
  format=PhysicalDiskFormat.RAW;
  disk=new KVMPhysicalDisk(destPool.getSourceDir() + "String_Node_Str" + newUuid,newUuid,destPool);
  disk.setFormat(format);
  if (size > template.getVirtualSize()) {
    disk.setSize(size);
    disk.setVirtualSize(size);
  }
 else {
    disk.setSize(template.getVirtualSize());
    disk.setVirtualSize(disk.getSize());
  }
  QemuImg qemu=new QemuImg(timeout);
  QemuImgFile srcFile;
  QemuImgFile destFile=new QemuImgFile(KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),destPool.getSourcePort(),destPool.getAuthUserName(),destPool.getAuthSecret(),disk.getPath()));
  destFile.setFormat(format);
  if (srcPool.getType() != StoragePoolType.RBD) {
    srcFile=new QemuImgFile(template.getPath(),template.getFormat());
    try {
      qemu.convert(srcFile,destFile);
    }
 catch (    QemuImgException e) {
      s_logger.error("String_Node_Str" + disk.getPath() + "String_Node_Str"+ e.getMessage());
    }
  }
 else {
    try {
      if ((srcPool.getSourceHost().equals(destPool.getSourceHost())) && (srcPool.getSourceDir().equals(destPool.getSourceDir()))) {
        s_logger.debug("String_Node_Str");
        Rados r=new Rados(srcPool.getAuthUserName());
        r.confSet("String_Node_Str",srcPool.getSourceHost() + "String_Node_Str" + srcPool.getSourcePort());
        r.confSet("String_Node_Str",srcPool.getAuthSecret());
        r.confSet("String_Node_Str","String_Node_Str");
        r.connect();
        s_logger.debug("String_Node_Str" + r.confGet("String_Node_Str"));
        IoCTX io=r.ioCtxCreate(srcPool.getSourceDir());
        Rbd rbd=new Rbd(io);
        RbdImage srcImage=rbd.open(template.getName());
        if (srcImage.isOldFormat()) {
          s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ disk.getVirtualSize()+ "String_Node_Str");
          rbd.create(disk.getName(),disk.getVirtualSize(),rbdFeatures,rbdOrder);
          RbdImage destImage=rbd.open(disk.getName());
          s_logger.debug("String_Node_Str" + srcImage.getName() + "String_Node_Str"+ destImage.getName()+ "String_Node_Str"+ srcPool.getSourceDir());
          rbd.copy(srcImage,destImage);
          s_logger.debug("String_Node_Str" + srcImage.getName() + "String_Node_Str"+ destImage.getName()+ "String_Node_Str"+ srcPool.getSourceDir());
          rbd.close(destImage);
        }
 else {
          s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ rbdTemplateSnapName);
          s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ rbdTemplateSnapName+ "String_Node_Str");
          List<RbdSnapInfo> snaps=srcImage.snapList();
          s_logger.debug("String_Node_Str" + snaps.size() + "String_Node_Str"+ srcPool.getSourceDir()+ "String_Node_Str"+ template.getName());
          boolean snapFound=false;
          for (          RbdSnapInfo snap : snaps) {
            if (rbdTemplateSnapName.equals(snap.name)) {
              s_logger.debug("String_Node_Str" + srcPool.getSourceDir() + "String_Node_Str"+ template.getName()+ "String_Node_Str"+ rbdTemplateSnapName+ "String_Node_Str");
              snapFound=true;
              break;
            }
          }
          if (!snapFound) {
            s_logger.debug("String_Node_Str" + rbdTemplateSnapName + "String_Node_Str"+ name);
            srcImage.snapCreate(rbdTemplateSnapName);
            s_logger.debug("String_Node_Str" + rbdTemplateSnapName + "String_Node_Str"+ name);
            srcImage.snapProtect(rbdTemplateSnapName);
          }
          rbd.clone(template.getName(),rbdTemplateSnapName,io,disk.getName(),rbdFeatures,rbdOrder);
          s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ rbdTemplateSnapName+ "String_Node_Str"+ disk.getName());
        }
        rbd.close(srcImage);
        r.ioCtxDestroy(io);
      }
 else {
        s_logger.debug("String_Node_Str");
        Rados rSrc=new Rados(srcPool.getAuthUserName());
        rSrc.confSet("String_Node_Str",srcPool.getSourceHost() + "String_Node_Str" + srcPool.getSourcePort());
        rSrc.confSet("String_Node_Str",srcPool.getAuthSecret());
        rSrc.confSet("String_Node_Str","String_Node_Str");
        rSrc.connect();
        s_logger.debug("String_Node_Str" + rSrc.confGet("String_Node_Str"));
        Rados rDest=new Rados(destPool.getAuthUserName());
        rDest.confSet("String_Node_Str",destPool.getSourceHost() + "String_Node_Str" + destPool.getSourcePort());
        rDest.confSet("String_Node_Str",destPool.getAuthSecret());
        rDest.confSet("String_Node_Str","String_Node_Str");
        rDest.connect();
        s_logger.debug("String_Node_Str" + rDest.confGet("String_Node_Str"));
        IoCTX sIO=rSrc.ioCtxCreate(srcPool.getSourceDir());
        Rbd sRbd=new Rbd(sIO);
        IoCTX dIO=rDest.ioCtxCreate(destPool.getSourceDir());
        Rbd dRbd=new Rbd(dIO);
        s_logger.debug("String_Node_Str" + disk.getName() + "String_Node_Str"+ rDest.confGet("String_Node_Str")+ "String_Node_Str"+ destPool.getSourceDir());
        dRbd.create(disk.getName(),disk.getVirtualSize(),rbdFeatures,rbdOrder);
        RbdImage srcImage=sRbd.open(template.getName());
        RbdImage destImage=dRbd.open(disk.getName());
        s_logger.debug("String_Node_Str" + template.getName() + "String_Node_Str"+ rSrc.confGet("String_Node_Str")+ "String_Node_Str"+ disk.getName()+ "String_Node_Str"+ rDest.confGet("String_Node_Str"));
        sRbd.copy(srcImage,destImage);
        sRbd.close(srcImage);
        dRbd.close(destImage);
        rSrc.ioCtxDestroy(sIO);
        rDest.ioCtxDestroy(dIO);
      }
    }
 catch (    RadosException e) {
      s_logger.error("String_Node_Str" + e.getMessage());
      disk=null;
    }
catch (    RbdException e) {
      s_logger.error("String_Node_Str" + e.getMessage());
      disk=null;
    }
  }
  return disk;
}