[ 
https://issues.apache.org/jira/browse/SOLR-15762?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17437846#comment-17437846
 ] 

Thomas Wöckinger commented on SOLR-15762:
-----------------------------------------

As FastLRUCache is deprecated, i removed the class attribute from the cache 
config to select the default implementation.

It is not that easy to force the exception when using CaffeineCache (may 
because it is faster), but the API documents using `get`(which is called in 
computeIfAbsent) on the CaffeineCache can also throw an IllegalStateException 
during recursion detection.

Only catching the IllegalStateException when using computeIfAbsent in 
SolrIndexSearcher seems to be not a good solution.

> IllegalStateException: Recursive update thrown when executing complex Join 
> queries
> ----------------------------------------------------------------------------------
>
>                 Key: SOLR-15762
>                 URL: https://issues.apache.org/jira/browse/SOLR-15762
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: search, Server
>    Affects Versions: main (9.0), 8.10, 8.10.1
>            Reporter: Thomas Wöckinger
>            Priority: Critical
>
> When running complex Join queries (maybe others effected too) an 
> IllegalStateException: Recursive update is thrown because of recursive up of 
> the FastLRUCache triggered by FastLRUCache.computeIfAbsent used by 
> SolrIndexSearcher.
> The issue is caused by changes due to SOLR-15555 by commit 
> [https://github.com/apache/lucene-solr/commit/fd9631f59d03500dbde31f7d7ae23b10d364d80d#diff-99978700f1c69d6a5f6c2190f89c98cfe20c441161db5a183ec002e15cb1be28]
> Following Join Query causes the exception:
> new JsonQueryRequest().setQuery("\{!join from=_id_ to=standorte._id_ v=$q1}")
>  .withParam("q1", "type:standort AND _id_:\{!join from=_id_ 
> to=beziehungen._id_ v=$q2}")
>  .withParam("q2", "type:beziehung AND _id_:\{!join from=_id_ to=person._id_ 
> v='type:person'}")
> The stack trace shows the recusive call:
> 08:29:43,569][ ][Thread:main] ERROR java.lang.IllegalStateException: 
> Recursive update
>  at 
> java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1760)
>  at 
> org.apache.solr.util.ConcurrentLRUCache.computeIfAbsent(ConcurrentLRUCache.java:226)
>  at org.apache.solr.search.FastLRUCache.computeIfAbsent(FastLRUCache.java:259)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getDocSet(SolrIndexSearcher.java:1122)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.getDocSetEnumerate(JoinQParserPlugin.java:591)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.getDocSet(JoinQParserPlugin.java:452)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.scorer(JoinQParserPlugin.java:381)
>  at org.apache.lucene.search.Weight.scorerSupplier(Weight.java:148)
>  at 
> org.apache.lucene.search.BooleanWeight.scorerSupplier(BooleanWeight.java:379)
>  at org.apache.lucene.search.BooleanWeight.scorer(BooleanWeight.java:344)
>  at org.apache.lucene.search.Weight.bulkScorer(Weight.java:182)
>  at org.apache.lucene.search.BooleanWeight.bulkScorer(BooleanWeight.java:338)
>  at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:656)
>  at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:443)
>  at org.apache.solr.search.DocSetUtil.createDocSetGeneric(DocSetUtil.java:145)
>  at org.apache.solr.search.DocSetUtil.createDocSet(DocSetUtil.java:134)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getDocSetNC(SolrIndexSearcher.java:1197)
>  at 
> org.apache.solr.search.SolrIndexSearcher.lambda$getAndCacheDocSet$1(SolrIndexSearcher.java:876)
>  at 
> org.apache.solr.search.FastLRUCache.lambda$computeIfAbsent$1(FastLRUCache.java:261)
>  at 
> org.apache.solr.util.ConcurrentLRUCache.lambda$computeIfAbsent$1(ConcurrentLRUCache.java:227)
>  at 
> java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
>  at 
> org.apache.solr.util.ConcurrentLRUCache.computeIfAbsent(ConcurrentLRUCache.java:226)
>  at org.apache.solr.search.FastLRUCache.computeIfAbsent(FastLRUCache.java:259)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getAndCacheDocSet(SolrIndexSearcher.java:876)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getDocSet(SolrIndexSearcher.java:825)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.getDocSetEnumerate(JoinQParserPlugin.java:476)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.getDocSet(JoinQParserPlugin.java:452)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.scorer(JoinQParserPlugin.java:381)
>  at org.apache.lucene.search.Weight.scorerSupplier(Weight.java:148)
>  at 
> org.apache.lucene.search.BooleanWeight.scorerSupplier(BooleanWeight.java:379)
>  at org.apache.lucene.search.BooleanWeight.scorer(BooleanWeight.java:344)
>  at org.apache.lucene.search.Weight.bulkScorer(Weight.java:182)
>  at org.apache.lucene.search.BooleanWeight.bulkScorer(BooleanWeight.java:338)
>  at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:656)
>  at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:443)
>  at org.apache.solr.search.DocSetUtil.createDocSetGeneric(DocSetUtil.java:145)
>  at org.apache.solr.search.DocSetUtil.createDocSet(DocSetUtil.java:134)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getDocSetNC(SolrIndexSearcher.java:1197)
>  at 
> org.apache.solr.search.SolrIndexSearcher.lambda$getAndCacheDocSet$1(SolrIndexSearcher.java:876)
>  at 
> org.apache.solr.search.FastLRUCache.lambda$computeIfAbsent$1(FastLRUCache.java:261)
>  at 
> org.apache.solr.util.ConcurrentLRUCache.lambda$computeIfAbsent$1(ConcurrentLRUCache.java:227)
>  at 
> java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
>  at 
> org.apache.solr.util.ConcurrentLRUCache.computeIfAbsent(ConcurrentLRUCache.java:226)
>  at org.apache.solr.search.FastLRUCache.computeIfAbsent(FastLRUCache.java:259)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getAndCacheDocSet(SolrIndexSearcher.java:876)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getDocSet(SolrIndexSearcher.java:825)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.getDocSetEnumerate(JoinQParserPlugin.java:476)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.getDocSet(JoinQParserPlugin.java:452)
>  at 
> org.apache.solr.search.JoinQuery$JoinQueryWeight.scorer(JoinQParserPlugin.java:381)
>  at org.apache.lucene.search.Weight.bulkScorer(Weight.java:182)
>  at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:656)
>  at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:443)
>  at 
> org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:211)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1622)
>  at 
> org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1439)
>  at 
> org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:596)
>  at 
> org.apache.solr.handler.component.QueryComponent.doProcessUngroupedSearch(QueryComponent.java:1511)
>  at 
> org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:390)
>  at 
> org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:368)
>  at 
> org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:216)
>  at org.apache.solr.core.SolrCore.execute(SolrCore.java:2637)
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

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

Reply via email to