[ 
https://issues.apache.org/jira/browse/SOLR-18600?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nick Shanin updated SOLR-18600:
-------------------------------
    Description: 
h2. Summary

SolrJ 10.1.0 removed the public classes 
{{org.apache.solr.client.solrj.impl.HttpSolrClientBase}} and 
{{org.apache.solr.client.solrj.impl.HttpSolrClientBuilderBase}} (SOLR-17968). 
Code that was compiled against SolrJ 10.0.0 and uses only the ordinary 
{{HttpJdkSolrClient.Builder}} methods fails at runtime on 10.1.0 with a 
{{NoSuchMethodError}} on the first builder call, before any HTTP request is 
made. Recompiling the same source against 10.1.0 fixes it, so source 
compatibility holds; binary compatibility does not. The 10.1 upgrade notes 
mention the new base class but do not mention the removal or the need to 
recompile.

h2. Minimal reproducer

{code}
import java.util.concurrent.TimeUnit;
import org.apache.solr.client.solrj.impl.HttpJdkSolrClient;

public class Consumer {
  public static void main(String[] args) throws Exception {
    try (HttpJdkSolrClient client =
        new HttpJdkSolrClient.Builder("http://127.0.0.1:8983/solr";)
            .withConnectionTimeout(10, TimeUnit.SECONDS)
            .withRequestTimeout(60, TimeUnit.SECONDS)
            .build()) {
      System.out.println("BUILT " + client.getClass().getName());
    }
    System.out.println("CONSUMER OK");
  }
}
{code}

The source names no base type and uses no internal API. Compiled against 
10.0.0, {{javap}} shows the fluent calls carry descriptors naming the removed 
class, for example 
{{HttpJdkSolrClient$Builder.withConnectionTimeout:(JLjava/util/concurrent/TimeUnit;)Lorg/apache/solr/client/solrj/impl/HttpSolrClientBuilderBase;}},
 because the methods are declared on the removed base class and javac emits its 
erased descriptor.

h2. Tested coordinates

* {{org.apache.solr:solr-solrj:10.0.0}} (jar sha256 
{{59178b49e43ffed3d4845b73c0b3302bd77e1b0e3c10c5c4550ba8499bdb3fac}}): contains 
both classes.
* {{org.apache.solr:solr-solrj:10.1.0}} (jar sha256 
{{115fcfbe1ed8ce04f7da8e200d20ce9105a567b40d6ec33727fcbd0667118bb4}}): contains 
neither class; first published release with the removal.
* Consumer class compiled with {{javac --release 17}} against 10.0.0, sha256 
{{a3bb85e5a58d39e226627df1340844d758471e48b7514ac137364cdea485801f}}. JDK used 
for the runs: Temurin 21.0.12.1. Runtime classpath: solrj, solr-api, slf4j-api. 
No server is needed; the failure precedes any HTTP operation, and the Jackson 
change in SOLR-18325 is not required to reproduce it.

h2. Expected versus observed

* Expected: bytes compiled against 10.0.0 run against 10.1.0, or the removal is 
called out in the 10.1 upgrade notes as requiring recompilation.
* Observed on 10.0.0: {{BUILT 
org.apache.solr.client.solrj.impl.HttpJdkSolrClient}} and {{CONSUMER OK}}, exit 
0.
* Observed on 10.1.0, identical bytes: exit 1 with

{noformat}
java.lang.NoSuchMethodError: 
'org.apache.solr.client.solrj.impl.HttpSolrClientBuilderBase 
org.apache.solr.client.solrj.impl.HttpJdkSolrClient$Builder.withConnectionTimeout(long,
 java.util.concurrent.TimeUnit)'
        at Consumer.main(Consumer.java:8)
{noformat}

* The identical source recompiled against 10.1.0 compiles and runs correctly, 
which isolates the break to binary compatibility. A control consumer that uses 
only {{Builder.withHttpClient(...)}} (whose descriptors name only concrete 
types) runs unchanged on both versions.

h2. Context and open question

SOLR-17968 and [PR #3829|https://github.com/apache/solr/pull/3829] renamed the 
classes deliberately (main {{8d3f995c6a}}, branch_10x {{e5340a954b}}). Neither 
the ticket, the PR discussion, nor the upgrade notes mention the effect on 
already-compiled consumers. In 10.0.0, {{HttpSolrClientBase}} is marked 
{{@lucene.internal}} in its Javadoc; {{HttpSolrClientBuilderBase}}, the class 
ordinary bytecode actually names, is not. Whether that makes the break 
acceptable in a minor release is the policy question this ticket poses; the 
runtime behavior above is the observed defect either way.

Possible directions, kept separate from the defect report: restore the two 
classes as compatibility types so the released descriptors resolve, or document 
the removal and the recompile requirement in the 10.1 upgrade notes if the 
break is accepted.

h2. Prepared fix

A fix is prepared on branch 
[solr-18600-http-abi-restore-submit|https://github.com/nick-boss-tech/solr/tree/solr-18600-http-abi-restore-submit]
 at commit 
[c40665af8d6|https://github.com/nick-boss-tech/solr/commit/c40665af8d6bd23c85fef565f93de5004a7b2ca4],
 based on branch_10x.

It restores {{HttpSolrClientBase}} and {{HttpSolrClientBuilderBase}} as 
top-level classes with the released fields, constructor and members; 
{{HttpSolrClient}} and its nested {{BuilderBase}} extend them; the released 
declared types are restored on the neighboring classes (CloudSolrClient, 
CloudHttp2SolrClient, HttpClusterStateProvider, LBSolrClient.Builder, 
LBAsyncSolrClient, ConcurrentUpdateBaseSolrClient.Builder); and the 
{{SolrRequest.processWithBaseUrl(HttpSolrClientBase, ...)}} overload is 
re-added.

Verified at that head: the new HttpSolrClientBinaryCompatTest and 
HttpJettySolrClientBinaryCompatTest pass, as do HttpJdkSolrClientTest, 
HttpJettySolrClientTest and the Cloud, LB and ConcurrentUpdate suites, and 
:solr:solrj:check and :solr:solrj-jetty:check pass. The consumer bytes compiled 
against SolrJ 10.0.0 that fail on 10.1.0 with the NoSuchMethodError above run 
correctly against the patched build. A PR against branch_10x can be opened on 
request.

🤖 _AI text above_ 🤖 _(reviewed by Nick Shanin)_


  was:
h2. Summary

SolrJ 10.1.0 removed the public classes 
{{org.apache.solr.client.solrj.impl.HttpSolrClientBase}} and 
{{org.apache.solr.client.solrj.impl.HttpSolrClientBuilderBase}} (SOLR-17968). 
Code that was compiled against SolrJ 10.0.0 and uses only the ordinary 
{{HttpJdkSolrClient.Builder}} methods fails at runtime on 10.1.0 with a 
{{NoSuchMethodError}} on the first builder call, before any HTTP request is 
made. Recompiling the same source against 10.1.0 fixes it, so source 
compatibility holds; binary compatibility does not. The 10.1 upgrade notes 
mention the new base class but do not mention the removal or the need to 
recompile.

h2. Minimal reproducer

{code}
import java.util.concurrent.TimeUnit;
import org.apache.solr.client.solrj.impl.HttpJdkSolrClient;

public class Consumer {
  public static void main(String[] args) throws Exception {
    try (HttpJdkSolrClient client =
        new HttpJdkSolrClient.Builder("http://127.0.0.1:8983/solr";)
            .withConnectionTimeout(10, TimeUnit.SECONDS)
            .withRequestTimeout(60, TimeUnit.SECONDS)
            .build()) {
      System.out.println("BUILT " + client.getClass().getName());
    }
    System.out.println("CONSUMER OK");
  }
}
{code}

The source names no base type and uses no internal API. Compiled against 
10.0.0, {{javap}} shows the fluent calls carry descriptors naming the removed 
class, for example 
{{HttpJdkSolrClient$Builder.withConnectionTimeout:(JLjava/util/concurrent/TimeUnit;)Lorg/apache/solr/client/solrj/impl/HttpSolrClientBuilderBase;}},
 because the methods are declared on the removed base class and javac emits its 
erased descriptor.

h2. Tested coordinates

* {{org.apache.solr:solr-solrj:10.0.0}} (jar sha256 
{{59178b49e43ffed3d4845b73c0b3302bd77e1b0e3c10c5c4550ba8499bdb3fac}}): contains 
both classes.
* {{org.apache.solr:solr-solrj:10.1.0}} (jar sha256 
{{115fcfbe1ed8ce04f7da8e200d20ce9105a567b40d6ec33727fcbd0667118bb4}}): contains 
neither class; first published release with the removal.
* Consumer class compiled with {{javac --release 17}} against 10.0.0, sha256 
{{a3bb85e5a58d39e226627df1340844d758471e48b7514ac137364cdea485801f}}. JDK used 
for the runs: Temurin 21.0.12.1. Runtime classpath: solrj, solr-api, slf4j-api. 
No server is needed; the failure precedes any HTTP operation, and the Jackson 
change in SOLR-18325 is not required to reproduce it.

h2. Expected versus observed

* Expected: bytes compiled against 10.0.0 run against 10.1.0, or the removal is 
called out in the 10.1 upgrade notes as requiring recompilation.
* Observed on 10.0.0: {{BUILT 
org.apache.solr.client.solrj.impl.HttpJdkSolrClient}} and {{CONSUMER OK}}, exit 
0.
* Observed on 10.1.0, identical bytes: exit 1 with

{noformat}
java.lang.NoSuchMethodError: 
'org.apache.solr.client.solrj.impl.HttpSolrClientBuilderBase 
org.apache.solr.client.solrj.impl.HttpJdkSolrClient$Builder.withConnectionTimeout(long,
 java.util.concurrent.TimeUnit)'
        at Consumer.main(Consumer.java:8)
{noformat}

* The identical source recompiled against 10.1.0 compiles and runs correctly, 
which isolates the break to binary compatibility. A control consumer that uses 
only {{Builder.withHttpClient(...)}} (whose descriptors name only concrete 
types) runs unchanged on both versions.

h2. Context and open question

SOLR-17968 and [PR #3829|https://github.com/apache/solr/pull/3829] renamed the 
classes deliberately (main {{8d3f995c6a}}, branch_10x {{e5340a954b}}). Neither 
the ticket, the PR discussion, nor the upgrade notes mention the effect on 
already-compiled consumers. In 10.0.0, {{HttpSolrClientBase}} is marked 
{{@lucene.internal}} in its Javadoc; {{HttpSolrClientBuilderBase}}, the class 
ordinary bytecode actually names, is not. Whether that makes the break 
acceptable in a minor release is the policy question this ticket poses; the 
runtime behavior above is the observed defect either way.

Possible directions, kept separate from the defect report: restore the two 
classes as compatibility types so the released descriptors resolve, or document 
the removal and the recompile requirement in the 10.1 upgrade notes if the 
break is accepted.

🤖 _AI text above_ 🤖 _(reviewed by Nick Shanin)_



> SolrJ 10.1.0 binary incompatibility: HttpSolrClientBuilderBase removal breaks 
> pre-compiled builder consumers with NoSuchMethodError
> -----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-18600
>                 URL: https://issues.apache.org/jira/browse/SOLR-18600
>             Project: Solr
>          Issue Type: Bug
>          Components: SolrJ
>    Affects Versions: 10.1
>            Reporter: Nick Shanin
>            Priority: Major
>              Labels: binary-compatibility, solrj
>
> h2. Summary
> SolrJ 10.1.0 removed the public classes 
> {{org.apache.solr.client.solrj.impl.HttpSolrClientBase}} and 
> {{org.apache.solr.client.solrj.impl.HttpSolrClientBuilderBase}} (SOLR-17968). 
> Code that was compiled against SolrJ 10.0.0 and uses only the ordinary 
> {{HttpJdkSolrClient.Builder}} methods fails at runtime on 10.1.0 with a 
> {{NoSuchMethodError}} on the first builder call, before any HTTP request is 
> made. Recompiling the same source against 10.1.0 fixes it, so source 
> compatibility holds; binary compatibility does not. The 10.1 upgrade notes 
> mention the new base class but do not mention the removal or the need to 
> recompile.
> h2. Minimal reproducer
> {code}
> import java.util.concurrent.TimeUnit;
> import org.apache.solr.client.solrj.impl.HttpJdkSolrClient;
> public class Consumer {
>   public static void main(String[] args) throws Exception {
>     try (HttpJdkSolrClient client =
>         new HttpJdkSolrClient.Builder("http://127.0.0.1:8983/solr";)
>             .withConnectionTimeout(10, TimeUnit.SECONDS)
>             .withRequestTimeout(60, TimeUnit.SECONDS)
>             .build()) {
>       System.out.println("BUILT " + client.getClass().getName());
>     }
>     System.out.println("CONSUMER OK");
>   }
> }
> {code}
> The source names no base type and uses no internal API. Compiled against 
> 10.0.0, {{javap}} shows the fluent calls carry descriptors naming the removed 
> class, for example 
> {{HttpJdkSolrClient$Builder.withConnectionTimeout:(JLjava/util/concurrent/TimeUnit;)Lorg/apache/solr/client/solrj/impl/HttpSolrClientBuilderBase;}},
>  because the methods are declared on the removed base class and javac emits 
> its erased descriptor.
> h2. Tested coordinates
> * {{org.apache.solr:solr-solrj:10.0.0}} (jar sha256 
> {{59178b49e43ffed3d4845b73c0b3302bd77e1b0e3c10c5c4550ba8499bdb3fac}}): 
> contains both classes.
> * {{org.apache.solr:solr-solrj:10.1.0}} (jar sha256 
> {{115fcfbe1ed8ce04f7da8e200d20ce9105a567b40d6ec33727fcbd0667118bb4}}): 
> contains neither class; first published release with the removal.
> * Consumer class compiled with {{javac --release 17}} against 10.0.0, sha256 
> {{a3bb85e5a58d39e226627df1340844d758471e48b7514ac137364cdea485801f}}. JDK 
> used for the runs: Temurin 21.0.12.1. Runtime classpath: solrj, solr-api, 
> slf4j-api. No server is needed; the failure precedes any HTTP operation, and 
> the Jackson change in SOLR-18325 is not required to reproduce it.
> h2. Expected versus observed
> * Expected: bytes compiled against 10.0.0 run against 10.1.0, or the removal 
> is called out in the 10.1 upgrade notes as requiring recompilation.
> * Observed on 10.0.0: {{BUILT 
> org.apache.solr.client.solrj.impl.HttpJdkSolrClient}} and {{CONSUMER OK}}, 
> exit 0.
> * Observed on 10.1.0, identical bytes: exit 1 with
> {noformat}
> java.lang.NoSuchMethodError: 
> 'org.apache.solr.client.solrj.impl.HttpSolrClientBuilderBase 
> org.apache.solr.client.solrj.impl.HttpJdkSolrClient$Builder.withConnectionTimeout(long,
>  java.util.concurrent.TimeUnit)'
>         at Consumer.main(Consumer.java:8)
> {noformat}
> * The identical source recompiled against 10.1.0 compiles and runs correctly, 
> which isolates the break to binary compatibility. A control consumer that 
> uses only {{Builder.withHttpClient(...)}} (whose descriptors name only 
> concrete types) runs unchanged on both versions.
> h2. Context and open question
> SOLR-17968 and [PR #3829|https://github.com/apache/solr/pull/3829] renamed 
> the classes deliberately (main {{8d3f995c6a}}, branch_10x {{e5340a954b}}). 
> Neither the ticket, the PR discussion, nor the upgrade notes mention the 
> effect on already-compiled consumers. In 10.0.0, {{HttpSolrClientBase}} is 
> marked {{@lucene.internal}} in its Javadoc; {{HttpSolrClientBuilderBase}}, 
> the class ordinary bytecode actually names, is not. Whether that makes the 
> break acceptable in a minor release is the policy question this ticket poses; 
> the runtime behavior above is the observed defect either way.
> Possible directions, kept separate from the defect report: restore the two 
> classes as compatibility types so the released descriptors resolve, or 
> document the removal and the recompile requirement in the 10.1 upgrade notes 
> if the break is accepted.
> h2. Prepared fix
> A fix is prepared on branch 
> [solr-18600-http-abi-restore-submit|https://github.com/nick-boss-tech/solr/tree/solr-18600-http-abi-restore-submit]
>  at commit 
> [c40665af8d6|https://github.com/nick-boss-tech/solr/commit/c40665af8d6bd23c85fef565f93de5004a7b2ca4],
>  based on branch_10x.
> It restores {{HttpSolrClientBase}} and {{HttpSolrClientBuilderBase}} as 
> top-level classes with the released fields, constructor and members; 
> {{HttpSolrClient}} and its nested {{BuilderBase}} extend them; the released 
> declared types are restored on the neighboring classes (CloudSolrClient, 
> CloudHttp2SolrClient, HttpClusterStateProvider, LBSolrClient.Builder, 
> LBAsyncSolrClient, ConcurrentUpdateBaseSolrClient.Builder); and the 
> {{SolrRequest.processWithBaseUrl(HttpSolrClientBase, ...)}} overload is 
> re-added.
> Verified at that head: the new HttpSolrClientBinaryCompatTest and 
> HttpJettySolrClientBinaryCompatTest pass, as do HttpJdkSolrClientTest, 
> HttpJettySolrClientTest and the Cloud, LB and ConcurrentUpdate suites, and 
> :solr:solrj:check and :solr:solrj-jetty:check pass. The consumer bytes 
> compiled against SolrJ 10.0.0 that fail on 10.1.0 with the NoSuchMethodError 
> above run correctly against the patched build. A PR against branch_10x can be 
> opened on request.
> 🤖 _AI text above_ 🤖 _(reviewed by Nick Shanin)_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to