[ 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