in online_nearline/src/main/scala/FileCopier.scala [156:191]
def copyFileToMatrixStore(vault: Vault, fileName: String, filePath: Path): Future[Either[String, String]] = {
( for {
fileSize <- Future.fromTry(Try { getSizeFromPath(filePath) })
potentialMatches <- findMatchingFilesOnNearline(vault, filePath, fileSize)
potentialMatchesFiles <- Future.sequence(potentialMatches.map(entry=>Future.fromTry(openMxsObject(vault, entry.oid))))
alreadyExists <- verifyChecksumMatchUsingHelper(filePath, potentialMatchesFiles)
result <- alreadyExists match {
case Some(existingId)=>
logger.info(s"$filePath: Object already exists with object id ${existingId}")
Future(Right(existingId))
case None=>
logger.info(s"$filePath: Out of ${potentialMatches.length} remote matches, none matched the checksum so creating new copy")
copyUsingHelper(vault, fileName, filePath)
}
} yield result )
.recoverWith({
case err:java.io.IOException =>
if(err.getMessage.contains("does not exist (error 306)")) {
copyUsingHelper(vault, fileName, filePath)
} else {
//the most likely cause of this is that the sdk threw because the appliance is under heavy load and
//can't do the checksum at this time
logger.error(s"Error validating objectmatrix checksum: ${err.getMessage}", err)
Future(Left(s"ObjectMatrix error: ${err.getMessage}"))
}
case err:BailOutException=>
logger.error(s"A permanent error occurred: ${err.getMessage}", err)
Future.failed(err)
case err:Throwable =>
// Error contacting ObjectMatrix, log it and retry via the queue
logger.warn(s"Failed to get object from vault for checksum $filePath: ${err.getClass.getCanonicalName} ${err.getMessage} , will retry", err)
Future(Left(s"ObjectMatrix error: ${err.getMessage}"))
case _ =>
Future(Left(s"ObjectMatrix error"))
})
}