[Commonizer] Log time in commonizer result consumers

This commit is contained in:
Dmitriy Dolovov
2021-02-18 15:01:41 +03:00
parent 496aad3c4a
commit fb51105a5d
4 changed files with 51 additions and 51 deletions
@@ -1,22 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors.commonizer.cli
import org.jetbrains.kotlin.util.Logger
fun Logger.toProgressLogger(): Logger {
return ProgressLogger(this)
}
private class ProgressLogger(private val logger: Logger) : Logger by logger {
override fun log(message: String) {
logger.log("* $message")
}
override fun warning(message: String) {
logger.log("* $message")
}
}
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.repository.Repository
import org.jetbrains.kotlin.descriptors.commonizer.stats.FileStatsOutput import org.jetbrains.kotlin.descriptors.commonizer.stats.FileStatsOutput
import org.jetbrains.kotlin.descriptors.commonizer.stats.StatsCollector import org.jetbrains.kotlin.descriptors.commonizer.stats.StatsCollector
import org.jetbrains.kotlin.descriptors.commonizer.stats.StatsType import org.jetbrains.kotlin.descriptors.commonizer.stats.StatsType
import org.jetbrains.kotlin.descriptors.commonizer.utils.ProgressLogger
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_PLATFORM_LIBS_DIR import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_PLATFORM_LIBS_DIR
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
@@ -61,17 +62,17 @@ internal class NativeKlibCommonize(options: Collection<Option<*>>) : Task(option
val konanTargets = outputCommonizerTarget.konanTargets val konanTargets = outputCommonizerTarget.konanTargets
val commonizerTargets = konanTargets.map(::CommonizerTarget) val commonizerTargets = konanTargets.map(::CommonizerTarget)
val logger = CliLoggerAdapter(2) val progressLogger = ProgressLogger(CliLoggerAdapter(2))
val libraryLoader = DefaultNativeLibraryLoader(logger) val libraryLoader = DefaultNativeLibraryLoader(progressLogger)
val statsCollector = StatsCollector(statsType, commonizerTargets) val statsCollector = StatsCollector(statsType, commonizerTargets)
val repository = FilesRepository(targetLibraries.toSet(), libraryLoader) val repository = FilesRepository(targetLibraries.toSet(), libraryLoader)
val resultsConsumer = buildResultsConsumer { val resultsConsumer = buildResultsConsumer {
this add ModuleSerializer(destination, HierarchicalCommonizerOutputLayout) this add ModuleSerializer(destination, HierarchicalCommonizerOutputLayout)
this add CopyUnconsumedModulesAsIsConsumer( this add CopyUnconsumedModulesAsIsConsumer(
repository, destination, commonizerTargets.toSet(), NativeDistributionCommonizerOutputLayout, logger.toProgressLogger() repository, destination, commonizerTargets.toSet(), NativeDistributionCommonizerOutputLayout, progressLogger
) )
this add LoggingResultsConsumer(outputCommonizerTarget, logger.toProgressLogger()) this add LoggingResultsConsumer(outputCommonizerTarget, progressLogger)
} }
LibraryCommonizer( LibraryCommonizer(
@@ -83,7 +84,7 @@ internal class NativeKlibCommonize(options: Collection<Option<*>>) : Task(option
targets = commonizerTargets, targets = commonizerTargets,
resultsConsumer = resultsConsumer, resultsConsumer = resultsConsumer,
statsCollector = statsCollector, statsCollector = statsCollector,
logger = logger progressLogger = progressLogger
).run() ).run()
statsCollector?.writeTo(FileStatsOutput(destination, statsType.name.toLowerCase())) statsCollector?.writeTo(FileStatsOutput(destination, statsType.name.toLowerCase()))
@@ -103,8 +104,8 @@ internal class NativeDistributionCommonize(options: Collection<Option<*>>) : Tas
val copyEndorsedLibs = getOptional<Boolean, BooleanOptionType> { it == "copy-endorsed-libs" } ?: false val copyEndorsedLibs = getOptional<Boolean, BooleanOptionType> { it == "copy-endorsed-libs" } ?: false
val statsType = getOptional<StatsType, StatsTypeOptionType> { it == "log-stats" } ?: StatsType.NONE val statsType = getOptional<StatsType, StatsTypeOptionType> { it == "log-stats" } ?: StatsType.NONE
val logger = CliLoggerAdapter(2) val progressLogger = ProgressLogger(CliLoggerAdapter(2))
val libraryLoader = DefaultNativeLibraryLoader(logger) val libraryLoader = DefaultNativeLibraryLoader(progressLogger)
val repository = KonanDistributionRepository(distribution, commonizerTargets.toSet(), libraryLoader) val repository = KonanDistributionRepository(distribution, commonizerTargets.toSet(), libraryLoader)
val existingTargets = commonizerTargets.filter { repository.getLibraries(it).isNotEmpty() }.toSet() val existingTargets = commonizerTargets.filter { repository.getLibraries(it).isNotEmpty() }.toSet()
val statsCollector = StatsCollector(statsType, commonizerTargets) val statsCollector = StatsCollector(statsType, commonizerTargets)
@@ -112,11 +113,11 @@ internal class NativeDistributionCommonize(options: Collection<Option<*>>) : Tas
val resultsConsumer = buildResultsConsumer { val resultsConsumer = buildResultsConsumer {
this add ModuleSerializer(destination, NativeDistributionCommonizerOutputLayout) this add ModuleSerializer(destination, NativeDistributionCommonizerOutputLayout)
this add CopyUnconsumedModulesAsIsConsumer( this add CopyUnconsumedModulesAsIsConsumer(
repository, destination, commonizerTargets.toSet(), NativeDistributionCommonizerOutputLayout, logger.toProgressLogger() repository, destination, commonizerTargets.toSet(), NativeDistributionCommonizerOutputLayout, progressLogger
) )
if (copyStdlib) this add CopyStdlibResultsConsumer(distribution, destination, logger.toProgressLogger()) if (copyStdlib) this add CopyStdlibResultsConsumer(distribution, destination, progressLogger)
if (copyEndorsedLibs) this add CopyEndorsedLibrairesResultsConsumer(distribution, destination, logger.toProgressLogger()) if (copyEndorsedLibs) this add CopyEndorsedLibrairesResultsConsumer(distribution, destination, progressLogger)
this add LoggingResultsConsumer(SharedCommonizerTarget(existingTargets), logger.toProgressLogger()) this add LoggingResultsConsumer(SharedCommonizerTarget(existingTargets), progressLogger)
} }
val targetNames = commonizerTargets.joinToString { it.prettyName } val targetNames = commonizerTargets.joinToString { it.prettyName }
@@ -132,7 +133,7 @@ internal class NativeDistributionCommonize(options: Collection<Option<*>>) : Tas
targets = commonizerTargets, targets = commonizerTargets,
resultsConsumer = resultsConsumer, resultsConsumer = resultsConsumer,
statsCollector = statsCollector, statsCollector = statsCollector,
logger = logger progressLogger = progressLogger
).run() ).run()
println("$description: Done") println("$description: Done")
@@ -7,14 +7,12 @@ package org.jetbrains.kotlin.descriptors.commonizer.konan
import org.jetbrains.kotlin.descriptors.commonizer.* import org.jetbrains.kotlin.descriptors.commonizer.*
import org.jetbrains.kotlin.descriptors.commonizer.LeafCommonizerTarget import org.jetbrains.kotlin.descriptors.commonizer.LeafCommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.cli.toProgressLogger
import org.jetbrains.kotlin.descriptors.commonizer.konan.LibraryCommonizer.* import org.jetbrains.kotlin.descriptors.commonizer.konan.LibraryCommonizer.*
import org.jetbrains.kotlin.descriptors.commonizer.repository.Repository import org.jetbrains.kotlin.descriptors.commonizer.repository.Repository
import org.jetbrains.kotlin.descriptors.commonizer.stats.StatsCollector import org.jetbrains.kotlin.descriptors.commonizer.stats.StatsCollector
import org.jetbrains.kotlin.descriptors.commonizer.utils.ResettableClockMark import org.jetbrains.kotlin.descriptors.commonizer.utils.ProgressLogger
import org.jetbrains.kotlin.konan.library.* import org.jetbrains.kotlin.konan.library.*
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.util.Logger
internal class LibraryCommonizer internal constructor( internal class LibraryCommonizer internal constructor(
private val konanDistribution: KonanDistribution, private val konanDistribution: KonanDistribution,
@@ -24,17 +22,15 @@ internal class LibraryCommonizer internal constructor(
private val targets: List<LeafCommonizerTarget>, private val targets: List<LeafCommonizerTarget>,
private val resultsConsumer: ResultsConsumer, private val resultsConsumer: ResultsConsumer,
private val statsCollector: StatsCollector?, private val statsCollector: StatsCollector?,
private val logger: Logger private val progressLogger: ProgressLogger
) { ) {
private val clockMark = ResettableClockMark()
fun run() { fun run() {
checkPreconditions() checkPreconditions()
clockMark.reset() progressLogger.reset()
val allLibraries = loadLibraries() val allLibraries = loadLibraries()
commonizeAndSaveResults(allLibraries) commonizeAndSaveResults(allLibraries)
logTotal() progressLogger.logTotal()
} }
private fun loadLibraries(): AllNativeLibraries { private fun loadLibraries(): AllNativeLibraries {
@@ -46,17 +42,17 @@ internal class LibraryCommonizer internal constructor(
librariesByTargets.forEach { (target, librariesToCommonize) -> librariesByTargets.forEach { (target, librariesToCommonize) ->
if (librariesToCommonize.libraries.isEmpty()) { if (librariesToCommonize.libraries.isEmpty()) {
logger.warning("No platform libraries found for target $target. This target will be excluded from commonization.") progressLogger.warning("No platform libraries found for target $target. This target will be excluded from commonization.")
} }
} }
logProgress("Read lazy (uninitialized) libraries") progressLogger.log("Read lazy (uninitialized) libraries")
return AllNativeLibraries(stdlib, librariesByTargets) return AllNativeLibraries(stdlib, librariesByTargets)
} }
private fun commonizeAndSaveResults(allLibraries: AllNativeLibraries) { private fun commonizeAndSaveResults(allLibraries: AllNativeLibraries) {
val manifestProvider = TargetedNativeManifestDataProvider(allLibraries) val manifestProvider = TargetedNativeManifestDataProvider(allLibraries)
val parameters = CommonizerParameters(resultsConsumer, manifestProvider, statsCollector, ::logProgress).apply { val parameters = CommonizerParameters(resultsConsumer, manifestProvider, statsCollector, progressLogger::log).apply {
val storageManager = LockBasedStorageManager("Commonized modules") val storageManager = LockBasedStorageManager("Commonized modules")
dependencyModulesProvider = NativeDistributionModulesProvider.forStandardLibrary(storageManager, allLibraries.stdlib) dependencyModulesProvider = NativeDistributionModulesProvider.forStandardLibrary(storageManager, allLibraries.stdlib)
@@ -83,12 +79,8 @@ internal class LibraryCommonizer internal constructor(
private fun checkPreconditions() { private fun checkPreconditions() {
when (targets.size) { when (targets.size) {
0 -> logger.fatal("No targets specified") 0 -> progressLogger.fatal("No targets specified")
1 -> logger.fatal("Too few targets specified: $targets") 1 -> progressLogger.fatal("Too few targets specified: $targets")
} }
} }
private fun logProgress(message: String) = logger.toProgressLogger().log("$message in ${clockMark.elapsedSinceLast()}")
private fun logTotal() = logger.log("TOTAL: ${clockMark.elapsedSinceStart()}")
} }
@@ -0,0 +1,29 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors.commonizer.utils
import org.jetbrains.kotlin.util.Logger
class ProgressLogger(private val wrapped: Logger) : Logger by wrapped {
private val clockMark = ResettableClockMark()
private var finished = true
fun reset() {
clockMark.reset()
finished = false
}
override fun log(message: String) {
check(!finished)
wrapped.log("* $message in ${clockMark.elapsedSinceLast()}")
}
fun logTotal() {
check(!finished)
wrapped.log("TOTAL: ${clockMark.elapsedSinceStart()}")
finished = true
}
}