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)
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:
Related issue in gson: https://github.com/google/gson/issues/1159