def fixInvalidBackupsFor()

in app/services/NewProjectBackup.scala [391:437]


  def fixInvalidBackupsFor(projectAndFiles:(ProjectEntry, Seq[FileEntry]), storageDrivers:Map[Int, StorageDriver]):Future[Seq[Unit]] = {
    val p = projectAndFiles._1
    val backupFiles = projectAndFiles._2.filter(_.backupOf.isDefined)

    val zeroLengthBackups = backupFiles.filter(fileEntry=>{
      storageDrivers.get(fileEntry.storageId) match {
        case None=>
          logger.error(s"Could not get a storage driver for ${fileEntry.filepath} on storage id ${fileEntry.storageId}")
          false
        case Some(driver)=>
          driver.getMetadata(fileEntry.filepath, fileEntry.version) match {
            case None=>
              logger.error(s"Could not get metadata for ${fileEntry.filepath} v ${fileEntry.version} on storage id ${fileEntry.storageId} with driver ${driver.getClass.getCanonicalName}")
              false
            case Some(meta)=>
              if(meta.size==0) {
                logger.info(s"Found dodgy backup: $meta")
              }
              meta.size==0
          }
      }
    })

    logger.info(s"Project ${p.projectTitle} (${p.id}) has ${zeroLengthBackups.length} zero-length backups")

    Future.sequence(
      zeroLengthBackups.map(fileEntry=>{
        storageDrivers.get(fileEntry.storageId) match {
          case None=>
            logger.error(s"Could not get a storage driver for ${fileEntry.filepath} on storage id ${fileEntry.storageId}")
            Future.failed(new RuntimeException("Could not get a storage driver on the second pass, this should not happen!"))
          case Some(driver)=>
            if(fileEntry.storageId!=2) { //TEMPORARY HACK
              logger.info(s"Deleting zero-length backup ${fileEntry.filepath} on storage id ${fileEntry.storageId}")
              if (driver.deleteFileAtPath(fileEntry.filepath, fileEntry.version)) {
                logger.info(s"Deleting zero-length backup entry ${fileEntry.id}")
                fileEntry.deleteSelf
              } else {
                Future.failed(new RuntimeException(s"Could not delete file ${fileEntry.filepath} on storage id ${fileEntry.storageId}"))
              }
            } else {
              Future( () )
            }
        }
      })
    )
  }