mirror of
https://github.com/ysoftdevs/odc-analyzer.git
synced 2026-03-26 02:51:46 +01:00
Added locking for the cronjob
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
import com.ysoft.odc.{Absolutizer, SetDiff}
|
import com.ysoft.odc.{Absolutizer, SetDiff}
|
||||||
@@ -28,6 +29,8 @@ class Notifications @Inject()(
|
|||||||
|
|
||||||
private val versions = Map[String, Int]()
|
private val versions = Map[String, Int]()
|
||||||
|
|
||||||
|
private val cronJobIsRunning = new AtomicBoolean()
|
||||||
|
|
||||||
import secureRequestConversion._
|
import secureRequestConversion._
|
||||||
|
|
||||||
def listProjects() = SecuredAction.async { implicit req =>
|
def listProjects() = SecuredAction.async { implicit req =>
|
||||||
@@ -87,24 +90,33 @@ 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(purgeCache){
|
if(cronJobIsRunning.compareAndSet(/*expect = */false, /*update = */true)){
|
||||||
projectReportsProvider.purgeCache(Map())
|
// TODO: reduce the opportunity for not releasing the lock and make it clear it can't happen
|
||||||
|
if(purgeCache){
|
||||||
|
projectReportsProvider.purgeCache(Map())
|
||||||
|
}
|
||||||
|
val (lastRefreshTime, resultsFuture) = projectReportsProvider.resultsForVersions(versions)
|
||||||
|
(
|
||||||
|
for{
|
||||||
|
(successfulReports, failedReports) <- resultsFuture
|
||||||
|
libraries <- librariesService.all
|
||||||
|
parsedReports = dependencyCheckReportsParser.parseReports(successfulReports)
|
||||||
|
lds = LibDepStatistics(dependencies = parsedReports.groupedDependencies.toSet, libraries = libraries.toSet)
|
||||||
|
issuesExportResultFuture = exportToIssueTracker(lds, parsedReports.projectsReportInfo)
|
||||||
|
mailExportResultFuture = exportToEmail(lds, parsedReports.projectsReportInfo)
|
||||||
|
(missingTickets, newTicketIds, updatedTickets) <- issuesExportResultFuture
|
||||||
|
(missingEmails, newMessageIds, updatedEmails) <- mailExportResultFuture
|
||||||
|
} yield Ok(
|
||||||
|
missingTickets.mkString("\n")+"\n\n"+newTicketIds.mkString("\n")+ updatedTickets.toString+
|
||||||
|
"\n\n" +
|
||||||
|
missingEmails.mkString("\n")+"\n\n"+newMessageIds.mkString("\n") + updatedEmails.toString
|
||||||
|
)
|
||||||
|
).andThen{ case _ =>
|
||||||
|
cronJobIsRunning.set(false)
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Fut(ServiceUnavailable("A cron job seems to be running at this time"))
|
||||||
}
|
}
|
||||||
val (lastRefreshTime, resultsFuture) = projectReportsProvider.resultsForVersions(versions)
|
|
||||||
for{
|
|
||||||
(successfulReports, failedReports) <- resultsFuture
|
|
||||||
libraries <- librariesService.all
|
|
||||||
parsedReports = dependencyCheckReportsParser.parseReports(successfulReports)
|
|
||||||
lds = LibDepStatistics(dependencies = parsedReports.groupedDependencies.toSet, libraries = libraries.toSet)
|
|
||||||
issuesExportResultFuture = exportToIssueTracker(lds, parsedReports.projectsReportInfo)
|
|
||||||
mailExportResultFuture = exportToEmail(lds, parsedReports.projectsReportInfo)
|
|
||||||
(missingTickets, newTicketIds, updatedTickets) <- issuesExportResultFuture
|
|
||||||
(missingEmails, newMessageIds, updatedEmails) <- mailExportResultFuture
|
|
||||||
} yield Ok(
|
|
||||||
missingTickets.mkString("\n")+"\n\n"+newTicketIds.mkString("\n")+ updatedTickets.toString+
|
|
||||||
"\n\n" +
|
|
||||||
missingEmails.mkString("\n")+"\n\n"+newMessageIds.mkString("\n") + updatedEmails.toString
|
|
||||||
)
|
|
||||||
}else{
|
}else{
|
||||||
Fut(Unauthorized("unauthorized"))
|
Fut(Unauthorized("unauthorized"))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user