This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new 6abdc848e99 SOLR-16629 Replace SolrSingleThreaded and SolrThreadSafe
annotations with JCIP (#1313)
6abdc848e99 is described below
commit 6abdc848e99e28e68c9a33aff8844dea6a940c84
Author: David Smiley <[email protected]>
AuthorDate: Sun Feb 5 22:18:53 2023 -0500
SOLR-16629 Replace SolrSingleThreaded and SolrThreadSafe annotations with
JCIP (#1313)
and,
* Annotate IndexSchemaFactory and CharArr
* Exclude JCIP jar from the distribution
---
gradle/hacks/global-exclude-dependencies.gradle | 1 +
solr/CHANGES.txt | 2 ++
solr/core/build.gradle | 4 +++
.../src/java/org/apache/solr/api/V2HttpCall.java | 4 +--
.../apache/solr/filestore/DistribPackageStore.java | 4 +--
.../solr/handler/component/HttpShardHandler.java | 4 +--
.../org/apache/solr/schema/IndexSchemaFactory.java | 2 ++
.../java/org/apache/solr/servlet/HttpSolrCall.java | 4 +--
.../org/apache/solr/servlet/RateLimitManager.java | 4 +--
.../apache/solr/servlet/RequestRateLimiter.java | 4 +--
.../update/processor/UpdateRequestProcessor.java | 4 +--
solr/licenses/jcip-annotations-1.0.jar.sha1 | 1 -
solr/solrj/build.gradle | 2 ++
.../solr/common/annotation/SolrThreadSafe.java | 34 ----------------------
.../solr/common/annotation/SolrThreadUnsafe.java | 33 ---------------------
solr/solrj/src/java/org/noggit/CharArr.java | 4 +++
versions.lock | 3 +-
versions.props | 1 +
18 files changed, 31 insertions(+), 84 deletions(-)
diff --git a/gradle/hacks/global-exclude-dependencies.gradle
b/gradle/hacks/global-exclude-dependencies.gradle
index dbe11a68831..09981d46109 100644
--- a/gradle/hacks/global-exclude-dependencies.gradle
+++ b/gradle/hacks/global-exclude-dependencies.gradle
@@ -48,6 +48,7 @@ allprojects { prj ->
exclude group: 'org.slf4j', module: 'slf4j-log4j12' // don't include log4j
1.x
exclude group: 'org.apache.yetus', module: 'audience-annotations' // Don't
need annotations
exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
// Don't need annotations
+ exclude group: 'net.jcip', module: 'jcip-annotations' // use
com.github.stephenc.jcip instead
// be conservative on what's added here. Affects all Java project
compilation and runtime.
}
}
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d35e0c32fee..19292e3fc48 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -224,6 +224,8 @@ Other Changes
* SOLR-16627: Upgrade google-cloud-bom to 0.184.0, re2j to 1.6, and grpc to
1.51.0 (Kevin Risden)
+* SOLR-16629: Replace Solr thread safety annotations with JCIP. (David Smiley)
+
* SOLR-16632: Add core name to periodic delete related log messages (Bence
Szabo via Andras Salamon)
================== 9.1.1 ==================
diff --git a/solr/core/build.gradle b/solr/core/build.gradle
index 1031ecf1740..fba7122dd34 100644
--- a/solr/core/build.gradle
+++ b/solr/core/build.gradle
@@ -171,6 +171,10 @@ dependencies {
compileOnly 'biz.aQute.bnd:biz.aQute.bnd.annotation'
compileOnly 'org.osgi:osgi.annotation'
+ compileOnly 'com.github.stephenc.jcip:jcip-annotations'
+
+ // -- Test Dependencies
+
testRuntimeOnly 'org.slf4j:jcl-over-slf4j'
testRuntimeOnly "org.apache.lucene:lucene-analysis-icu"
diff --git a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
index b2512efcb07..1493a032036 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -40,9 +40,9 @@ import java.util.Set;
import java.util.function.Supplier;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import net.jcip.annotations.ThreadSafe;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.annotation.SolrThreadSafe;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.params.CommonParams;
@@ -72,7 +72,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// class that handle the '/v2' path
-@SolrThreadSafe
+@ThreadSafe
public class V2HttpCall extends HttpSolrCall {
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private Api api;
diff --git
a/solr/core/src/java/org/apache/solr/filestore/DistribPackageStore.java
b/solr/core/src/java/org/apache/solr/filestore/DistribPackageStore.java
index 5b872857bfc..4995e38a09f 100644
--- a/solr/core/src/java/org/apache/solr/filestore/DistribPackageStore.java
+++ b/solr/core/src/java/org/apache/solr/filestore/DistribPackageStore.java
@@ -43,12 +43,12 @@ import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Predicate;
+import net.jcip.annotations.NotThreadSafe;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.lucene.util.IOUtils;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.annotation.SolrThreadUnsafe;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.util.Utils;
@@ -61,7 +61,7 @@ import org.apache.zookeeper.server.ByteBufferInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@SolrThreadUnsafe
+@NotThreadSafe
public class DistribPackageStore implements PackageStore {
static final long MAX_PKG_SIZE =
Long.parseLong(System.getProperty("max.file.store.size",
String.valueOf(100 * 1024 * 1024)));
diff --git
a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
index 5c32d29e85a..7135b599a8e 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
@@ -26,6 +26,7 @@ import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import net.jcip.annotations.NotThreadSafe;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.client.solrj.impl.LBHttp2SolrClient;
@@ -38,7 +39,6 @@ import org.apache.solr.client.solrj.util.Cancellable;
import org.apache.solr.cloud.CloudDescriptor;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.annotation.SolrThreadUnsafe;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.ZkCoreNodeProps;
import org.apache.solr.common.params.CommonParams;
@@ -52,7 +52,7 @@ import org.apache.solr.request.SolrRequestInfo;
import org.apache.solr.security.AllowListUrlChecker;
import org.apache.solr.util.tracing.SolrRequestCarrier;
-@SolrThreadUnsafe
+@NotThreadSafe
public class HttpShardHandler extends ShardHandler {
/**
* If the request context map has an entry with this key and Boolean.TRUE as
value, {@link
diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java
b/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java
index f3690e9aee1..da5f6966fbf 100644
--- a/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java
+++ b/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java
@@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Supplier;
import javax.xml.parsers.ParserConfigurationException;
+import net.jcip.annotations.NotThreadSafe;
import org.apache.solr.cloud.ZkConfigSetService;
import org.apache.solr.cloud.ZkSolrResourceLoader;
import org.apache.solr.common.ConfigNode;
@@ -48,6 +49,7 @@ import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/** Base class for factories for IndexSchema implementations */
+@NotThreadSafe
public abstract class IndexSchemaFactory implements NamedListInitializedPlugin
{
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index c9d62bcfc3b..af7f2d2b713 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -56,6 +56,7 @@ import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import net.jcip.annotations.ThreadSafe;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.apache.http.HeaderIterator;
@@ -77,7 +78,6 @@ import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpClientUtil;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
-import org.apache.solr.common.annotation.SolrThreadSafe;
import org.apache.solr.common.cloud.Aliases;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.DocCollection;
@@ -134,7 +134,7 @@ import org.slf4j.LoggerFactory;
import org.slf4j.MarkerFactory;
/** This class represents a call made to Solr */
-@SolrThreadSafe
+@ThreadSafe
public class HttpSolrCall {
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/core/src/java/org/apache/solr/servlet/RateLimitManager.java
b/solr/core/src/java/org/apache/solr/servlet/RateLimitManager.java
index a82ebfb82ad..8531ec3318d 100644
--- a/solr/core/src/java/org/apache/solr/servlet/RateLimitManager.java
+++ b/solr/core/src/java/org/apache/solr/servlet/RateLimitManager.java
@@ -27,8 +27,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpServletRequest;
+import net.jcip.annotations.ThreadSafe;
import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.common.annotation.SolrThreadSafe;
import org.apache.solr.common.cloud.ClusterPropertiesListener;
import org.apache.solr.common.cloud.SolrZkClient;
import org.slf4j.Logger;
@@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory;
* RequestRateLimiter implementation. RateLimitManager is responsible for the
orchestration but not
* the specifics of how the rate limiting is being done for a specific request
type.
*/
-@SolrThreadSafe
+@ThreadSafe
public class RateLimitManager implements ClusterPropertiesListener {
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/core/src/java/org/apache/solr/servlet/RequestRateLimiter.java
b/solr/core/src/java/org/apache/solr/servlet/RequestRateLimiter.java
index 5ff4b158406..cd33d3a717f 100644
--- a/solr/core/src/java/org/apache/solr/servlet/RequestRateLimiter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/RequestRateLimiter.java
@@ -19,7 +19,7 @@ package org.apache.solr.servlet;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
-import org.apache.solr.common.annotation.SolrThreadSafe;
+import net.jcip.annotations.ThreadSafe;
import org.apache.solr.core.RateLimiterConfig;
/**
@@ -28,7 +28,7 @@ import org.apache.solr.core.RateLimiterConfig;
* <p>The control flow is as follows: Handle request -- Check if slot is
available -- If available,
* acquire slot and proceed -- else reject the same.
*/
-@SolrThreadSafe
+@ThreadSafe
public class RequestRateLimiter {
// Slots that are guaranteed for this request rate limiter.
private final Semaphore guaranteedSlotsPool;
diff --git
a/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java
b/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java
index 91f2d527206..d35303b8cba 100644
---
a/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java
+++
b/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessor.java
@@ -19,8 +19,8 @@ package org.apache.solr.update.processor;
import java.io.Closeable;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
+import net.jcip.annotations.NotThreadSafe;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.annotation.SolrThreadUnsafe;
import org.apache.solr.update.AddUpdateCommand;
import org.apache.solr.update.CommitUpdateCommand;
import org.apache.solr.update.DeleteUpdateCommand;
@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory;
*
* @since solr 1.3
*/
-@SolrThreadUnsafe
+@NotThreadSafe
public abstract class UpdateRequestProcessor implements Closeable {
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/licenses/jcip-annotations-1.0.jar.sha1
b/solr/licenses/jcip-annotations-1.0.jar.sha1
deleted file mode 100644
index 3017e99bb39..00000000000
--- a/solr/licenses/jcip-annotations-1.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-afba4942caaeaf46aab0b976afd57cc7c181467e
diff --git a/solr/solrj/build.gradle b/solr/solrj/build.gradle
index f3df41095ec..38de67ba9f6 100644
--- a/solr/solrj/build.gradle
+++ b/solr/solrj/build.gradle
@@ -40,6 +40,8 @@ dependencies {
implementation 'org.apache.httpcomponents:httpclient'
implementation 'org.apache.httpcomponents:httpcore'
+ compileOnly 'com.github.stephenc.jcip:jcip-annotations'
+
// In 9.x, ending in 10, we depend on SolrJ modules. Users can opt-out.
runtimeOnly project(':solr:solrj-streaming')
runtimeOnly project(':solr:solrj-zookeeper')
diff --git
a/solr/solrj/src/java/org/apache/solr/common/annotation/SolrThreadSafe.java
b/solr/solrj/src/java/org/apache/solr/common/annotation/SolrThreadSafe.java
deleted file mode 100644
index e998c3a48c4..00000000000
--- a/solr/solrj/src/java/org/apache/solr/common/annotation/SolrThreadSafe.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.common.annotation;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is applied to a class that is thread safe. This means that
the objects of this
- * class will never be in an inconsistent state, irrespective of interleaving
accesses to the
- * object.
- */
-@Documented
-@Retention(SOURCE)
-@Target(TYPE)
-public @interface SolrThreadSafe {}
diff --git
a/solr/solrj/src/java/org/apache/solr/common/annotation/SolrThreadUnsafe.java
b/solr/solrj/src/java/org/apache/solr/common/annotation/SolrThreadUnsafe.java
deleted file mode 100644
index 03c847b9f24..00000000000
---
a/solr/solrj/src/java/org/apache/solr/common/annotation/SolrThreadUnsafe.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.common.annotation;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for classes in Solr that are not thread safe. This provides a
clear indication of the
- * thread safety of the class.
- */
-@Documented
-@Retention(SOURCE)
-@Target(TYPE)
-public @interface SolrThreadUnsafe {}
diff --git a/solr/solrj/src/java/org/noggit/CharArr.java
b/solr/solrj/src/java/org/noggit/CharArr.java
index 6e8ac9f2d25..9b9e2cc0cb7 100644
--- a/solr/solrj/src/java/org/noggit/CharArr.java
+++ b/solr/solrj/src/java/org/noggit/CharArr.java
@@ -20,7 +20,10 @@ package org.noggit;
import java.io.IOException;
import java.io.Reader;
import java.nio.CharBuffer;
+import net.jcip.annotations.Immutable;
+import net.jcip.annotations.NotThreadSafe;
+@NotThreadSafe
public class CharArr implements CharSequence, Appendable {
protected char[] buf;
protected int start;
@@ -217,6 +220,7 @@ public class CharArr implements CharSequence, Appendable {
return this;
}
+ @Immutable
static class NullCharArr extends CharArr {
public NullCharArr() {
super(new char[1], 0, 0);
diff --git a/versions.lock b/versions.lock
index 1d1fa299f54..b93d2b1029f 100644
--- a/versions.lock
+++ b/versions.lock
@@ -18,6 +18,7 @@ com.github.jai-imageio:jai-imageio-core:1.4.0 (1 constraints:
5c0ced01)
com.github.junrar:junrar:7.5.2 (1 constraints: 650c1002)
com.github.openjson:openjson:1.0.12 (1 constraints: 8b0c6d0e)
com.github.spotbugs:spotbugs-annotations:4.7.2 (1 constraints: 0f051636)
+com.github.stephenc.jcip:jcip-annotations:1.0-1 (3 constraints: c71d2c87)
com.github.virtuald:curvesapi:1.07 (1 constraints: 9e0ac7c0)
com.google.android:annotations:4.1.1.4 (2 constraints: b918820a)
com.google.api:api-common:2.2.2 (5 constraints: 8a43c4a3)
@@ -161,7 +162,6 @@ joda-time:joda-time:2.9.9 (4 constraints: eb1fe06a)
junit:junit:4.13.2 (9 constraints: d4aa559e)
net.arnx:jsonic:1.2.7 (2 constraints: db10d4d1)
net.java.dev.jna:jna:5.11.0 (1 constraints: 8e0c8a0e)
-net.jcip:jcip-annotations:1.0 (6 constraints: 6130731b)
net.sf.ehcache:ehcache-core:2.6.2 (1 constraints: 2706f94d)
net.sf.jopt-simple:jopt-simple:4.6 (1 constraints: 610a91b7)
net.sourceforge.argparse4j:argparse4j:0.8.1 (1 constraints: 0b050436)
@@ -395,7 +395,6 @@ com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.14.1
(2 constraints: 0a24
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.1 (3 constraints:
7b3d5a0f)
com.fasterxml.jackson.module:jackson-module-kotlin:2.14.1 (2 constraints:
a41dd75f)
com.fasterxml.jackson.module:jackson-module-parameter-names:2.14.1 (2
constraints: 0a24c381)
-com.github.stephenc.jcip:jcip-annotations:1.0-1 (2 constraints: c5188bde)
com.google.cloud:google-cloud-nio:0.126.0 (1 constraints: 960e586c)
com.nimbusds:content-type:2.2 (1 constraints: d80b68eb)
com.nimbusds:lang-tag:1.5 (1 constraints: da0b68eb)
diff --git a/versions.props b/versions.props
index c581d440cf0..164a442f832 100644
--- a/versions.props
+++ b/versions.props
@@ -7,6 +7,7 @@ com.fasterxml.jackson:jackson-bom=2.14.1
com.fasterxml.woodstox:woodstox-core=6.4.0
com.github.ben-manes.caffeine:caffeine=3.1.2
com.github.spotbugs:*=4.7.2
+com.github.stephenc.jcip:jcip-annotations=1.0-1
com.google.cloud:google-cloud-bom=0.184.0
com.google.errorprone:*=2.16
com.google.guava:guava=31.1-jre