in app/services/GlacierRestoreActor.scala [101:137]
private def checkStatus(result:HeadObjectResponse, entry: ArchiveEntry, lbEntry: Option[LightboxEntry], jobs:Option[List[JobModel]], originalSender:ActorRef) = {
logger.info(s"Got metadata for s3://${entry.bucket}/${entry.path} @${entry.maybeVersion.getOrElse("LATEST")}. Archive status is ${result.archiveStatusAsString()}")
val maybeRestoreStatus = Option(result.restore()).map(S3RestoreHeader.apply)
logger.info(s"s3://${entry.bucket}/${entry.path} @${entry.maybeVersion.getOrElse("LATEST")} restore status is ${maybeRestoreStatus}")
maybeRestoreStatus match {
case None=>
logger.info(s"s3://${entry.bucket}/${entry.path} @${entry.maybeVersion.getOrElse("LATEST")} - there is no restore header in the head response")
updateLightboxExpired(lbEntry, entry.bucket, entry.path) //will only update if there _is_ a lightbox entry to update
originalSender ! RestoreNotRequested(entry)
case Some(Failure(err)) =>
logger.info(s"s3://${entry.bucket}/${entry.path} could not check restore status: ${err.getMessage}")
if(result.storageClass()!=StorageClass.GLACIER){
logger.info(s"s3://${entry.bucket}/${entry.path} storage class is ${result.storageClassAsString()}, assuming not in archive")
originalSender ! NotInArchive(entry)
} else {
logger.warn(s"s3://${entry.bucket}/${entry.path} there is no restore record in S3")
if(jobs.isDefined) jobs.get.foreach(job=>updateJob(job, JobStatus.ST_ERROR,Some("No restore record in S3")))
if(lbEntry.isDefined) updateLightbox(lbEntry.get,None,error=Some(new RuntimeException("No restore record in S3")))
originalSender ! RestoreNotRequested(entry)
}
case Some(Success(S3RestoreHeader(true, _))) => //restore is in progress
logger.info(s"s3://${entry.bucket}/${entry.path} is currently under restore: $maybeRestoreStatus")
if(jobs.isDefined) jobs.get.foreach(job=>updateJob(job, JobStatus.ST_RUNNING, None))
if(lbEntry.isDefined) updateLightboxFull(lbEntry.get,RestoreStatus.RS_UNDERWAY,None)
originalSender ! RestoreInProgress(entry)
case Some(Success(S3RestoreHeader(false, None))) => //restore not in progress, but no expiry time - expiry time is probably passed
logger.info(s"s3://${entry.bucket}/${entry.path} is not currently under restore and probably expired: $maybeRestoreStatus")
updateLightboxExpired(lbEntry, entry.bucket, entry.path)
originalSender ! RestoreNotRequested(entry)
case Some(Success(S3RestoreHeader(false, Some(expiry)))) => //restore not in progress, it's available unless the expiry time is already passed
logger.info(s"s3://${entry.bucket}/${entry.path} has completed restore: ${maybeRestoreStatus}")
if(jobs.isDefined) jobs.get.foreach(job=>updateJob(job,JobStatus.ST_SUCCESS,None))
if(lbEntry.isDefined) updateLightboxFull(lbEntry.get, RestoreStatus.RS_SUCCESS, Some(expiry))
originalSender ! RestoreCompleted(entry, expiry)
}
}