Fix JPS tests after 2d65383a

This commit is contained in:
Aleksei.Cherepanov
2021-06-28 14:56:10 +03:00
committed by teamcityserver
parent c83614386e
commit d9701d57bb
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.utils.keysToMap
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
import kotlin.system.measureTimeMillis
open class LookupStorage( open class LookupStorage(
targetDataDir: File, targetDataDir: File,
@@ -50,15 +49,11 @@ open class LookupStorage(
@Volatile @Volatile
private var size: Int = 0 private var size: Int = 0
@Volatile
private var deletedCount: Int = 0
init { init {
try { try {
if (countersFile.exists()) { if (countersFile.exists()) {
val lines = countersFile.readLines() val lines = countersFile.readLines()
size = lines[0].toInt() size = lines[0].toInt()
deletedCount = lines[1].toInt()
} }
} catch (e: Exception) { } catch (e: Exception) {
throw IOException("Could not read $countersFile", e) throw IOException("Could not read $countersFile", e)
@@ -108,7 +103,6 @@ open class LookupStorage(
val id = fileToId[file] ?: continue val id = fileToId[file] ?: continue
idToFile.remove(id) idToFile.remove(id)
fileToId.remove(file) fileToId.remove(file)
deletedCount++
} }
} }
@@ -119,7 +113,6 @@ open class LookupStorage(
} }
size = 0 size = 0
deletedCount = 0
super.clean() super.clean()
} }
@@ -127,15 +120,13 @@ open class LookupStorage(
@Synchronized @Synchronized
override fun flush(memoryCachesOnly: Boolean) { override fun flush(memoryCachesOnly: Boolean) {
try { try {
removeGarbageIfNeeded()
if (size > 0) { if (size > 0) {
if (!countersFile.exists()) { if (!countersFile.exists()) {
countersFile.parentFile.mkdirs() countersFile.parentFile.mkdirs()
countersFile.createNewFile() countersFile.createNewFile()
} }
countersFile.writeText("$size\n$deletedCount") countersFile.writeText("$size\n")
} }
} finally { } finally {
super.flush(memoryCachesOnly) super.flush(memoryCachesOnly)
@@ -152,28 +143,37 @@ open class LookupStorage(
return id return id
} }
private fun removeGarbageIfNeeded(force: Boolean = false) { private fun removeGarbageForTests() {
if (force && (size > MINIMUM_GARBAGE_COLLECTIBLE_SIZE && deletedCount.toDouble() / size > DELETED_TO_SIZE_TRESHOLD)) { for (hash in lookupMap.keys) {
doRemoveGarbage() lookupMap[hash] = lookupMap[hash]!!.filter { it in idToFile }.toSet()
} }
}
private fun doRemoveGarbage() { val oldFileToId = fileToId.toMap()
val timeInMillis = measureTimeMillis { val oldIdToNewId = HashMap<Int, Int>(oldFileToId.size)
for (hash in lookupMap.keys) { idToFile.clean()
val dirtyFileIds = lookupMap[hash]!! fileToId.clean()
val filteredFileIds = dirtyFileIds.filter { it in idToFile }.toSet() size = 0
if (dirtyFileIds != filteredFileIds) lookupMap[hash] = filteredFileIds
for ((file, oldId) in oldFileToId.entries.sortedBy { it.key.path }) {
val newId = addFileIfNeeded(file)
oldIdToNewId[oldId] = newId
}
for (lookup in lookupMap.keys) {
val fileIds = lookupMap[lookup]!!.mapNotNull { oldIdToNewId[it] }.toSet()
if (fileIds.isEmpty()) {
lookupMap.remove(lookup)
} else {
lookupMap[lookup] = fileIds
} }
deletedCount = 0
} }
LOG.debug(">>Garbage removed in $timeInMillis ms")
} }
@TestOnly @TestOnly
fun forceGC() { fun forceGC() {
removeGarbageIfNeeded(force = true) removeGarbageForTests()
flush(false) flush(false)
} }