[
https://issues.apache.org/jira/browse/SOLR-17413?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17893571#comment-17893571
]
ASF subversion and git services commented on SOLR-17413:
--------------------------------------------------------
Commit a15e6f4278523f2a23ad35246fe7e34bf531e12f in solr's branch
refs/heads/branch_9x from Jason Gerlowski
[ https://gitbox.apache.org/repos/asf?p=solr.git;h=a15e6f42785 ]
SOLR-17413: ulog replay should copy SolrQueryRequest (#2765)
SolrQueryRequest is a non-threadsafe type, but was being shared across
executor threads during UpdateLog replay. This introduces a number of
issues, not the least being a ConcurrentModificationException if
multiple threads happen to tweak the request 'context' simultaneously.
This commit fixes this issue by giving each executor thread a unique
LocalSolrQueryRequest instance to use.
> 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
> Reporter: David Smiley
> Priority: Major
> Labels: newdev, pull-request-available
> Time Spent: 1h 50m
> Remaining Estimate: 0h
>
> 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]