You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@solr.apache.org by "Chris M. Hostetter (Jira)" <ji...@apache.org> on 2025/09/25 02:12:00 UTC
[jira] [Commented] (SOLR-3696) LBHttpSolrServer's aliveCheckExecutor is not closed in RecoveryZkTest (and possibly other tests)
[ https://issues.apache.org/jira/browse/SOLR-3696?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18022607#comment-18022607 ]
Chris M. Hostetter commented on SOLR-3696:
------------------------------------------
For reasons i don't understand, my test reports show that {{TestReplicaProperties}} has been failing in ~50% of all jenkins builds over the past 7 days – but only on the "main" branch (since it's a suite level test failure which can record more failures then runs, historic metrics aren't available because they are unreliably – so no idea how long it's been failing).
Based on a sampling of the jenkins log, the problem is always leaked {{aliveCheckExecutor}} threads.
----
These seeds don't *reliably* reproduce for me, but they do _occasionally_ reproduce – and since neither jenkins nor any of my local failures included any {{ObjectReleaseTracker}} failures regarding the {{LBSolrClient}} instance, that strongly suggests that the {{LBSolrClient}} *IS* being properly closed, but {{LBSolrClient}} is _*not*_ (reliably) closing the {{{}aliveCheckExecutor{}}}.
Reviewing the lifecycle of the {{aliveCheckExecutor}} I had a hunch, and with a small amount of instrumentation I was able to confirm what the problem is: Nothing prevents a thread from executing a request via {{{}LBSolrClient{}}}, which may then "fail" and cause {{LBSolrClient.startAliveCheckExecutor}} to be called, *AFTER* {{LBSolrClient.close()}} has been (concurrently) called by some other thread.
{noformat}
// LBSolrClient.aliveCheckExecutor is initially null
T1: sends a request via the LBSolrClient, which fails and enters LBSolrClient.startAliveCheckExecutor
T2: enters LBSolrClient.close, synchronizes on LBSolrClient.this
T2: sees that aliveCheckExecutor is null, does nothing, returns (releasing synchronization lock on LBSolrClient.this)
T1: sees that aliveCheckExecutor is null, synchronizes on LBSolrClient.this
T1: double checks that aliveCheckExecutor is still null, assigns it a new Executor, returns (releasing synchronization lock on LBSolrClient.this)
{noformat}
We need to make {{LBSolrClient.startAliveCheckExecutor()}} smart enough to not initialize the Executor if the {{LBSolrClient.close()}} has already been (or is concurrently being) called.
> LBHttpSolrServer's aliveCheckExecutor is not closed in RecoveryZkTest (and possibly other tests)
> ------------------------------------------------------------------------------------------------
>
> Key: SOLR-3696
> URL: https://issues.apache.org/jira/browse/SOLR-3696
> Project: Solr
> Issue Type: Bug
> Reporter: Dawid Weiss
> Priority: Major
> Labels: pull-request-available
> Time Spent: 20m
> Remaining Estimate: 0h
>
> LBHttpSolrServer is never shut down properly and leaks pool threads from aliveCheckExecutor.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@solr.apache.org
For additional commands, e-mail: issues-help@solr.apache.org