Skip to content

Commit 0613de2

Browse files
committed
Make accessFilter file registration thread safe
1 parent 26f16f7 commit 0613de2

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,23 @@
4040
*/
4141
package org.graalvm.buildtools.agent;
4242

43-
import java.io.File;
4443
import java.io.IOException;
4544
import java.io.InputStream;
4645
import java.io.Serializable;
47-
import java.nio.file.CopyOption;
48-
import java.nio.file.Files;
49-
import java.nio.file.Path;
50-
import java.nio.file.StandardCopyOption;
46+
import java.nio.file.*;
5147
import java.util.ArrayList;
5248
import java.util.Collection;
5349
import java.util.List;
50+
import java.util.logging.Logger;
5451

5552
public class AgentConfiguration implements Serializable {
5653

57-
private static final String DEFAULT_ACCESS_FILTER_FILE = "/access-filter.json";
54+
private static final String ACCESS_FILTER_PREFIX = "access-filter";
55+
private static final String ACCESS_FILTER_SUFFIX = ".json";
56+
private static final String DEFAULT_ACCESS_FILTER_FILE_LOCATION = "/" + ACCESS_FILTER_PREFIX + ACCESS_FILTER_SUFFIX;
57+
58+
private static final Logger logger = Logger.getGlobal();
59+
5860
private final Collection<String> callerFilterFiles;
5961
private final Collection<String> accessFilterFiles;
6062
private final Boolean builtinCallerFilter;
@@ -144,23 +146,36 @@ private void addDefaultAccessFilter() {
144146

145147
String tempDir = System.getProperty("java.io.tmpdir");
146148
Path agentDir = Path.of(tempDir).resolve("agent-config");
147-
Path accessFilterFile = agentDir.resolve("access-filter.json");
149+
Path accessFilterFile = agentDir.resolve(ACCESS_FILTER_PREFIX + ACCESS_FILTER_SUFFIX);
148150
if (Files.exists(accessFilterFile)) {
149151
accessFilterFiles.add(accessFilterFile.toString());
150152
return;
151153
}
152154

153-
try(InputStream accessFilter = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE)) {
154-
if (accessFilter != null) {
155-
if (!Files.exists(agentDir)) {
156-
Files.createDirectory(agentDir);
157-
}
155+
try(InputStream accessFilterData = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE_LOCATION)) {
156+
if (accessFilterData == null) {
157+
throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE_LOCATION);
158+
}
159+
160+
try {
161+
Files.createDirectory(agentDir);
162+
} catch (FileAlreadyExistsException e) {
163+
logger.info("Ignore directory creation because " + agentDir + " directory is already created.");
164+
}
165+
166+
long pid = ProcessHandle.current().pid();
167+
long time = System.currentTimeMillis();
168+
Path tmpAccessFilter = agentDir.resolve(ACCESS_FILTER_PREFIX + '_' + pid + '_' + time + '_' + ACCESS_FILTER_SUFFIX);
169+
Files.copy(accessFilterData, tmpAccessFilter);
158170

159-
Files.copy(accessFilter, accessFilterFile, StandardCopyOption.REPLACE_EXISTING);
160-
accessFilterFiles.add(accessFilterFile.toString());
161-
} else {
162-
throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE);
171+
try {
172+
Files.move(tmpAccessFilter, accessFilterFile, StandardCopyOption.ATOMIC_MOVE);
173+
} catch (FileAlreadyExistsException e) {
174+
Files.delete(tmpAccessFilter);
175+
logger.info("Access-filter file already exists. Delete the temporary one.");
163176
}
177+
178+
accessFilterFiles.add(accessFilterFile.toString());
164179
} catch (IOException e) {
165180
throw new RuntimeException("Cannot add default access-filter.json" ,e);
166181
}

0 commit comments

Comments
 (0)