Enhanced locking

This commit is contained in:
Šesták Vít
2016-02-22 14:44:04 +01:00
parent da93888262
commit 2e5a265e84

View File

@@ -8,12 +8,14 @@ import controllers.Statistics.LibDepStatistics
import models.{EmailMessageId, ExportedVulnerability} import models.{EmailMessageId, ExportedVulnerability}
import play.api.i18n.MessagesApi import play.api.i18n.MessagesApi
import play.api.libs.Crypto import play.api.libs.Crypto
import play.api.mvc.Action import play.api.mvc.{RequestHeader, Action}
import play.api.{Configuration, Logger} import play.api.{Configuration, Logger}
import services.{EmailExportService, IssueTrackerService, LibrariesService, VulnerabilityNotificationService} import services.{EmailExportService, IssueTrackerService, LibrariesService, VulnerabilityNotificationService}
import views.html.DefaultRequest
import scala.concurrent.Future.{successful => Fut} import scala.concurrent.Future.{successful => Fut}
import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.{ExecutionContext, Future}
import com.ysoft.concurrent.FutureLock._
class Notifications @Inject()( class Notifications @Inject()(
config: Configuration, config: Configuration,
@@ -90,14 +92,12 @@ class Notifications @Inject()(
def cron(key: String, purgeCache: Boolean) = Action.async{ def cron(key: String, purgeCache: Boolean) = Action.async{
if(Crypto.constantTimeEquals(key, config.getString("yssdc.cronKey").get)){ if(Crypto.constantTimeEquals(key, config.getString("yssdc.cronKey").get)){
if(cronJobIsRunning.compareAndSet(/*expect = */false, /*update = */true)){ futureLock(cronJobIsRunning) {
// TODO: reduce the opportunity for not releasing the lock and make it clear it can't happen if (purgeCache) {
if(purgeCache){
projectReportsProvider.purgeCache(Map()) projectReportsProvider.purgeCache(Map())
} }
val (lastRefreshTime, resultsFuture) = projectReportsProvider.resultsForVersions(versions) val (lastRefreshTime, resultsFuture) = projectReportsProvider.resultsForVersions(versions)
( for {
for{
(successfulReports, failedReports) <- resultsFuture (successfulReports, failedReports) <- resultsFuture
libraries <- librariesService.all libraries <- librariesService.all
parsedReports = dependencyCheckReportsParser.parseReports(successfulReports) parsedReports = dependencyCheckReportsParser.parseReports(successfulReports)
@@ -107,14 +107,11 @@ class Notifications @Inject()(
(missingTickets, newTicketIds, updatedTickets) <- issuesExportResultFuture (missingTickets, newTicketIds, updatedTickets) <- issuesExportResultFuture
(missingEmails, newMessageIds, updatedEmails) <- mailExportResultFuture (missingEmails, newMessageIds, updatedEmails) <- mailExportResultFuture
} yield Ok( } yield Ok(
missingTickets.mkString("\n")+"\n\n"+newTicketIds.mkString("\n")+ updatedTickets.toString+ missingTickets.mkString("\n") + "\n\n" + newTicketIds.mkString("\n") + updatedTickets.toString +
"\n\n" + "\n\n" +
missingEmails.mkString("\n")+"\n\n"+newMessageIds.mkString("\n") + updatedEmails.toString missingEmails.mkString("\n") + "\n\n" + newMessageIds.mkString("\n") + updatedEmails.toString
) )
).andThen{ case _ => } whenLocked {
cronJobIsRunning.set(false)
}
}else{
Fut(ServiceUnavailable("A cron job seems to be running at this time")) Fut(ServiceUnavailable("A cron job seems to be running at this time"))
} }
}else{ }else{