From c93190ff0d0e4af24230c5211c5904c7a8252d15 Mon Sep 17 00:00:00 2001 From: Daniel Albuquerque Date: Fri, 24 Jan 2020 15:11:47 +0000 Subject: [PATCH 1/2] Add small delay in while loop to avoid spamming logs (ResourceReaper) --- .../org/testcontainers/utility/ResourceReaper.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java index f46db952c37..4dd148517bd 100644 --- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java +++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java @@ -18,7 +18,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.DockerClientFactory; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -137,6 +136,14 @@ public static String start(String hostIpAddress, DockerClient client) { } } catch (IOException e) { log.warn("Can not connect to Ryuk at {}:{}", hostIpAddress, ryukPort, e); + + try { + // sleep for a moment to avoid excessive log spam + Thread.sleep(500); + } catch (InterruptedException interrupted) { + Thread.currentThread().interrupt(); + throw new RuntimeException(interrupted); + } } } }, @@ -341,12 +348,12 @@ public void unregisterNetwork(String identifier) { public void unregisterContainer(String identifier) { registeredContainers.remove(identifier); } - + public void registerImageForCleanup(String dockerImageName) { setHook(); registeredImages.add(dockerImageName); } - + private void removeImage(String dockerImageName) { LOGGER.trace("Removing image tagged {}", dockerImageName); try { From 5c3ac325bc7e597301b608ff3e8cea5a24ddba4f Mon Sep 17 00:00:00 2001 From: Daniel Albuquerque Date: Sat, 25 Jan 2020 12:45:03 +0000 Subject: [PATCH 2/2] Add small delay in while loop to avoid spamming logs (ResourceReaper) - Replaced Thread.sleep with RateLimiter --- .../utility/ResourceReaper.java | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java index 4dd148517bd..f74905e60ef 100644 --- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java +++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java @@ -15,6 +15,8 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.rnorth.ducttape.ratelimits.RateLimiter; +import org.rnorth.ducttape.ratelimits.RateLimiterBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.DockerClientFactory; @@ -48,6 +50,11 @@ public final class ResourceReaper { private static final Logger LOGGER = LoggerFactory.getLogger(ResourceReaper.class); private static final List>> DEATH_NOTE = new ArrayList<>(); + private static final RateLimiter RYUK_ACK_RATE_LIMITER = RateLimiterBuilder + .newBuilder() + .withRate(4, TimeUnit.SECONDS) + .withConstantThroughput() + .build(); private static ResourceReaper instance; private final DockerClient dockerClient; @@ -109,42 +116,36 @@ public static String start(String hostIpAddress, DockerClient client) { DockerClientFactory.TESTCONTAINERS_THREAD_GROUP, () -> { while (true) { - int index = 0; - try(Socket clientSocket = new Socket(hostIpAddress, ryukPort)) { - FilterRegistry registry = new FilterRegistry(clientSocket.getInputStream(), clientSocket.getOutputStream()); - - synchronized (DEATH_NOTE) { - while (true) { - if (DEATH_NOTE.size() <= index) { - try { - DEATH_NOTE.wait(1_000); - continue; - } catch (InterruptedException e) { - throw new RuntimeException(e); + RYUK_ACK_RATE_LIMITER.doWhenReady(() -> { + int index = 0; + try(Socket clientSocket = new Socket(hostIpAddress, ryukPort)) { + FilterRegistry registry = new FilterRegistry(clientSocket.getInputStream(), clientSocket.getOutputStream()); + + synchronized (DEATH_NOTE) { + while (true) { + if (DEATH_NOTE.size() <= index) { + try { + DEATH_NOTE.wait(1_000); + continue; + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + List> filters = DEATH_NOTE.get(index); + boolean isAcknowledged = registry.register(filters); + if (isAcknowledged) { + log.debug("Received 'ACK' from Ryuk"); + ryukScheduledLatch.countDown(); + index++; + } else { + log.debug("Didn't receive 'ACK' from Ryuk. Will retry to send filters."); } - } - List> filters = DEATH_NOTE.get(index); - boolean isAcknowledged = registry.register(filters); - if (isAcknowledged) { - log.debug("Received 'ACK' from Ryuk"); - ryukScheduledLatch.countDown(); - index++; - } else { - log.debug("Didn't receive 'ACK' from Ryuk. Will retry to send filters."); } } + } catch (IOException e) { + log.warn("Can not connect to Ryuk at {}:{}", hostIpAddress, ryukPort, e); } - } catch (IOException e) { - log.warn("Can not connect to Ryuk at {}:{}", hostIpAddress, ryukPort, e); - - try { - // sleep for a moment to avoid excessive log spam - Thread.sleep(500); - } catch (InterruptedException interrupted) { - Thread.currentThread().interrupt(); - throw new RuntimeException(interrupted); - } - } + }); } }, "testcontainers-ryuk"