From 914d36069e66c4a32df64443a45e3af2736550b0 Mon Sep 17 00:00:00 2001 From: David Nestorovic Date: Thu, 31 Oct 2024 14:59:44 +0100 Subject: [PATCH 1/2] Make accessFilter file registration thread safe --- .../buildtools/agent/AgentConfiguration.java | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java b/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java index 2072b4cdb..bfda3905c 100644 --- a/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java +++ b/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java @@ -40,21 +40,23 @@ */ package org.graalvm.buildtools.agent; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; -import java.nio.file.CopyOption; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; +import java.nio.file.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.logging.Logger; public class AgentConfiguration implements Serializable { - private static final String DEFAULT_ACCESS_FILTER_FILE = "/access-filter.json"; + private static final String ACCESS_FILTER_PREFIX = "access-filter"; + private static final String ACCESS_FILTER_SUFFIX = ".json"; + private static final String DEFAULT_ACCESS_FILTER_FILE_LOCATION = "/" + ACCESS_FILTER_PREFIX + ACCESS_FILTER_SUFFIX; + + private static final Logger logger = Logger.getGlobal(); + private final Collection callerFilterFiles; private final Collection accessFilterFiles; private final Boolean builtinCallerFilter; @@ -144,23 +146,36 @@ private void addDefaultAccessFilter() { String tempDir = System.getProperty("java.io.tmpdir"); Path agentDir = Path.of(tempDir).resolve("agent-config"); - Path accessFilterFile = agentDir.resolve("access-filter.json"); + Path accessFilterFile = agentDir.resolve(ACCESS_FILTER_PREFIX + ACCESS_FILTER_SUFFIX); if (Files.exists(accessFilterFile)) { accessFilterFiles.add(accessFilterFile.toString()); return; } - try(InputStream accessFilter = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE)) { - if (accessFilter != null) { - if (!Files.exists(agentDir)) { - Files.createDirectory(agentDir); - } + try(InputStream accessFilterData = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE_LOCATION)) { + if (accessFilterData == null) { + throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE_LOCATION); + } + + try { + Files.createDirectory(agentDir); + } catch (FileAlreadyExistsException e) { + logger.info("Ignore directory creation because " + agentDir + " directory is already created."); + } + + long pid = ProcessHandle.current().pid(); + long time = System.currentTimeMillis(); + Path tmpAccessFilter = agentDir.resolve(ACCESS_FILTER_PREFIX + '_' + pid + '_' + time + '_' + ACCESS_FILTER_SUFFIX); + Files.copy(accessFilterData, tmpAccessFilter); - Files.copy(accessFilter, accessFilterFile, StandardCopyOption.REPLACE_EXISTING); - accessFilterFiles.add(accessFilterFile.toString()); - } else { - throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE); + try { + Files.move(tmpAccessFilter, accessFilterFile, StandardCopyOption.ATOMIC_MOVE); + } catch (FileAlreadyExistsException e) { + Files.delete(tmpAccessFilter); + logger.info("Access-filter file already exists. Delete the temporary one."); } + + accessFilterFiles.add(accessFilterFile.toString()); } catch (IOException e) { throw new RuntimeException("Cannot add default access-filter.json" ,e); } From 84b16a340857a00ac541f7828efa326e13cac7ed Mon Sep 17 00:00:00 2001 From: David Nestorovic Date: Tue, 12 Nov 2024 14:49:41 +0100 Subject: [PATCH 2/2] Improve error messages --- .../org/graalvm/buildtools/agent/AgentConfiguration.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java b/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java index bfda3905c..4ed13d01c 100644 --- a/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java +++ b/common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java @@ -154,13 +154,13 @@ private void addDefaultAccessFilter() { try(InputStream accessFilterData = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE_LOCATION)) { if (accessFilterData == null) { - throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE_LOCATION); + throw new IOException("Cannot access data from: " + DEFAULT_ACCESS_FILTER_FILE_LOCATION); } try { Files.createDirectory(agentDir); } catch (FileAlreadyExistsException e) { - logger.info("Ignore directory creation because " + agentDir + " directory is already created."); + logger.info("Skip creation of directory " + agentDir + " (already created)."); } long pid = ProcessHandle.current().pid(); @@ -172,7 +172,7 @@ private void addDefaultAccessFilter() { Files.move(tmpAccessFilter, accessFilterFile, StandardCopyOption.ATOMIC_MOVE); } catch (FileAlreadyExistsException e) { Files.delete(tmpAccessFilter); - logger.info("Access-filter file already exists. Delete the temporary one."); + logger.info(accessFilterFile + " already exists. Delete " + tmpAccessFilter); } accessFilterFiles.add(accessFilterFile.toString());