From dc1c90f63f507b451e20a008385e13a4a215322a Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Wed, 21 Oct 2026 09:06:24 -0400 Subject: [PATCH] Reduced verification allocations - Dependency hashing reuses one read buffer per artifact - Hash tests cover large, short, and empty entries --- .../iris/buildtools/GenerationBuildRevision.java | 2 +- .../test/java/GenerationBuildRevisionTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java b/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java index d9b96e6e4..be0c9ab98 100644 --- a/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java +++ b/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java @@ -231,11 +231,11 @@ public final class GenerationBuildRevision { throw new IOException("Duplicate dependency artifact entry: " + name); } } + byte[] buffer = new byte[16 * 1024]; for (Map.Entry entry : entries.entrySet()) { update(digest, entry.getKey()); try (InputStream input = zip.getInputStream(entry.getValue())) { MessageDigest content = digest(); - byte[] buffer = new byte[16 * 1024]; int read; while ((read = input.read(buffer)) != -1) { content.update(buffer, 0, read); diff --git a/buildSrc/src/test/java/GenerationBuildRevisionTest.java b/buildSrc/src/test/java/GenerationBuildRevisionTest.java index 65aeafb08..c743154ab 100644 --- a/buildSrc/src/test/java/GenerationBuildRevisionTest.java +++ b/buildSrc/src/test/java/GenerationBuildRevisionTest.java @@ -58,6 +58,22 @@ public class GenerationBuildRevisionTest { GenerationBuildRevision.capture(fixture.options(), dependencies))); } + @Test + public void hashesLargeShortAndEmptyEntriesIndependently() throws Exception { + Path dependency = temporary.newFile("multiple-entries.jar").toPath(); + Map contents = Map.of("example/Large.class", "abc".repeat(11_000), + "example/Short.class", "tail", "example/Zero.class", ""); + try (ZipOutputStream output = new ZipOutputStream(Files.newOutputStream(dependency))) { + for (String name : List.of("example/Zero.class", "example/Short.class", "example/Large.class")) { + output.putNextEntry(new ZipEntry(name)); + output.write(contents.get(name).getBytes(StandardCharsets.UTF_8)); + output.closeEntry(); + } + } + assertEquals("49217af891afa3111d1f70a390acacc8bad700528b61b1ecc5637c060aeb52cd", + GenerationBuildRevision.artifactHash(dependency)); + } + @Test public void rejectsChangedAddedAndDeletedGenerationSources() throws Exception { Fixture fixture = fixture();