[
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: [email protected]
For additional commands, e-mail: [email protected]