David,  let me try and address your concerns with the approach.  I am
open to other approaches, however, we need something that will work
consistently.  I would like for what I have now to run in our CI for
at least a week to see if we get more failures or not, before changing
it further.  I do not want to contribute to this project's flakey test
problem.

As the wisdom of the JDK designers had it, java.net.http.HttpClient
did not originally implement Closable or Autoclosable.  There was no
way for a user of the library to release resources, particularly
threads.  You can pass your own Executor in the Builder, keep a
reference to it and ensure you close it yourself.  But this is not
enough.  The implementation appears to keep additional ("selector")
threads not managed by that executor.

See the description of [1] and the last paragraph of [2], where it is
noted that prior to Java 21 (which adds close() methods) we must wait
for a garbage collection.  While developing this feature, I found that
running a full gc in the "after" method of each test was enough to
make the test framework happy.  However, within a day of this being in
our CI, we were getting failures from these "selector" threads still
being active.  As I said, I do not want to contribute further to our
flakey test problem.

Others suggest similar solutions in [3], although the reflection-based
solutions are less-viable because they I believe require "--add-opens"
to be added for the module, which I think we should avoid.  I agree
the current solution of interrupting all the "HttpClient" threads in
the "after" method is an extraordinary step to take!  It probably
would be adequate to do it in "afterClass" but then again, it might be
best if each test started with a clean slate.  If we join the threads
first, the test might block waiting.  I am pretty sure the "system.gc"
is no longer necessary after interrupting the threads, but in a unit
test "after" method, what is the harm?

I agree I should have used "forEach".  I noticed this myself after
pushing these changes.  But this is the most minor of concerns.
-----
[1] https://bugs.openjdk.org/browse/JDK-8304165
[2] https://inside.java/2023/12/10/sip092/
[3] https://stackoverflow.com/questions/53919721/close-java-http-client

On Thu, Mar 14, 2024 at 8:35 PM dsmiley (via GitHub) <g...@apache.org> wrote:
>
>
> dsmiley commented on PR #2259:
> URL: https://github.com/apache/solr/pull/2259#issuecomment-1998742427
>
>    Instead of simply interrupting the threads, shouldn't we also join on them?
>    Should that be in an AfterClass -- is it a problem between each test?
>    note: you don't need to gather a Set to then iterate; you can call 
> `forEach` on the stream to do whatever you want to do.  I don't think using a 
> Set (for uniqueness) is necessary here either.
>    What is the GC accomplishing?
>
>    I was looking again at all those test overrides that call super.  I 
> removed them locally and I was able to run at the CLI and IntelliJ and it ran 
> all the intherited tests.  This pattern is done elsewhere like 
> SolrExampleTests
>
>
> --
> This is an automated message from the Apache Git Service.
> To respond to the message, please log on to GitHub and use the
> URL above to go to the specific comment.
>
> To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org
>
> For queries about this service, please contact Infrastructure at:
> us...@infra.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org
> For additional commands, e-mail: issues-h...@solr.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@solr.apache.org
For additional commands, e-mail: dev-h...@solr.apache.org

Reply via email to