You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@solr.apache.org by "Thomas Wöckinger (Jira)" <ji...@apache.org> on 2021/11/03 09:13:00 UTC

[jira] [Commented] (SOLR-15762) IllegalStateException: Recursive update thrown when executing complex Join queries

    [ 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-unsubscribe@solr.apache.org
For additional commands, e-mail: issues-help@solr.apache.org