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

Reply via email to