ZoroXing / xmemcached

Automatically exported from code.google.com/p/xmemcached
Apache License 2.0
0 stars 0 forks source link

ConcurrentModificationException #225

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Noticed the following exception (below) in our logs today. Seems like a 
concurrency issue in the XMemcachedClient? The client is being built like below:

// scala code
val builder = new XMemcachedClientBuilder(inetAddresses.list)
builder.setCommandFactory(new BinaryCommandFactory)
builder.setSessionLocator(new KetamaMemcachedSessionLocator)    
builder.setConnectionPoolSize(dvs.getInt(StackMobConstants.MEMCACHED_CONNECTION_
POOL_SIZE_KEY, StackMobConstants.MEMCACHED_DEFAULT_CONNECTION_POOL_SIZE))
builder.build

Any idea what is going on?

Thank you,
Taylor

Caused by: java.util.ConcurrentModificationException: null
        at java.util.ArrayList.writeObject(ArrayList.java:573) ~[na:1.6.0_26]
        at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26]
        at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26]
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) ~[na:1.6.0_26]
        at java.util.HashMap.writeObject(HashMap.java:1001) ~[na:1.6.0_26]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_26]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_26]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26]
        at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26]
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_26]
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) ~[na:1.6.0_26]
        at net.rubyeye.xmemcached.transcoders.BaseSerializingTranscoder.serialize(BaseSerializingTranscoder.java:80) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.transcoders.SerializingTranscoder.encode(SerializingTranscoder.java:202) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.command.binary.BaseBinaryCommand.encode(BaseBinaryCommand.java:332) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.impl.MemcachedTCPSession.wrapMessage(MemcachedTCPSession.java:173) ~[xmemcached-1.3.8.jar:na]
        at com.google.code.yanf4j.core.impl.AbstractSession.write(AbstractSession.java:381) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.impl.MemcachedConnector.send(MemcachedConnector.java:498) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.XMemcachedClient.sendCommand(XMemcachedClient.java:265) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.XMemcachedClient.sendStoreCommand(XMemcachedClient.java:2546) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1312) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1370) ~[xmemcached-1.3.8.jar:na]
        at net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1357) ~[xmemcached-1.3.8.jar:na]

Original issue reported on code.google.com by tlees...@gmail.com on 26 Oct 2012 at 12:12

GoogleCodeExporter commented 8 years ago
It doesn't matter with xmemcached.
It seems that you set a object with a ArrayList instance inside,and when you 
set the object ,another thread has modified the array list instance,so it throw 
the ConcurrentModificationException when serialized the array list instance.

Original comment by killme2...@gmail.com on 26 Oct 2012 at 3:11

GoogleCodeExporter commented 8 years ago
[deleted comment]
GoogleCodeExporter commented 8 years ago
So is XMemcachedClient threadsafe in general? Seems like you are suggesting 
that the issue here is just that two threads are operating on the object being 
serialized? I guess that makes sense the exception is coming from within 
serialize.

- Taylor

Original comment by tlees...@gmail.com on 26 Oct 2012 at 3:20

GoogleCodeExporter commented 8 years ago
Yes,XmemcachedClient is threadsafe.

The exception is coming from within serialize a ArrayList instance,and someone 
modified the instance such as adding/removing objects from it,then it caused 
the serializer throw the exception.

Original comment by killme2...@gmail.com on 26 Oct 2012 at 3:23

GoogleCodeExporter commented 8 years ago

Original comment by killme2...@gmail.com on 21 Nov 2012 at 10:12