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

David Smiley commented on SOLR-17413:
-------------------------------------

I'd prefer to avoid catching this exception to take some other action -- would 
feel too much like a hack.  I'm optimistic a more elegant solution without 
doing this can be found.

Perhaps SynchronousQueue?  Maybe I can rule this out based on a little test I 
did, as it throws a RejectedExecutionException (instead of blocking), which I'd 
rather not catch.

Perhaps a LinkedBlockingQueue (thus infinite queue size) but have an 
ExecutorService subclass that observes the queue size to see if a threshold is 
reached and if so then runs the task directly?  This way we never reject and 
the caller threads receive back pressure by doing the work that they would have 
done anyway with multiThreaded=false ! There is plenty of precedent for an 
ExecutorService that runs the task in the caller thread -- I'm thinking of 
Lucene's SameThreadExecutorService and Solr's SimpleFacets.directExecutor.

> UpdateLog Replay can throw ConcurrentModificationException from sharing the 
> request
> -----------------------------------------------------------------------------------
>
>                 Key: SOLR-17413
>                 URL: https://issues.apache.org/jira/browse/SOLR-17413
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>            Reporter: David Smiley
>            Priority: Major
>              Labels: newdev
>
> I saw org.apache.solr.cloud.BasicDistributedZkTest fail with a stack trace 
> revealing we have a real issue with UpdateLog replay.  Essentially, a 
> SolrQueryRequest is not threadsafe but we replay logs in parallel sharing the 
> same request instance.  Creating DistributedUpdateProcessor ends up adding to 
> a shared HashMap in req.getContext() that should not be shared.
> {noformat}
>   2> WARNING: Uncaught exception in thread: 
> Thread[replayUpdatesExecutor-590-thread-2,5,TGRP-BasicDistributedZkTest]
>   2> java.util.ConcurrentModificationException
>   2>  at __randomizedtesting.SeedInfo.seed([F2227B12A8FC234]:0)
>   2>  at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1135)
>   2>  at 
> org.apache.solr.update.processor.DistributedUpdateProcessorFactory.addParamToDistributedRequestWhitelist(DistributedUpdateProcessorFactory.java:46)
>   2>  at 
> org.apache.solr.update.processor.DistributedUpdateProcessor.<init>(DistributedUpdateProcessor.java:190)
>   2>  at 
> org.apache.solr.update.processor.DistributedUpdateProcessor.<init>(DistributedUpdateProcessor.java:160)
>   2>  at 
> org.apache.solr.update.processor.DistributedZkUpdateProcessor.<init>(DistributedZkUpdateProcessor.java:114)
>   2>  at 
> org.apache.solr.update.processor.DistributedUpdateProcessorFactory.getInstance(DistributedUpdateProcessorFactory.java:59)
>   2>  at 
> org.apache.solr.update.processor.UpdateRequestProcessorChain.createProcessor(UpdateRequestProcessorChain.java:242)
>   2>  at 
> org.apache.solr.update.processor.UpdateRequestProcessorChain.createProcessor(UpdateRequestProcessorChain.java:214)
>   2>  at 
> org.apache.solr.update.UpdateLog$LogReplayer.lambda$doReplay$0(UpdateLog.java:2103)
>   2>  at 
> java.base/java.lang.ThreadLocal$SuppliedThreadLocal.initialValue(ThreadLocal.java:305)
>   2>  at java.base/java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:195)
>   2>  at java.base/java.lang.ThreadLocal.get(ThreadLocal.java:172)
>   2>  at 
> org.apache.solr.update.UpdateLog$LogReplayer.lambda$execute$2(UpdateLog.java:2342)
>   2>  at 
> org.apache.solr.util.OrderedExecutor.lambda$execute$0(OrderedExecutor.java:68)
>   2>  at 
> org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$1(ExecutorUtil.java:449)
>   2>  at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>   2>  at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>   2>  at java.base/java.lang.Thread.run(Thread.java:829)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to