jetcd icon indicating copy to clipboard operation
jetcd copied to clipboard

io.etcd.jetcd.launcher.EtcdContainer -- Error deleting directory when using jetcd-tests on unit-testing.

Open matheuscirillo opened this issue 1 year ago • 2 comments

Versions

  • etcd: 3.5.10
  • jetcd: 0.7.7
  • java: 21

Describe the bug At the end of unit tests when using jetcd-tests, an error io.etcd.jetcd.launcher.EtcdContainer -- Error deleting directory is thrown. It doesn't prevent the test to run successfully, but I wonder if it's something wrong I'm doing.

To Reproduce

import io.etcd.jetcd.ByteSequence;
import io.etcd.jetcd.Client;
import io.etcd.jetcd.KV;
import io.etcd.jetcd.kv.GetResponse;
import io.etcd.jetcd.kv.PutResponse;
import io.etcd.jetcd.test.EtcdClusterExtension;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class SimpleTest {

    @RegisterExtension
    public static final EtcdClusterExtension cluster = EtcdClusterExtension.builder()
            .withNodes(1)
            .build();

    Client client = Client.builder().endpoints(cluster.clientEndpoints()).build();

    @Test
    public void testing() throws ExecutionException, InterruptedException {
        KV kvClient = client.getKVClient();
        CompletableFuture<PutResponse> put = kvClient.put(ByteSequence.from("a", StandardCharsets.UTF_8), ByteSequence.from("v", StandardCharsets.UTF_8));
        put.join();
        CompletableFuture<GetResponse> get = kvClient.get(ByteSequence.from("a", StandardCharsets.UTF_8));
        Assertions.assertEquals(get.get().getCount(), 1);
    }

Unit test logs:

21:34:20.504 [main] INFO org.testcontainers.images.PullPolicy -- Image pull policy will be performed by: DefaultPullPolicy()
21:34:20.507 [main] INFO org.testcontainers.utility.ImageNameSubstitutor -- Image name substitution will be performed by: DefaultImageNameSubstitutor (composite of 'ConfigurationFileImageNameSubstitutor' and 'PrefixingImageNameSubstitutor')
21:34:20.791 [Thread-0] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy -- Found Docker environment with Environment variables, system properties and defaults. Resolved dockerHost=unix:///var/run/docker.sock
21:34:20.792 [Thread-0] INFO org.testcontainers.DockerClientFactory -- Docker host IP address is localhost
21:34:20.802 [Thread-0] INFO org.testcontainers.DockerClientFactory -- Connected to docker: 
  Server Version: 25.0.1
  API Version: 1.44
  Operating System: Ubuntu 22.04.3 LTS
  Total Memory: 15885 MB
21:34:20.814 [Thread-0] INFO tc.testcontainers/ryuk:0.5.1 -- Creating container for image: testcontainers/ryuk:0.5.1
21:34:20.877 [Thread-0] INFO tc.testcontainers/ryuk:0.5.1 -- Container testcontainers/ryuk:0.5.1 is starting: 52e65e1102df9efa2ac0feb6a54528e2c7a346a7e575ae14a57b43d2d19c14ed
21:34:21.169 [Thread-0] INFO tc.testcontainers/ryuk:0.5.1 -- Container testcontainers/ryuk:0.5.1 started in PT0.355794278S
21:34:21.172 [Thread-0] INFO org.testcontainers.utility.RyukResourceReaper -- Ryuk started - will monitor and terminate Testcontainers containers on JVM exit
21:34:21.172 [Thread-0] INFO org.testcontainers.DockerClientFactory -- Checking the system...
21:34:21.172 [Thread-0] INFO org.testcontainers.DockerClientFactory -- ✔︎ Docker server version should be at least 1.6.0
21:34:21.176 [Thread-0] INFO tc.gcr.io/etcd-development/etcd:v3.5.10 -- Creating container for image: gcr.io/etcd-development/etcd:v3.5.10
21:34:21.837 [Thread-0] INFO tc.gcr.io/etcd-development/etcd:v3.5.10 -- Container gcr.io/etcd-development/etcd:v3.5.10 is starting: 9ca6709f3771ba2abb87a9a852cf991fcc5ecc3fec7cdca86c9350e01566f605
21:34:22.172 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.171838Z","caller":"flags/flag.go:113","msg":"recognized and used environment variable","variable-name":"ETCD_LOG_LEVEL","variable-value":"info"}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.171953Z","caller":"flags/flag.go:113","msg":"recognized and used environment variable","variable-name":"ETCD_LOGGER","variable-value":"zap"}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"warn","ts":"2024-01-31T00:34:22.172227Z","caller":"embed/config.go:676","msg":"Running http and grpc server on single port. This is not recommended for production."}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.172247Z","caller":"etcdmain/etcd.go:73","msg":"Running: ","args":["etcd","--name","etcd0","--advertise-client-urls","http://0.0.0.0:2379","--listen-client-urls","http://0.0.0.0:2379","--data-dir","/data.etcd"]}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"warn","ts":"2024-01-31T00:34:22.172308Z","caller":"embed/config.go:676","msg":"Running http and grpc server on single port. This is not recommended for production."}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.172315Z","caller":"embed/etcd.go:127","msg":"configuring peer listeners","listen-peer-urls":["http://localhost:2380"]}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.172774Z","caller":"embed/etcd.go:135","msg":"configuring client listeners","listen-client-urls":["http://0.0.0.0:2379"]}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.17286Z","caller":"embed/etcd.go:309","msg":"starting an etcd server","etcd-version":"3.5.10","git-sha":"0223ca52b","go-version":"go1.20.10","go-os":"linux","go-arch":"amd64","max-cpu-set":24,"max-cpu-available":24,"member-initialized":false,"name":"etcd0","data-dir":"/data.etcd","wal-dir":"","wal-dir-dedicated":"","member-dir":"/data.etcd/member","force-new-cluster":false,"heartbeat-interval":"100ms","election-timeout":"1s","initial-election-tick-advance":true,"snapshot-count":100000,"max-wals":5,"max-snapshots":5,"snapshot-catchup-entries":5000,"initial-advertise-peer-urls":["http://localhost:2380"],"listen-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://0.0.0.0:2379"],"listen-client-urls":["http://0.0.0.0:2379"],"listen-metrics-urls":[],"cors":["*"],"host-whitelist":["*"],"initial-cluster":"etcd0=http://localhost:2380","initial-cluster-state":"new","initial-cluster-token":"etcd-cluster","quota-backend-bytes":2147483648,"max-request-bytes":1572864,"max-concurrent-streams":4294967295,"pre-vote":true,"initial-corrupt-check":false,"corrupt-check-time-interval":"0s","compact-check-time-enabled":false,"compact-check-time-interval":"1m0s","auto-compaction-mode":"periodic","auto-compaction-retention":"0s","auto-compaction-interval":"0s","discovery-url":"","discovery-proxy":"","downgrade-check-interval":"5s"}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"warn","ts":"2024-01-31T00:34:22.172899Z","caller":"fileutil/fileutil.go:53","msg":"check file permission","error":"directory \"/data.etcd\" exist, but the permission is \"drwxrwxr-x\". The recommended permission is \"-rwx------\" to prevent possible unprivileged access to the data"}
21:34:22.173 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.173622Z","caller":"etcdserver/backend.go:81","msg":"opened backend db","path":"/data.etcd/member/snap/db","took":"527.12µs"}
21:34:22.175 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.175746Z","caller":"etcdserver/raft.go:495","msg":"starting local member","local-member-id":"8e9e05c52164694d","cluster-id":"cdf818194e3a8c32"}
21:34:22.175 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.175779Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d switched to configuration voters=()"}
21:34:22.176 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.175796Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became follower at term 0"}
21:34:22.176 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.175801Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]"}
21:34:22.176 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.175805Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became follower at term 1"}
21:34:22.176 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.175823Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d switched to configuration voters=(10276657743932975437)"}
21:34:22.176 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"warn","ts":"2024-01-31T00:34:22.176635Z","caller":"auth/store.go:1241","msg":"simple token is not cryptographically signed"}
21:34:22.177 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.177236Z","caller":"mvcc/kvstore.go:407","msg":"kvstore restored","current-rev":1}
21:34:22.177 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.17757Z","caller":"etcdserver/quota.go:94","msg":"enabled backend quota with default value","quota-name":"v3-applier","quota-size-bytes":2147483648,"quota-size":"2.1 GB"}
21:34:22.178 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.177898Z","caller":"etcdserver/server.go:854","msg":"starting etcd server","local-member-id":"8e9e05c52164694d","local-server-version":"3.5.10","cluster-version":"to_be_decided"}
21:34:22.178 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.177945Z","caller":"etcdserver/server.go:738","msg":"started as single-node; fast-forwarding election ticks","local-member-id":"8e9e05c52164694d","forward-ticks":9,"forward-duration":"900ms","election-ticks":10,"election-timeout":"1s"}
21:34:22.178 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.177953Z","caller":"fileutil/purge.go:44","msg":"started to purge file","dir":"/data.etcd/member/snap","suffix":"snap.db","max":5,"interval":"30s"}
21:34:22.178 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.178Z","caller":"fileutil/purge.go:44","msg":"started to purge file","dir":"/data.etcd/member/snap","suffix":"snap","max":5,"interval":"30s"}
21:34:22.178 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.178012Z","caller":"fileutil/purge.go:44","msg":"started to purge file","dir":"/data.etcd/member/wal","suffix":"wal","max":5,"interval":"30s"}
21:34:22.178 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.178514Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d switched to configuration voters=(10276657743932975437)"}
21:34:22.178 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.178765Z","caller":"membership/cluster.go:421","msg":"added member","cluster-id":"cdf818194e3a8c32","local-member-id":"8e9e05c52164694d","added-peer-id":"8e9e05c52164694d","added-peer-peer-urls":["http://localhost:2380"]}
21:34:22.179 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.179325Z","caller":"embed/etcd.go:278","msg":"now serving peer/client/metrics","local-member-id":"8e9e05c52164694d","initial-advertise-peer-urls":["http://localhost:2380"],"listen-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://0.0.0.0:2379"],"listen-client-urls":["http://0.0.0.0:2379"],"listen-metrics-urls":[]}
21:34:22.179 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.179355Z","caller":"embed/etcd.go:597","msg":"serving peer traffic","address":"127.0.0.1:2380"}
21:34:22.179 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.179365Z","caller":"embed/etcd.go:569","msg":"cmux::serve","address":"127.0.0.1:2380"}
21:34:22.255 [Thread-0] INFO org.testcontainers.containers.wait.strategy.HttpWaitStrategy -- /stoic_galileo: Waiting for 60 seconds for URL: http://localhost:32813/health (where port 32813 maps to container port 2379)
21:34:22.977 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.976537Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d is starting a new election at term 1"}
21:34:22.977 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.976572Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became pre-candidate at term 1"}
21:34:22.977 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.976588Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d received MsgPreVoteResp from 8e9e05c52164694d at term 1"}
21:34:22.977 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.976602Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became candidate at term 2"}
21:34:22.977 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.976628Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2"}
21:34:22.977 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.976639Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"8e9e05c52164694d became leader at term 2"}
21:34:22.978 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.976648Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2"}
21:34:22.986 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.986573Z","caller":"etcdserver/server.go:2062","msg":"published local member to cluster through raft","local-member-id":"8e9e05c52164694d","local-member-attributes":"{Name:etcd0 ClientURLs:[http://0.0.0.0:2379]}","request-path":"/0/members/8e9e05c52164694d/attributes","cluster-id":"cdf818194e3a8c32","publish-timeout":"7s"}
21:34:22.986 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.986575Z","caller":"embed/serve.go:103","msg":"ready to serve client requests"}
21:34:22.986 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.986574Z","caller":"etcdserver/server.go:2571","msg":"setting up initial cluster version using v2 API","cluster-version":"3.5"}
21:34:22.986 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.986714Z","caller":"etcdmain/main.go:44","msg":"notifying init daemon"}
21:34:22.987 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.98676Z","caller":"etcdmain/main.go:50","msg":"successfully notified init daemon"}
21:34:22.987 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.986875Z","caller":"membership/cluster.go:584","msg":"set initial cluster version","cluster-id":"cdf818194e3a8c32","local-member-id":"8e9e05c52164694d","cluster-version":"3.5"}
21:34:22.987 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.986944Z","caller":"api/capability.go:75","msg":"enabled capabilities for version","cluster-version":"3.5"}
21:34:22.987 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.986963Z","caller":"etcdserver/server.go:2595","msg":"cluster version is updated","cluster-version":"3.5"}
21:34:22.987 [docker-java-stream--1960887894] INFO io.etcd.jetcd.launcher.EtcdContainer -- [etcd0] STDERR: {"level":"info","ts":"2024-01-31T00:34:22.987399Z","caller":"embed/serve.go:187","msg":"serving client traffic insecurely; this is strongly discouraged!","traffic":"grpc+http","address":"[::]:2379"}
21:34:22.989 [Thread-0] INFO tc.gcr.io/etcd-development/etcd:v3.5.10 -- Container gcr.io/etcd-development/etcd:v3.5.10 started in PT1.813295367S
21:34:23.702 [main] ERROR io.etcd.jetcd.launcher.EtcdContainer -- Error deleting directory /tmp/jetcd_test_etcd0_9431954294630948422
java.io.UncheckedIOException: java.nio.file.AccessDeniedException: /tmp/jetcd_test_etcd0_9431954294630948422/member
	at java.base/java.nio.file.FileTreeIterator.fetchNextIfNeeded(FileTreeIterator.java:87)
	at java.base/java.nio.file.FileTreeIterator.hasNext(FileTreeIterator.java:103)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:132)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at io.etcd.jetcd.launcher.EtcdContainer.deleteDataDirectory(EtcdContainer.java:218)
	at io.etcd.jetcd.launcher.EtcdContainer.close(EtcdContainer.java:251)
	at io.etcd.jetcd.launcher.EtcdClusterImpl.close(EtcdClusterImpl.java:102)
	at io.etcd.jetcd.test.EtcdClusterExtension.after(EtcdClusterExtension.java:108)
	at io.etcd.jetcd.test.EtcdClusterExtension.afterAll(EtcdClusterExtension.java:90)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$18(ClassBasedTestDescriptor.java:462)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$19(ClassBasedTestDescriptor.java:462)
	at org.junit.platform.commons.util.CollectionUtils.forEachInReverseOrder(CollectionUtils.java:217)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeAfterAllCallbacks(ClassBasedTestDescriptor.java:461)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:236)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:85)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:161)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:161)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:63)
	at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: java.nio.file.AccessDeniedException: /tmp/jetcd_test_etcd0_9431954294630948422/member
	at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)
	at java.base/sun.nio.fs.UnixException.asIOException(UnixException.java:115)
	at java.base/sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:477)
	at java.base/java.nio.file.Files.newDirectoryStream(Files.java:481)
	at java.base/java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:301)
	at java.base/java.nio.file.FileTreeWalker.next(FileTreeWalker.java:374)
	at java.base/java.nio.file.FileTreeIterator.fetchNextIfNeeded(FileTreeIterator.java:83)
	... 58 common frames omitted

Expected behavior It is expected that this AccessDeniedException don't appear at all.

Additional context

  • The tests are running successfully.
  • Using JUnit 5 with jetcd-tests and jetcd-launcher. Docker version is 25.0.1, as shown in the logs

matheuscirillo avatar Jan 31 '24 00:01 matheuscirillo

  • I noticed this issue at https://github.com/apache/shardingsphere/pull/30003 when trying to convert org.testcontainers.containers.GenericContainer to io.etcd.jetcd.test.EtcdClusterExtension. Then I checked https://github.com/etcd-io/jetcd/blob/jetcd-0.7.7/jetcd-launcher/src/main/java/io/etcd/jetcd/launcher/EtcdContainer.java .

  • The default value of shouldMountDataDirectory of io.etcd.jetcd.launcher.EtcdContainer is true. Once shouldMountDataDirectory is true, io.etcd.jetcd.launcher.EtcdContainer.configure() will start mounting files to the actual directory.

if (shouldMountDataDirectory) {
    dataDirectory = createDataDirectory(node);
    addFileSystemBind(dataDirectory.toString(), Etcd.ETCD_DATA_DIR, BindMode.READ_WRITE, SelinuxContext.SHARED);
}
  • To be honest, I can't think of a reason why the directory needs to be mounted by default. Because using the Docker Image of quay.io/coreos/etcd does not require this.

  • Of course, there is an option for io.etcd.jetcd.test.EtcdClusterExtension to modify all subcontainers. So here's my thinking.

@RegisterExtension
public static final EtcdClusterExtension CLUSTER = EtcdClusterExtension.builder()
            .withNodes(1)
            .withMountDirectory(false)
            .build();
  • @lburgazzoli I noticed recently that it's you who changed https://github.com/etcd-io/jetcd/blob/jetcd-0.7.7/jetcd-launcher/src/main/java/io/etcd/jetcd/launcher/EtcdContainer.java , can we change the default value of the shouldMountDataDirectory property to false? Because when unit tests are executed under GraalVM Native Image, the permissions of external files are usually designed not to be changed, see https://github.com/oracle/graal/issues/7860 .

linghengqian avatar Feb 05 '24 07:02 linghengqian

  • To be honest, I can't think of a reason why the directory needs to be mounted by default. Because using the Docker Image of quay.io/coreos/etcd does not require this.

This is something that has nothing to do with the requirement of the container image but it is something implemented for our test suite which for some tests requires to manipulate the content of the data dir.

* @lburgazzoli I noticed recently that it's you who changed https://github.com/etcd-io/jetcd/blob/jetcd-0.7.7/jetcd-launcher/src/main/java/io/etcd/jetcd/launcher/EtcdContainer.java , can we change the default value of the `shouldMountDataDirectory` property to `false`? Because when unit tests are executed under GraalVM Native Image, the permissions of external files are usually designed not to be changed, see [`java.nio.file.Files#setPosixFilePermissions` cannot be used under Native Image oracle/graal#7860](https://github.com/oracle/graal/issues/7860) .

Before changing the behavior, you need to check what the current test suite is doing.

In any case, this does not solve the issue but just hide it so it would be nice to find out if there is a way to make it working regardless of the flag.

lburgazzoli avatar Feb 05 '24 07:02 lburgazzoli