You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Roman Kondakov (Jira)" <ji...@apache.org> on 2020/05/28 20:24:00 UTC

[jira] [Commented] (IGNITE-13092) ConcurrentModificationException when adding items to cache

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

Roman Kondakov commented on IGNITE-13092:
-----------------------------------------

It looks like a bug in the logging: {{TreeMap}} is logged without a proper synchronization. As a workaround you can set the logging level higher than {{DEBUG}}

> ConcurrentModificationException when adding items to cache
> ----------------------------------------------------------
>
>                 Key: IGNITE-13092
>                 URL: https://issues.apache.org/jira/browse/IGNITE-13092
>             Project: Ignite
>          Issue Type: Bug
>          Components: cache
>    Affects Versions: 2.8.1
>         Environment: Java 1.8.0_231
> Apache Ignite 2.8.1
> Windows 10, 64G memory
> Java params:
> {{-Xms1024m }}{{-Xmx50g }}{{-Xss1024m}}
> {{-Xverify:none}}
> {{-server}}
> {{-DIGNITE_QUIET=true}}
> {{-XX:+UseG1GC}}
> {{-XX:+DisableExplicitGC}}
> {{-Djava.net.preferIPv4Stack=true}}
> {{-XX:+AlwaysPreTouch}}
> {{-XX:+ScavengeBeforeFullGC}}
> {{-XX:+AggressiveOpts}}
>         <dependency>
>             <groupId>org.apache.ignite</groupId>
>             <artifactId>ignite-core</artifactId>
>             <version>${ignite.version}</version>
>         </dependency>
>         <dependency>
>             <groupId>org.apache.ignite</groupId>
>             <artifactId>ignite-spring</artifactId>
>             <version>${ignite.version}</version>
>         </dependency>
>         <dependency>
>             <groupId>org.apache.ignite</groupId>
>             <artifactId>ignite-log4j2</artifactId>
>             <version>${ignite.version}</version>
>         </dependency>
> <?xml version="1.0" encoding="UTF-8"?>
> <beans xmlns="http://www.springframework.org/schema/beans"
>        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>        xsi:schemaLocation="
>         http://www.springframework.org/schema/beans
>         http://www.springframework.org/schema/beans/spring-beans.xsd">
>     <bean class="org.apache.ignite.configuration.IgniteConfiguration">
>         <property name="gridLogger">
>             <bean class="org.apache.ignite.logger.log4j2.Log4J2Logger">
>                 <constructor-arg type="java.lang.String" value="log4j2.xml"/>
>             </bean>
>         </property>
>         <property name="communicationSpi">
>             <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
>               <!-- Override local port. -->
>               <property name="localPort" value="47400"/>
>             </bean>
>         </property>
>         <!-- Configure internal thread pool. 64-->
>         <property name="publicThreadPoolSize" value="16"/>
>         <!-- Configure system thread pool. 32-->
>         <property name="systemThreadPoolSize" value="8"/>
>         <property name="systemWorkerBlockedTimeout" value="#{5 * 60 * 1000}"/>
>         <property name="failureHandler">
>             <bean class="org.apache.ignite.failure.StopNodeFailureHandler">
>                 <!-- uncomment to enable this handler to 
>                 process critical workers' hung-ups -->
>                 <property name="ignoredFailureTypes">
>                     <list>
>                     </list>
>                 </property>
>             </bean>
>         </property>
>         <!-- Set to true to enable distributed class loading for examples, default is false. -->
>         <property name="peerClassLoadingEnabled" value="false"/>
>         <property name="dataStorageConfiguration">
>             <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
>                 <!--
>                      Sets a path to the root directory where data and indexes are
>                      to be persisted. It's assumed the directory is on a separated SSD.
>                 -->
>                 <property name="storagePath" value="persistence"/>
>                 <!--
>                      Sets a path to the directory where WAL is stored.
>                      It's assumed the directory is on a separated HDD.
>                 -->
>                 <property name="walPath" value="wal"/>
>                 <!--
>                     Sets a path to the directory where WAL archive is stored.
>                     The directory is on the same HDD as the WAL.
>                 -->
>                 <property name="walArchivePath" value="wal/archive"/>
>                 <!-- Changing WAL Mode. --> 
>                 <property name="walMode" value="NONE"/>
>                 <!-- Set the page size to 4 KB, default -->
>                 <!-- limit 1 KB - 16 KB -->
>                 <property name="pageSize" value="#{4 * 1024}"/>
>                 <!-- Enable write throttling. -->
>                 <property name="writeThrottlingEnabled" value="false"/>
>                 <property name="checkpointFrequency" value="500"/>
>                 <property name="lockWaitTime" value="2000"/>
>                 <property name="checkpointThreads" value="1"/>
>                 <property name="checkpointWriteOrder" value="RANDOM"/>
>                 <!--
>                     Default memory region that grows endlessly. A cache is bound to this memory region
>                     unless it sets another one in its CacheConfiguration.
>                 -->
>                 <property name="defaultDataRegionConfiguration">
>                     <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
>                         <!--property name="name" value="Default_Region"/-->
>                         <property name="name" value="default"/>
>                         <!-- 100 MB memory region with disabled eviction -->
>                         <property name="initialSize" value="#{100L * 1024 * 1024}"/>
>                         <!-- maxSize 20 MB is too little -->
>                         <!-- sum of all maxSize values has to be less than total memory of the system -->
>                         <!-- limits size in memory, not on disk -->
>                         <!-- default value 1.2GB -->
>                         <property name="maxSize"     value="#{2L * 1024 * 1024 * 1024}"/>
>                         <property name="persistenceEnabled" value="true"/>
>                         <!-- Increasing the buffer size to 1 GB. -->
>                         <property name="checkpointPageBufferSize" value="#{1L * 1024 * 1024 * 1024}"/>
>                     </bean>
>                 </property>
>                 <!-- Defining several data regions for different memory regions -->
>                 <property name="dataRegionConfigurations">
>                     <list>
>                     </list>
>                 </property>
>             </bean>
>         </property>
>         <property name="cacheConfiguration">
>             <list>
>                 <!--bean class="org.apache.ignite.configuration.CacheConfiguration">
>                     <property name="dataRegionName" value="default"/>
>                     <property name="name" value=".ShardDetectorStorage"/>
>                     <property name="onheapCacheEnabled" value="true"/>
>                 </bean>
>                 <bean class="org.apache.ignite.configuration.CacheConfiguration">
>                     <property name="dataRegionName" value="default"/>
>                     <property name="name" value=".ChildrenStore"/>
>                     <property name="onheapCacheEnabled" value="true"/>
>                 </bean>
>                 <bean class="org.apache.ignite.configuration.CacheConfiguration">
>                     <property name="dataRegionName" value="default"/>
>                     <property name="name" value=".ChildrenStore.listsize"/>
>                     <property name="onheapCacheEnabled" value="true"/>
>                 </bean>
>                 <bean class="org.apache.ignite.configuration.CacheConfiguration">
>                     <property name="dataRegionName" value="default"/>
>                     <property name="name" value=".RootStorage"/>
>                     <property name="onheapCacheEnabled" value="true"/>
>                 </bean>
>                 <bean class="org.apache.ignite.configuration.CacheConfiguration">
>                     <property name="dataRegionName" value="default"/>
>                     <property name="name" value=".QualifierStorage"/>
>                     <property name="onheapCacheEnabled" value="true"/>
>                 </bean-->
>             </list>
>         </property>
>     </bean>
> </beans>
>            Reporter: Tomasz Grygo
>            Priority: Blocker
>
> Ignite fails when adding items to cache with multiple concurrent threads. Cache is persistent, with no eviction and no WAL. There is no Ignite cluster, just one machine.
> 2020-05-27 23:29:13,177 [Storage0 ] [ERROR] - <.ChildrenStore> Unexpected exception during cache update
> java.util.ConcurrentModificationException
>  at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1211)
>  at java.util.TreeMap$EntryIterator.next(TreeMap.java:1247)
>  at java.util.TreeMap$EntryIterator.next(TreeMap.java:1242)
>  at java.util.AbstractMap.toString(AbstractMap.java:554)
>  at java.lang.String.valueOf(String.java:2994)
>  at java.lang.StringBuilder.append(StringBuilder.java:131)
>  at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryPartitionRecovery.collectEntries(CacheContinuousQueryPartitionRecovery.java:261)
>  at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler.handleEvent(CacheContinuousQueryHandler.java:973)
>  at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler.onEntryUpdate(CacheContinuousQueryHandler.java:1019)
>  at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler.access$600(CacheContinuousQueryHandler.java:90)
>  at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler$2.onEntryUpdated(CacheContinuousQueryHandler.java:445)
>  at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryManager.onEntryUpdated(CacheContinuousQueryManager.java:443)
>  at org.apache.ignite.internal.processors.cache.GridCacheMapEntry.innerUpdate(GridCacheMapEntry.java:2489)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateSingle(GridDhtAtomicCache.java:2641)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.update(GridDhtAtomicCache.java:2102)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1919)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1719)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.sendSingleRequest(GridNearAtomicAbstractUpdateFuture.java:300)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.map(GridNearAtomicSingleUpdateFuture.java:486)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture.mapOnTopology(GridNearAtomicSingleUpdateFuture.java:446)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture.map(GridNearAtomicAbstractUpdateFuture.java:249)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.update0(GridDhtAtomicCache.java:1164)
>  at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.put0(GridDhtAtomicCache.java:624)
>  at org.apache.ignite.internal.processors.cache.GridCacheAdapter.put(GridCacheAdapter.java:2580)
>  at org.apache.ignite.internal.processors.cache.GridCacheAdapter.putIfAbsent(GridCacheAdapter.java:3007)
>  at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.putIfAbsent(IgniteCacheProxyImpl.java:1395)
>  at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.putIfAbsent(GatewayProtectedCacheProxy.java:928)
>  at com.sc.extr.cache.PureIgniteDynamicSetStorage.addItem(PureIgniteDynamicSetStorage.java:96)
>  at com.sc.extr.cache.SetStorageBase.addItem(SetStorageBase.java:44)
>  at com.sc.extr.tree.childrenstore.ChildrenStoreBaseKV.addItem(ChildrenStoreBaseKV.java:30)
>  at com.sc.extr.tree.childrenstore.ChildrenStoreInPureIgnite.add(ChildrenStoreInPureIgnite.java:59)
>  at com.sc.extr.tree.ShardChildren.addChild(ShardChildren.java:46)
>  at com.sc.extr.tree.SkinnyTreeBuilder.shardChild(SkinnyTreeBuilder.java:121)
>  at com.sc.extr.tree.SkinnyTreeBuilder.parentFwd(SkinnyTreeBuilder.java:162)
>  at com.sc.extr.tree.SkinnyTreeBuilder.addRow(SkinnyTreeBuilder.java:277)
>  at com.sc.extr.tree.MultiCacheTreeBuilder.process(MultiCacheTreeBuilder.java:204)
>  at com.sc.bi.workflow.WorkTransformer.processOne(WorkTransformer.java:84)
>  at com.sc.bi.workflow.WorkTransformer.doWork(WorkTransformer.java:145)
>  at com.sc.bi.workflow.WorkTransformer.processQueue(WorkTransformer.java:210)
>  at com.sc.bi.workflow.WorkTransformer.run(WorkTransformer.java:169)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)