Onyx-Protocol / Onyx

Onyx
https://Onyx.org
GNU Affero General Public License v3.0
1.79k stars 362 forks source link

sdk/java: fix gson concurrency bug #1483

Closed ryandotsmith closed 6 years ago

ryandotsmith commented 6 years ago

It seems that our serializer is not safe to use across threads. This patch removes our global serializer object and adds a serializer instance variable on the Client object. If folks instantiate client objects across threads, then we should be ok here.

Example stack trace from a customer:

Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.chain.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
    at com.chain.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
    at com.chain.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.chain.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
    at com.chain.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
    at com.chain.google.gson.Gson.toJson(Gson.java:661)
    at com.chain.google.gson.Gson.toJson(Gson.java:640)
    at com.chain.google.gson.Gson.toJson(Gson.java:595)
    at com.chain.google.gson.Gson.toJson(Gson.java:575)
    at com.chain.http.Client.post(Client.java:342)
    at com.chain.http.Client.singletonBatchRequest(Client.java:235)
    at com.chain.signing.HsmSigner.sign(HsmSigner.java:70)

Related issue in gson: https://github.com/google/gson/issues/1159