mirror of https://github.com/grpc/grpc-java.git
all: prepare for ErrorProne's FutureReturnValueIgnored
Futures almost universally should be handled in some way when being returned, either to receive the value or to cancel scheduled tasks to prevent leaks. Netty is a bit of a special case though, since it constantly returns futures that you ignore (even adding a listener returns the "this" future). So we want to suppress the warning for code using Netty instead of trying to fix it. When we enable ErrorProne in the build, we should start passing -Xep:FutureReturnValueIgnored:OFF in the compilerArgs.
This commit is contained in:
parent
9fc4fa18aa
commit
72923dca87
|
|
@ -56,6 +56,7 @@ import io.netty.channel.local.LocalAddress;
|
||||||
import io.netty.channel.local.LocalChannel;
|
import io.netty.channel.local.LocalChannel;
|
||||||
import io.netty.channel.local.LocalServerChannel;
|
import io.netty.channel.local.LocalServerChannel;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.openjdk.jmh.annotations.Benchmark;
|
import org.openjdk.jmh.annotations.Benchmark;
|
||||||
import org.openjdk.jmh.annotations.BenchmarkMode;
|
import org.openjdk.jmh.annotations.BenchmarkMode;
|
||||||
|
|
@ -182,7 +183,7 @@ public class TransportBenchmark {
|
||||||
throw new Exception("failed to shut down server");
|
throw new Exception("failed to shut down server");
|
||||||
}
|
}
|
||||||
if (groupToShutdown != null) {
|
if (groupToShutdown != null) {
|
||||||
groupToShutdown.shutdownGracefully(0, 1, TimeUnit.SECONDS);
|
Future<?> unused = groupToShutdown.shutdownGracefully(0, 1, TimeUnit.SECONDS);
|
||||||
groupToShutdown.awaitTermination(1, TimeUnit.SECONDS);
|
groupToShutdown.awaitTermination(1, TimeUnit.SECONDS);
|
||||||
if (!groupToShutdown.isTerminated()) {
|
if (!groupToShutdown.isTerminated()) {
|
||||||
throw new Exception("failed to shut down event loop group.");
|
throw new Exception("failed to shut down event loop group.");
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import com.google.common.truth.Truth;
|
import com.google.common.truth.Truth;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
@ -189,7 +190,7 @@ public class DeadlineTest {
|
||||||
Deadline base = Deadline.after(50, TimeUnit.MICROSECONDS, ticker);
|
Deadline base = Deadline.after(50, TimeUnit.MICROSECONDS, ticker);
|
||||||
ScheduledExecutorService mockScheduler = mock(ScheduledExecutorService.class);
|
ScheduledExecutorService mockScheduler = mock(ScheduledExecutorService.class);
|
||||||
final AtomicBoolean executed = new AtomicBoolean();
|
final AtomicBoolean executed = new AtomicBoolean();
|
||||||
base.runOnExpiration(
|
Future<?> unused = base.runOnExpiration(
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
@ -208,7 +209,7 @@ public class DeadlineTest {
|
||||||
Deadline base = Deadline.after(0, TimeUnit.MICROSECONDS, ticker);
|
Deadline base = Deadline.after(0, TimeUnit.MICROSECONDS, ticker);
|
||||||
ScheduledExecutorService mockScheduler = mock(ScheduledExecutorService.class);
|
ScheduledExecutorService mockScheduler = mock(ScheduledExecutorService.class);
|
||||||
final AtomicBoolean executed = new AtomicBoolean();
|
final AtomicBoolean executed = new AtomicBoolean();
|
||||||
base.runOnExpiration(
|
Future<?> unused = base.runOnExpiration(
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
||||||
|
|
@ -189,7 +189,8 @@ public final class FakeClock {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void execute(Runnable command) {
|
@Override public void execute(Runnable command) {
|
||||||
schedule(command, 0, TimeUnit.NANOSECONDS);
|
// Since it is being enqueued immediately, no point in tracing the future for cancellation.
|
||||||
|
Future<?> unused = schedule(command, 0, TimeUnit.NANOSECONDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ public class FakeClockTest {
|
||||||
public void testScheduledExecutorService_result() {
|
public void testScheduledExecutorService_result() {
|
||||||
FakeClock fakeClock = new FakeClock();
|
FakeClock fakeClock = new FakeClock();
|
||||||
final boolean[] result = new boolean[]{false};
|
final boolean[] result = new boolean[]{false};
|
||||||
fakeClock.getScheduledExecutorService().schedule(
|
ScheduledFuture<?> unused = fakeClock.getScheduledExecutorService().schedule(
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
@ -137,6 +137,7 @@ public class FakeClockTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@SuppressWarnings("FutureReturnValueIgnored")
|
||||||
public void testPendingAndDueTasks() {
|
public void testPendingAndDueTasks() {
|
||||||
FakeClock fakeClock = new FakeClock();
|
FakeClock fakeClock = new FakeClock();
|
||||||
ScheduledExecutorService scheduledExecutorService = fakeClock.getScheduledExecutorService();
|
ScheduledExecutorService scheduledExecutorService = fakeClock.getScheduledExecutorService();
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ import java.util.List;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import javax.annotation.concurrent.GuardedBy;
|
import javax.annotation.concurrent.GuardedBy;
|
||||||
|
|
@ -378,7 +379,8 @@ public class TestServiceImpl extends TestServiceGrpc.TestServiceImplBase {
|
||||||
Chunk nextChunk = chunks.peek();
|
Chunk nextChunk = chunks.peek();
|
||||||
if (nextChunk != null) {
|
if (nextChunk != null) {
|
||||||
scheduled = true;
|
scheduled = true;
|
||||||
executor.schedule(new LogExceptionRunnable(dispatchTask),
|
// TODO(ejona): cancel future if RPC is cancelled
|
||||||
|
Future<?> unused = executor.schedule(new LogExceptionRunnable(dispatchTask),
|
||||||
nextChunk.delayMicroseconds, TimeUnit.MICROSECONDS);
|
nextChunk.delayMicroseconds, TimeUnit.MICROSECONDS);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ public class ProxyTest {
|
||||||
throws UnknownHostException, IOException, InterruptedException, ExecutionException {
|
throws UnknownHostException, IOException, InterruptedException, ExecutionException {
|
||||||
server = new Server();
|
server = new Server();
|
||||||
int serverPort = server.init();
|
int serverPort = server.init();
|
||||||
executor.submit(server);
|
executor.execute(server);
|
||||||
|
|
||||||
int latency = (int) TimeUnit.MILLISECONDS.toNanos(50);
|
int latency = (int) TimeUnit.MILLISECONDS.toNanos(50);
|
||||||
proxy = new TrafficControlProxy(serverPort, 1024 * 1024, latency, TimeUnit.NANOSECONDS);
|
proxy = new TrafficControlProxy(serverPort, 1024 * 1024, latency, TimeUnit.NANOSECONDS);
|
||||||
|
|
@ -111,7 +111,7 @@ public class ProxyTest {
|
||||||
throws UnknownHostException, IOException, InterruptedException, ExecutionException {
|
throws UnknownHostException, IOException, InterruptedException, ExecutionException {
|
||||||
server = new Server();
|
server = new Server();
|
||||||
int serverPort = server.init();
|
int serverPort = server.init();
|
||||||
executor.submit(server);
|
executor.execute(server);
|
||||||
|
|
||||||
int latency = (int) TimeUnit.MILLISECONDS.toNanos(250);
|
int latency = (int) TimeUnit.MILLISECONDS.toNanos(250);
|
||||||
proxy = new TrafficControlProxy(serverPort, 1024 * 1024, latency, TimeUnit.NANOSECONDS);
|
proxy = new TrafficControlProxy(serverPort, 1024 * 1024, latency, TimeUnit.NANOSECONDS);
|
||||||
|
|
@ -143,7 +143,7 @@ public class ProxyTest {
|
||||||
server = new Server();
|
server = new Server();
|
||||||
int serverPort = server.init();
|
int serverPort = server.init();
|
||||||
server.setMode("stream");
|
server.setMode("stream");
|
||||||
executor.submit(server);
|
executor.execute(server);
|
||||||
assertEquals(server.mode(), "stream");
|
assertEquals(server.mode(), "stream");
|
||||||
|
|
||||||
int bandwidth = 64 * 1024;
|
int bandwidth = 64 * 1024;
|
||||||
|
|
@ -169,7 +169,7 @@ public class ProxyTest {
|
||||||
server = new Server();
|
server = new Server();
|
||||||
int serverPort = server.init();
|
int serverPort = server.init();
|
||||||
server.setMode("stream");
|
server.setMode("stream");
|
||||||
executor.submit(server);
|
executor.execute(server);
|
||||||
assertEquals(server.mode(), "stream");
|
assertEquals(server.mode(), "stream");
|
||||||
int bandwidth = 10 * 1024 * 1024;
|
int bandwidth = 10 * 1024 * 1024;
|
||||||
proxy = new TrafficControlProxy(serverPort, bandwidth, 200, TimeUnit.MILLISECONDS);
|
proxy = new TrafficControlProxy(serverPort, bandwidth, 200, TimeUnit.MILLISECONDS);
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ public final class TrafficControlProxy {
|
||||||
// client normally would.
|
// client normally would.
|
||||||
clientAcceptor = new ServerSocket();
|
clientAcceptor = new ServerSocket();
|
||||||
clientAcceptor.bind(new InetSocketAddress(localhost, 0));
|
clientAcceptor.bind(new InetSocketAddress(localhost, 0));
|
||||||
executor.submit(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
|
|
@ -143,10 +143,10 @@ public final class TrafficControlProxy {
|
||||||
MessageQueue clientPipe = new MessageQueue(clientIn, clientOut);
|
MessageQueue clientPipe = new MessageQueue(clientIn, clientOut);
|
||||||
MessageQueue serverPipe = new MessageQueue(serverIn, serverOut);
|
MessageQueue serverPipe = new MessageQueue(serverIn, serverOut);
|
||||||
|
|
||||||
executor.submit(new Thread(new Reader(clientPipe)));
|
executor.execute(new Thread(new Reader(clientPipe)));
|
||||||
executor.submit(new Thread(new Writer(clientPipe)));
|
executor.execute(new Thread(new Writer(clientPipe)));
|
||||||
executor.submit(new Thread(new Reader(serverPipe)));
|
executor.execute(new Thread(new Reader(serverPipe)));
|
||||||
executor.submit(new Thread(new Writer(serverPipe)));
|
executor.execute(new Thread(new Writer(serverPipe)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class Reader implements Runnable {
|
private final class Reader implements Runnable {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue