From c10b64c3673828a5175ef508e7b1e9e35bf6abf1 Mon Sep 17 00:00:00 2001 From: Graeme Connell Date: Fri, 21 May 2021 09:54:00 -0600 Subject: [PATCH] Simplify S3ObjectMonitor API, try-with-resource. --- .../textsecuregcm/util/AsnManager.java | 4 +-- .../textsecuregcm/util/S3ObjectMonitor.java | 18 ++++------ .../util/TorExitNodeManager.java | 4 +-- .../util/S3ObjectMonitorTest.java | 34 +++++++++---------- 4 files changed, 26 insertions(+), 34 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/AsnManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/AsnManager.java index a87ae0a10..c4cfb8285 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/util/AsnManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/AsnManager.java @@ -24,8 +24,6 @@ import java.util.zip.GZIPInputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.configuration.MonitoredS3ObjectConfiguration; -import software.amazon.awssdk.core.ResponseInputStream; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; public class AsnManager implements Managed { @@ -71,7 +69,7 @@ public class AsnManager implements Managed { } } - private void handleAsnTableChanged(final ResponseInputStream asnTableObject) { + private void handleAsnTableChanged(final InputStream asnTableObject) { REFRESH_TIMER.record(() -> { try { handleAsnTableChangedStream(new GZIPInputStream(asnTableObject)); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitor.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitor.java index a7d0d7da3..55d43c73d 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitor.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitor.java @@ -8,6 +8,7 @@ package org.whispersystems.textsecuregcm.util; import com.google.common.annotations.VisibleForTesting; import io.dropwizard.lifecycle.Managed; import java.io.IOException; +import java.io.InputStream; import java.time.Duration; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -39,7 +40,7 @@ public class S3ObjectMonitor implements Managed { private final Duration refreshInterval; private ScheduledFuture refreshFuture; - private final Consumer> changeListener; + private final Consumer changeListener; private final AtomicReference lastETag = new AtomicReference<>(); @@ -54,7 +55,7 @@ public class S3ObjectMonitor implements Managed { final long maxObjectSize, final ScheduledExecutorService refreshExecutorService, final Duration refreshInterval, - final Consumer> changeListener) { + final Consumer changeListener) { this(S3Client.builder() .region(Region.of(s3Region)) @@ -76,7 +77,7 @@ public class S3ObjectMonitor implements Managed { final long maxObjectSize, final ScheduledExecutorService refreshExecutorService, final Duration refreshInterval, - final Consumer> changeListener) { + final Consumer changeListener) { this.s3Client = s3Client; this.s3Bucket = s3Bucket; @@ -152,15 +153,10 @@ public class S3ObjectMonitor implements Managed { final String refreshedETag = objectMetadata.eTag(); if (!StringUtils.equals(initialETag, refreshedETag) && lastETag.compareAndSet(initialETag, refreshedETag)) { - final ResponseInputStream response = getObject(); - - log.info("Object at s3://{}/{} has changed; new eTag is {} and object size is {} bytes", - s3Bucket, objectKey, response.response().eTag(), response.response().contentLength()); - - try { + try (final ResponseInputStream response = getObject()) { + log.info("Object at s3://{}/{} has changed; new eTag is {} and object size is {} bytes", + s3Bucket, objectKey, response.response().eTag(), response.response().contentLength()); changeListener.accept(response); - } finally { - response.close(); } } } catch (final Exception e) { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/TorExitNodeManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/TorExitNodeManager.java index a4dfbaf94..bfada005d 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/util/TorExitNodeManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/TorExitNodeManager.java @@ -23,8 +23,6 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.configuration.MonitoredS3ObjectConfiguration; -import software.amazon.awssdk.core.ResponseInputStream; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; /** * A utility for checking whether IP addresses belong to Tor exit nodes using the "bulk exit list." @@ -70,7 +68,7 @@ public class TorExitNodeManager implements Managed { return exitNodeAddresses.get().contains(address); } - private void handleExitListChanged(final ResponseInputStream exitList) { + private void handleExitListChanged(final InputStream exitList) { REFRESH_TIMER.record(() -> handleExitListChanged(exitList)); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitorTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitorTest.java index 8e373c99a..4895830f2 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitorTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/util/S3ObjectMonitorTest.java @@ -1,5 +1,19 @@ package org.whispersystems.textsecuregcm.util; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.UUID; +import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Consumer; import org.junit.jupiter.api.Test; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.http.AbortableInputStream; @@ -9,20 +23,6 @@ import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.HeadObjectRequest; import software.amazon.awssdk.services.s3.model.HeadObjectResponse; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.util.UUID; -import java.util.concurrent.ScheduledExecutorService; -import java.util.function.Consumer; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - class S3ObjectMonitorTest { @Test @@ -33,7 +33,7 @@ class S3ObjectMonitorTest { final String objectKey = "greatest-smooth-jazz-hits-of-all-time.zip"; //noinspection unchecked - final Consumer> listener = mock(Consumer.class); + final Consumer listener = mock(Consumer.class); final S3ObjectMonitor objectMonitor = new S3ObjectMonitor( s3Client, @@ -64,7 +64,7 @@ class S3ObjectMonitorTest { final String objectKey = "greatest-smooth-jazz-hits-of-all-time.zip"; //noinspection unchecked - final Consumer> listener = mock(Consumer.class); + final Consumer listener = mock(Consumer.class); final S3ObjectMonitor objectMonitor = new S3ObjectMonitor( s3Client, @@ -102,7 +102,7 @@ class S3ObjectMonitorTest { final long maxObjectSize = 16 * 1024 * 1024; //noinspection unchecked - final Consumer> listener = mock(Consumer.class); + final Consumer listener = mock(Consumer.class); final S3ObjectMonitor objectMonitor = new S3ObjectMonitor( s3Client,