From caa1ca732469a9703612a2829b6705945cf0e387 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 6 Mar 2025 08:28:27 +0100 Subject: [PATCH] IJPL-179600 do not save outFilePath as string - use xx33 64-bit hash GitOrigin-RevId: 6fc84e5f0c11305d48956d99a0e861b79326575f --- .../src/jps-builder/BazelJpsModelLoader.kt | 2 +- build/jvm-rules/src/jps-shadow/BUILD.bazel | 1 + .../src/jps-shadow/impl/GraphDataInputImpl.kt | 4 ++ .../jps-shadow/impl/GraphDataOutputImpl.kt | 4 ++ .../src/jps-shadow/java/JVMClassNode.kt | 49 ++++++++++++------- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/build/jvm-rules/src/jps-builder/BazelJpsModelLoader.kt b/build/jvm-rules/src/jps-builder/BazelJpsModelLoader.kt index e9fab4036e02..ecf81b9261e3 100644 --- a/build/jvm-rules/src/jps-builder/BazelJpsModelLoader.kt +++ b/build/jvm-rules/src/jps-builder/BazelJpsModelLoader.kt @@ -70,7 +70,7 @@ internal fun loadJpsModel( val digests = TargetConfigurationDigestContainer() digests.set(TargetConfigurationDigestProperty.KOTLIN_VERSION, KOTLINC_VERSION_HASH) - digests.set(TargetConfigurationDigestProperty.TOOL_VERSION, 11) + digests.set(TargetConfigurationDigestProperty.TOOL_VERSION, 12) // properties not needed for us (not implemented for java) // extension.loadModuleOptions not needed for us (not implemented for java) diff --git a/build/jvm-rules/src/jps-shadow/BUILD.bazel b/build/jvm-rules/src/jps-shadow/BUILD.bazel index 1a3c5dfae713..729d3d9063f5 100644 --- a/build/jvm-rules/src/jps-shadow/BUILD.bazel +++ b/build/jvm-rules/src/jps-shadow/BUILD.bazel @@ -11,6 +11,7 @@ kt_jvm_library( "@lib//:kotlin-stdlib", "@lib//:fastutil-min", "//src/worker-util", + "@lib//:hash4j", "//:jps", ], visibility = ["//visibility:public"], diff --git a/build/jvm-rules/src/jps-shadow/impl/GraphDataInputImpl.kt b/build/jvm-rules/src/jps-shadow/impl/GraphDataInputImpl.kt index 6f92cbab4a93..75352e7ce9f6 100644 --- a/build/jvm-rules/src/jps-shadow/impl/GraphDataInputImpl.kt +++ b/build/jvm-rules/src/jps-shadow/impl/GraphDataInputImpl.kt @@ -77,6 +77,10 @@ open class GraphDataInputImpl( return DataInputOutputUtil.readLONG(delegate) } + fun readRawLong(): Long { + return delegate.readLong() + } + override fun readFloat(): Float { return delegate.readFloat() } diff --git a/build/jvm-rules/src/jps-shadow/impl/GraphDataOutputImpl.kt b/build/jvm-rules/src/jps-shadow/impl/GraphDataOutputImpl.kt index 2abe2942cf5d..8dbd0094527e 100644 --- a/build/jvm-rules/src/jps-shadow/impl/GraphDataOutputImpl.kt +++ b/build/jvm-rules/src/jps-shadow/impl/GraphDataOutputImpl.kt @@ -65,6 +65,10 @@ open class GraphDataOutputImpl( DataInputOutputUtil.writeLONG(delegate, v) } + fun writeRawLong(v: Long) { + delegate.writeLong(v) + } + override fun writeFloat(v: Float) { delegate.writeFloat(v) } diff --git a/build/jvm-rules/src/jps-shadow/java/JVMClassNode.kt b/build/jvm-rules/src/jps-shadow/java/JVMClassNode.kt index 741edd09fcc0..203b3c72738a 100644 --- a/build/jvm-rules/src/jps-shadow/java/JVMClassNode.kt +++ b/build/jvm-rules/src/jps-shadow/java/JVMClassNode.kt @@ -2,6 +2,7 @@ package org.jetbrains.jps.dependency.java +import com.dynatrace.hash4j.hashing.Hashing import it.unimi.dsi.fastutil.Hash.Strategy import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap @@ -16,12 +17,14 @@ import org.jetbrains.jps.dependency.Usage import org.jetbrains.jps.dependency.diff.DiffCapable import org.jetbrains.jps.dependency.diff.Difference import org.jetbrains.jps.dependency.diff.Difference.Specifier +import org.jetbrains.jps.dependency.impl.GraphDataInputImpl +import org.jetbrains.jps.dependency.impl.GraphDataOutputImpl private val emptyMetadata = emptyArray>() abstract class JVMClassNode, D : Difference> : Proto, Node { private val id: JvmNodeReferenceID - private val outFilePath: String + private val outFilePathHash: Long private val usages: Collection private val metadata: Array> @@ -35,14 +38,15 @@ abstract class JVMClassNode, D : Difference> : Proto, Nod metadata: Iterable> ) : super(flags, signature, name, annotations) { id = JvmNodeReferenceID(name) - this.outFilePath = outFilePath + outFilePathHash = Hashing.xxh3_64().hashBytesToLong(outFilePath.toByteArray()) this.usages = usages as Collection this.metadata = (metadata as java.util.Collection>).toArray(emptyMetadata) } constructor(`in`: GraphDataInput) : super(`in`) { + val input = `in` as GraphDataInputImpl id = JvmNodeReferenceID(name) - outFilePath = `in`.readUTF() + outFilePathHash = input.readRawLong() val usages = ArrayList() var groupCount = `in`.readInt() @@ -57,7 +61,7 @@ abstract class JVMClassNode, D : Difference> : Proto, Nod override fun write(out: GraphDataOutput) { super.write(out) - out.writeUTF(outFilePath) + (out as GraphDataOutputImpl).writeRawLong(outFilePathHash) val classToUsageList = Object2ObjectLinkedOpenHashMap, MutableList>() for (usage in usages) { @@ -82,6 +86,7 @@ abstract class JVMClassNode, D : Difference> : Proto, Nod @Suppress("unused") fun getMetadata(): Iterable> = Iterable { metadata.iterator() } + @Suppress("unused") fun > getMetadata(metaClass: Class): Iterable { return metadata .asSequence() @@ -90,29 +95,35 @@ abstract class JVMClassNode, D : Difference> : Proto, Nod } internal fun > filterMetadata(metaClass: Class): Set { - if (metadata.size == 0) { + val size = metadata.size + if (size == 0) { return emptySet() } - else if (metadata.size == 1) { - if (metaClass.isInstance(metadata[0])) { - return ObjectOpenCustomHashSet(DiffCapableHashStrategy) + else if (size == 1) { + val m = metadata[0] + if (metaClass.isInstance(metadata)) { + val result = ObjectOpenCustomHashSet(1, DiffCapableHashStrategy) + @Suppress("UNCHECKED_CAST") + result.add(m as MT) + return result } else { return emptySet() } } - - var result: ObjectOpenCustomHashSet? = null - for (m in metadata) { - if (metaClass.isInstance(m)) { - if (result == null) { - result = ObjectOpenCustomHashSet(DiffCapableHashStrategy) + else { + var result: ObjectOpenCustomHashSet? = null + for (m in metadata) { + if (metaClass.isInstance(m)) { + if (result == null) { + result = ObjectOpenCustomHashSet(DiffCapableHashStrategy) + } + @Suppress("UNCHECKED_CAST") + result.add(m as MT) } - @Suppress("UNCHECKED_CAST") - result.add(m as MT) } + return result ?: emptySet() } - return result ?: emptySet() } final override fun isSame(other: DiffCapable<*, *>?): Boolean { @@ -124,11 +135,11 @@ abstract class JVMClassNode, D : Difference> : Proto, Nod return false } val that = other - return id == that.id && outFilePath == that.outFilePath + return outFilePathHash == that.outFilePathHash && id == that.id } final override fun diffHashCode(): Int { - return 31 * outFilePath.hashCode() + id.hashCode() + return 31 * outFilePathHash.toInt() + id.hashCode() } @Suppress("unused")