Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions services/hierarchy/src/main/kotlin/OrphanRemovalService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import org.eclipse.apoapsis.ortserver.dao.tables.NestedProvenanceSubRepositories
import org.eclipse.apoapsis.ortserver.dao.tables.NestedProvenancesTable
import org.eclipse.apoapsis.ortserver.dao.tables.NestedRepositoriesTable
import org.eclipse.apoapsis.ortserver.dao.tables.PackageProvenancesTable
import org.eclipse.apoapsis.ortserver.dao.tables.SnippetFindingsSnippetsTable
import org.eclipse.apoapsis.ortserver.dao.tables.SnippetsTable
import org.eclipse.apoapsis.ortserver.dao.tables.shared.DeclaredLicensesTable
import org.eclipse.apoapsis.ortserver.dao.tables.shared.RemoteArtifactsTable
Expand All @@ -55,6 +56,7 @@ import org.jetbrains.exposed.sql.SqlExpressionBuilder.inSubQuery
import org.jetbrains.exposed.sql.Table
import org.jetbrains.exposed.sql.alias
import org.jetbrains.exposed.sql.deleteWhere
import org.jetbrains.exposed.sql.intLiteral
import org.jetbrains.exposed.sql.notExists
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.union
Expand Down Expand Up @@ -262,6 +264,14 @@ private enum class OrphanEntityHandler(

unionCondition(subQuery, table.id)
}
},

SNIPPETS(SnippetsTable, "snippets") {
override fun filterOrphanedEntities(): SqlExpressionBuilder.() -> AbstractQuery<*> = {
SnippetFindingsSnippetsTable
.select(intLiteral(1))
.where(SnippetFindingsSnippetsTable.snippetId eq table.id)
}
};

/**
Expand Down
76 changes: 75 additions & 1 deletion services/hierarchy/src/test/kotlin/OrphanRemovalServiceTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ import org.eclipse.apoapsis.ortserver.dao.repositories.repositoryconfiguration.P
import org.eclipse.apoapsis.ortserver.dao.repositories.repositoryconfiguration.VcsInfoCurationDataTable
import org.eclipse.apoapsis.ortserver.dao.tables.NestedRepositoriesTable
import org.eclipse.apoapsis.ortserver.dao.tables.PackageProvenancesTable
import org.eclipse.apoapsis.ortserver.dao.tables.ScanSummariesTable
import org.eclipse.apoapsis.ortserver.dao.tables.SnippetFindingsSnippetsTable
import org.eclipse.apoapsis.ortserver.dao.tables.SnippetFindingsTable
import org.eclipse.apoapsis.ortserver.dao.tables.SnippetsTable
import org.eclipse.apoapsis.ortserver.dao.tables.shared.DeclaredLicensesTable
import org.eclipse.apoapsis.ortserver.dao.tables.shared.EnvironmentsTable
Expand Down Expand Up @@ -432,6 +435,50 @@ class OrphanRemovalServiceTest : WordSpec() {
}
}
}

"deleteOrphanedSnippets" should {
"only delete a limited number of orphaned snippets at a time" {
val numberOfSnippets = 100
db.dbQuery {
repeat(numberOfSnippets) {
createSnippetsTableEntry()
}
}

service.deleteRunsOrphanedEntities(createConfigManager())

db.dbQuery(readOnly = true) {
SnippetsTable.selectAll().count() shouldBe (numberOfSnippets - 10) // 10 is the limit in this test
}
}

"does not delete snippets that have snipped findings" {
val numberOfSnippets = 100
db.dbQuery {
val snippedFindingId = createSnippetFindingTableEntry(
scanSummaryId = createScanSummariesTableEntry().value
)

repeat(numberOfSnippets) {
val snippedId = createSnippetsTableEntry()
createSnippetFindingsSnippetsTableEntry(snippedFindingId.value, snippedId.value)
}
}

// Add 5 orphan snippets
db.dbQuery {
repeat(5) {
createSnippetsTableEntry()
}
}

service.deleteRunsOrphanedEntities(createConfigManager())

db.dbQuery(readOnly = true) {
SnippetsTable.selectAll().count() shouldBe (numberOfSnippets) // Nothing deleted but the orphans
}
}
}
}

@Suppress("LongParameterList")
Expand Down Expand Up @@ -672,6 +719,31 @@ class OrphanRemovalServiceTest : WordSpec() {
it[this.vcsId] = vcsId
} get NestedRepositoriesTable.id

private fun createScanSummariesTableEntry() = ScanSummariesTable.insert {
it[this.startTime] = Clock.System.now()
it[this.endTime] = Clock.System.now()
} get ScanSummariesTable.id

private fun createSnippetFindingTableEntry(
scanSummaryId: Long,
path: String = "path/" + Random.nextInt(0, 10000),
startLine: Int = Random.nextInt(0, 10000),
endLine: Int = Random.nextInt(0, 10000),
) = SnippetFindingsTable.insert {
it[this.scanSummaryId] = scanSummaryId
it[this.path] = path
it[this.startLine] = startLine
it[this.endLine] = endLine
} get SnippetFindingsTable.id

private fun createSnippetFindingsSnippetsTableEntry(
snippedFindingId: Long,
snippedId: Long
) = SnippetFindingsSnippetsTable.insert {
it[this.snippetFindingId] = snippedFindingId
it[this.snippetId] = snippedId
}

@Suppress("LongParameterList")
private fun createSnippetsTableEntry(
purl: String = "purl_" + Random.nextInt(0, 10000),
Expand Down Expand Up @@ -773,7 +845,9 @@ private fun createConfigManager(): ConfigManager {
"vcsInfo.limit" to "10",
"vcsInfo.chunkSize" to "2",
"remoteArtifacts.limit" to "10",
"remoteArtifacts.chunkSize" to "2"
"remoteArtifacts.chunkSize" to "2",
"snippets.limit" to "10",
"snippets.chunkSize" to "5",
)

return ConfigManager.create(ConfigFactory.parseMap(configMap))
Expand Down
4 changes: 4 additions & 0 deletions tasks/src/main/resources/application.conf
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ orphanHandlers {
remoteArtifacts.limit = ${?ORPHANED_REMOTE_ARTIFACTS_LIMIT}
remoteArtifacts.chunkSize = 64
remoteArtifacts.chunkSize = ${?ORPHANED_REMOTE_ARTIFACTS_CHUNK_SIZE}
snippets.limit = 1048576
snippets.limit = ${?ORPHANED_SNIPPETS_LIMIT}
snippets.chunkSize = 1024
snippets.chunkSize = ${?ORPHANED_SNIPPETS_CHUNK_SIZE}
}

jobMonitor {
Expand Down
Loading