summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@yahooinc.com>2021-10-15 11:49:11 +0200
committerValerij Fredriksen <valerijf@yahooinc.com>2021-10-15 11:49:11 +0200
commit03a710a40926a3ea80072cc8676f4edd18662f84 (patch)
tree965111b6c87c22e9c144b2564474439bddf148b4
parentfa2aa2c40a3028752d861592f4a9b37982b80797 (diff)
Do not chown to root if file already existed
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java7
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemTest.java16
2 files changed, 21 insertions, 2 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java
index a85e4ee8699..cf1985eff58 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java
@@ -10,6 +10,7 @@ import java.nio.file.DirectoryStream;
import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystemAlreadyExistsException;
+import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.OpenOption;
import java.nio.file.Path;
@@ -80,8 +81,9 @@ class ContainerFileSystemProvider extends FileSystemProvider {
@Override
public SeekableByteChannel newByteChannel(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException {
Path pathOnHost = pathOnHost(path);
+ boolean existedBefore = Files.exists(pathOnHost);
SeekableByteChannel seekableByteChannel = provider(pathOnHost).newByteChannel(pathOnHost, options, attrs);
- fixOwnerToContainerRoot(toContainerPath(path));
+ if (!existedBefore) fixOwnerToContainerRoot(toContainerPath(path));
return seekableByteChannel;
}
@@ -94,8 +96,9 @@ class ContainerFileSystemProvider extends FileSystemProvider {
@Override
public void createDirectory(Path dir, FileAttribute<?>... attrs) throws IOException {
Path pathOnHost = pathOnHost(dir);
+ boolean existedBefore = Files.exists(pathOnHost);
provider(pathOnHost).createDirectory(pathOnHost);
- fixOwnerToContainerRoot(toContainerPath(dir));
+ if (!existedBefore) fixOwnerToContainerRoot(toContainerPath(dir));
}
@Override
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemTest.java
index fcd8e0ec406..970a264d0df 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemTest.java
@@ -6,6 +6,7 @@ import com.yahoo.vespa.test.file.TestFileSystem;
import org.junit.jupiter.api.Test;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -43,6 +44,21 @@ class ContainerFileSystemTest {
}
@Test
+ public void file_write_and_read() throws IOException {
+ ContainerPath containerPath = ContainerPath.fromPathInContainer(containerFs, Path.of("/file"));
+ UnixPath unixPath = new UnixPath(containerPath);
+ unixPath.writeUtf8File("hello");
+ assertOwnership(containerPath, 0, 0, 10000, 11000);
+
+ unixPath.setOwnerId(500).setGroupId(200);
+ assertOwnership(containerPath, 500, 200, 10500, 11200);
+ Files.write(containerPath, " world".getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
+ assertOwnership(containerPath, 500, 200, 10500, 11200); // Owner should not have been updated as the file already existed
+
+ assertEquals("hello world", unixPath.readUtf8File());
+ }
+
+ @Test
public void copy() throws IOException {
UnixPath hostFile = new UnixPath(fileSystem.getPath("/file")).createNewFile();
ContainerPath destination = ContainerPath.fromPathInContainer(containerFs, Path.of("/dest"));