Forbid other Future implementations with checkstyle

patch by Benedict Elliott Smith; reviewed by David Capwell for CASSANDRA-17055
This commit is contained in:
Benedict Elliott Smith 2021-11-04 14:33:04 -07:00 committed by David Capwell
parent 185c5232a6
commit 2fc7206128
30 changed files with 54 additions and 38 deletions

View File

@ -1,4 +1,5 @@
4.1
* Forbid other Future implementations with checkstyle (CASSANDRA-17055)
* commit log was switched from non-daemon to daemon threads, which causes the JVM to exit in some case as no non-daemon threads are active (CASSANDRA-17085)
* Add a Denylist to block reads and writes on specific partition keys (CASSANDRA-12106)
* v4+ protocol did not clean up client warnings, which caused leaking the state (CASSANDRA-17054)

View File

@ -29,6 +29,7 @@
</module>
<!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
<!-- this exists only because for some reason the comment filter does not seem to work for Semaphore -->
<module name="SuppressionFilter">
<property name="file" value="${checkstyle.suppressions}"
default="checkstyle-suppressions.xml" />
@ -36,7 +37,24 @@
</module>
<module name="TreeWalker">
<module name="SuppressWithNearbyCommentFilter">
<property name="commentFormat" value="checkstyle: permit this import"/>
<property name="checkFormat" value="IllegalImport"/>
<property name="influenceFormat" value="0"/>
</module>
<module name="SuppressWithNearbyCommentFilter">
<property name="commentFormat" value="checkstyle: permit this instantiation"/>
<property name="checkFormat" value="IllegalInstantiation"/>
<property name="influenceFormat" value="0"/>
</module>
<module name="SuppressWithNearbyCommentFilter">
<property name="commentFormat" value="checkstyle: permit system clock"/>
<property name="checkFormat" value="RegexpSinglelineJava"/>
<property name="influenceFormat" value="0"/>
</module>
<module name="RegexpSinglelineJava">
<!-- To prevent static imports and System.nanoTime or System.currentTimeMillis -->
<property name="format" value="(newSingleThreadExecutor|newFixedThreadPool|newCachedThreadPool|newSingleThreadScheduledExecutor|newWorkStealingPool|newScheduledThreadPool|defaultThreadFactory)\(|System\.(currentTimeMillis|nanoTime)"/>
@ -44,7 +62,7 @@
</module>
<module name="IllegalImport">
<property name="illegalPkgs" value=""/>
<property name="illegalClasses" value="java.io.File,java.io.FileInputStream,java.io.FileOutputStream,java.io.FileReader,java.io.FileWriter,java.io.RandomAccessFile,java.util.concurrent.Semaphore,java.util.concurrent.CountDownLatch,java.util.concurrent.Executors,java.util.concurrent.LinkedBlockingQueue,java.util.concurrent.SynchronousQueue,java.util.concurrent.ArrayBlockingQueue,com.google.common.util.concurrent.Futures,java.util.concurrent.CompletableFuture"/>
<property name="illegalClasses" value="java.io.File,java.io.FileInputStream,java.io.FileOutputStream,java.io.FileReader,java.io.FileWriter,java.io.RandomAccessFile,java.util.concurrent.Semaphore,java.util.concurrent.CountDownLatch,java.util.concurrent.Executors,java.util.concurrent.LinkedBlockingQueue,java.util.concurrent.SynchronousQueue,java.util.concurrent.ArrayBlockingQueue,com.google.common.util.concurrent.Futures,java.util.concurrent.CompletableFuture,io.netty.util.concurrent.Future,io.netty.util.concurrent.Promise,io.netty.util.concurrent.AbstractFuture,com.google.common.util.concurrent.ListenableFutureTask,com.google.common.util.concurrent.ListenableFuture,com.google.common.util.concurrent.AbstractFuture"/>
</module>
<module name="IllegalInstantiation">
<property name="classes" value="java.io.File,java.lang.Thread,java.util.concurrent.FutureTask,java.util.concurrent.Semaphore,java.util.concurrent.CountDownLatch,java.util.concurrent.ScheduledThreadPoolExecutor,java.util.concurrent.ThreadPoolExecutor,java.util.concurrent.ForkJoinPool))"/>

View File

@ -21,6 +21,5 @@
"https://checkstyle.org/dtds/suppressions_1_1.dtd">
<suppressions>
<suppress checks="RegexpSinglelineJava" files="Clock\.java|Semaphore\.java"/>
<suppress checks="IllegalImport|IllegalInstantiation" files="File\.java|[\\/]binlog[\\/]|Semaphore\.java|DataStructureFactory\.java|PathUtils\.java|UDFunction\.java|BlockingQueues\.java"/>
<suppress checks="RegexpSinglelineJava" files="Semaphore\.java"/>
</suppressions>

View File

@ -28,7 +28,7 @@ import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletableFuture; // checkstyle: permit this import
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;

View File

@ -21,7 +21,7 @@ package org.apache.cassandra.io.util;
import java.io.IOException;
import java.net.URI;
import java.nio.channels.FileChannel;
import java.nio.file.*;
import java.nio.file.*; // checkstyle: permit this import
import java.util.Objects;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
@ -544,7 +544,7 @@ public class File implements Comparable<File>
public java.io.File toJavaIOFile()
{
return path == null ? new java.io.File("") : path.toFile();
return path == null ? new java.io.File("") : path.toFile(); // checkstyle: permit this instantiation
}
/**

View File

@ -536,7 +536,7 @@ public final class PathUtils
DeleteOnExit()
{
Runtime.getRuntime().addShutdownHook(new Thread(this));
Runtime.getRuntime().addShutdownHook(new Thread(this)); // checkstyle: permit this instantiation
}
synchronized void add(Path path, boolean recursive)

View File

@ -22,7 +22,7 @@ import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; // checkstyle: permit this import
import io.netty.util.concurrent.GenericFutureListener;
import org.apache.cassandra.utils.concurrent.AsyncPromise;

View File

@ -21,7 +21,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; // checkstyle: permit this import
import io.netty.util.concurrent.GenericFutureListener;
/**

View File

@ -17,7 +17,7 @@
*/
package org.apache.cassandra.net;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
/**
* An abstraction for yielding a result performed by an asynchronous task,

View File

@ -31,7 +31,7 @@ import io.netty.channel.ChannelPipeline;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.DefaultEventExecutor;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
import io.netty.util.concurrent.GlobalEventExecutor;
import io.netty.util.concurrent.PromiseNotifier;
import io.netty.util.concurrent.SucceededFuture;

View File

@ -30,7 +30,7 @@ import org.apache.cassandra.utils.concurrent.FutureCombiner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
import org.apache.cassandra.concurrent.ScheduledExecutors;
import org.apache.cassandra.concurrent.Stage;
import org.apache.cassandra.config.DatabaseDescriptor;

View File

@ -45,8 +45,8 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.EventLoop;
import io.netty.channel.unix.Errors;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Promise;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
import io.netty.util.concurrent.Promise; //checkstyle: permit this import
import io.netty.util.concurrent.PromiseNotifier;
import io.netty.util.concurrent.SucceededFuture;
import org.apache.cassandra.config.DatabaseDescriptor;

View File

@ -24,8 +24,8 @@ import java.nio.channels.ClosedChannelException;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Promise;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
import io.netty.util.concurrent.Promise; //checkstyle: permit this import
import org.apache.cassandra.utils.concurrent.AsyncPromise;
import org.apache.cassandra.utils.concurrent.ImmediateFuture;
import org.slf4j.Logger;

View File

@ -33,7 +33,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.carrotsearch.hppc.ObjectObjectHashMap;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.metrics.InternodeOutboundMetrics;
import org.apache.cassandra.utils.NoSpamLogger;

View File

@ -30,7 +30,7 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.*;
import io.netty.channel.Channel;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
import org.apache.cassandra.concurrent.ScheduledExecutors;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.locator.RangesAtEndpoint;

View File

@ -22,7 +22,7 @@ import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.function.IntFunction;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; //checkstyle: permit this import
import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
import org.apache.cassandra.utils.Shared;

View File

@ -26,7 +26,7 @@ import com.google.common.annotations.VisibleForTesting;
import io.netty.channel.Channel;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoop;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; // checkstyle: permit this import
import org.apache.cassandra.net.ConnectionCategory;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.net.OutboundConnectionInitiator.Result;

View File

@ -40,11 +40,10 @@ import org.slf4j.LoggerFactory;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; // checkstyle: permit this import
import org.apache.cassandra.concurrent.ExecutorPlus;
import org.apache.cassandra.streaming.StreamSession;
import org.apache.cassandra.streaming.messages.IncomingStreamMessage;
import org.apache.cassandra.streaming.messages.KeepAliveMessage;
import org.apache.cassandra.streaming.messages.OutgoingStreamMessage;
import org.apache.cassandra.streaming.messages.StreamMessage;
import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
@ -57,7 +56,6 @@ import static java.lang.Thread.currentThread;
import static java.util.concurrent.TimeUnit.*;
import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
import static org.apache.cassandra.config.Config.PROPERTY_PREFIX;
import static org.apache.cassandra.config.DatabaseDescriptor.getStreamingKeepAlivePeriod;
import static org.apache.cassandra.streaming.StreamSession.createLogTag;
import static org.apache.cassandra.streaming.messages.StreamMessage.serialize;
import static org.apache.cassandra.streaming.messages.StreamMessage.serializedSize;

View File

@ -38,7 +38,7 @@ import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.handler.ssl.SslContext;
import io.netty.util.concurrent.Promise;
import io.netty.util.concurrent.Promise; // checkstyle: permit this import
import io.netty.util.concurrent.PromiseCombiner;
import io.netty.util.internal.logging.InternalLoggerFactory;
import io.netty.util.internal.logging.Slf4JLoggerFactory;

View File

@ -91,7 +91,7 @@ public interface Clock
*/
public long nanoTime()
{
return System.nanoTime();
return System.nanoTime(); // checkstyle: permit system clock
}
/**
@ -99,7 +99,7 @@ public interface Clock
*/
public long currentTimeMillis()
{
return System.currentTimeMillis();
return System.currentTimeMillis(); // checkstyle: permit system clock
}
}

View File

@ -18,7 +18,7 @@
package org.apache.cassandra.utils.binlog;
import java.io.File;
import java.io.File; // checkstyle: permit this import
import net.openhft.chronicle.queue.impl.StoreFileListener;

View File

@ -18,7 +18,7 @@
package org.apache.cassandra.utils.binlog;
import java.io.File;
import java.io.File; // checkstyle: permit this import
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

View File

@ -18,7 +18,7 @@
package org.apache.cassandra.utils.binlog;
import java.io.File;
import java.io.File; // checkstyle: permit this import
import java.io.IOException;
import java.nio.file.Path;
import java.util.concurrent.DelayQueue;

View File

@ -32,7 +32,7 @@ import javax.annotation.Nullable;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.AsyncFunction;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
import io.netty.util.concurrent.GenericFutureListener;
import io.netty.util.internal.ThrowableUtil;

View File

@ -24,7 +24,7 @@ import java.util.function.Function;
import javax.annotation.Nullable;
import com.google.common.util.concurrent.AsyncFunction;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
import io.netty.util.concurrent.GenericFutureListener;

View File

@ -23,7 +23,7 @@ import java.util.function.Consumer;
import com.google.common.util.concurrent.FutureCallback;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Future; // checkstyle: permit this import
import io.netty.util.concurrent.GenericFutureListener;
/**

View File

@ -22,8 +22,8 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.Queue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.LinkedBlockingQueue; // checkstyle: permit this import
import java.util.concurrent.SynchronousQueue; // checkstyle: permit this import
import java.util.concurrent.TimeUnit;
import org.apache.cassandra.utils.Intercept;

View File

@ -25,7 +25,7 @@ import java.util.function.Function;
import com.google.common.util.concurrent.AsyncFunction;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
import io.netty.util.concurrent.GenericFutureListener;

View File

@ -252,7 +252,7 @@ public interface Semaphore
public FairJDK(int permits)
{
wrapped = new java.util.concurrent.Semaphore(permits, true);
wrapped = new java.util.concurrent.Semaphore(permits, true); // checkstyle: permit this instantiation
}
/**

View File

@ -24,7 +24,7 @@ import java.util.function.Function;
import javax.annotation.Nullable;
import com.google.common.util.concurrent.AsyncFunction;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
import io.netty.util.concurrent.GenericFutureListener;