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( () )
}
}
})
)
}