Fix JPS tests after 2d65383a
This commit is contained in:
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user