[
https://issues.apache.org/jira/browse/SOLR-1870?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Prasanna Ranganathan updated SOLR-1870:
---------------------------------------
Summary: Binary Update Request (javabin) fails when the field type of a
multivalued SolrInputDocument field is a Set (or any type that is identified as
an instance of iterable) (was: JavaBinUpdateRequestCodec (and javabin codec)
fails when the field type of a multivalued field is a Set (or any type that is
identified as an instance of iterable) )
> Binary Update Request (javabin) fails when the field type of a multivalued
> SolrInputDocument field is a Set (or any type that is identified as an
> instance of iterable)
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: SOLR-1870
> URL: https://issues.apache.org/jira/browse/SOLR-1870
> Project: Solr
> Issue Type: Bug
> Components: update
> Affects Versions: 1.4
> Reporter: Prasanna Ranganathan
> Priority: Minor
>
> When the field type of a field in a SolrInputDocument is a Collection based
> on the Set interface, the JavaBinUpdate request fails. It works when sending
> the document data over XML.
> I encountered this error when updating my indexer to write documents in the
> binary format. I initially got a ClassCastException and after digging into it
> found the likely cause for it.
> The following piece of code added to 'public void simple() throws
> IOException' method in TestUpdateRequestCodec.java illustrates the error.
> doc = new SolrInputDocument();
> Collection<String> foobar = new HashSet<String>();
> foobar.add("baz1");
> foobar.add("baz2");
> doc.addField("foobar",foobar);
> updateRequest.add(doc);
> The test fails for any Collection derived from the Set interface but will
> work if the Collection is a List / Array or other types. The stack trace is
> as follows:
> java.lang.ClassCastException: java.lang.String
> at
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readIterator(JavaBinUpdateRequestCodec.java:121)
> at
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:210)
> at
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readNamedList(JavaBinUpdateRequestCodec.java:107)
> at
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:175)
> at
> org.apache.solr.common.util.JavaBinCodec.readArray(JavaBinCodec.java:405)
> at
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:171)
> at
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readIterator(JavaBinUpdateRequestCodec.java:119)
> at
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:210)
> at
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readNamedList(JavaBinUpdateRequestCodec.java:107)
> at
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:175)
> at
> org.apache.solr.common.util.JavaBinCodec.unmarshal(JavaBinCodec.java:101)
> at
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec.unmarshal(JavaBinUpdateRequestCodec.java:126)
> at
> org.apache.solr.client.solrj.request.TestUpdateRequestCodec.simple(TestUpdateRequestCodec.java:82)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at
> org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
> at
> org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
> at
> org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
> at
> org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
> at
> org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
> at
> org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
> at
> org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
> at
> org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
> at
> org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
> at
> org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
> at com.intellij.rt.junit4.Junit4ClassSuite.run(Junit4ClassSuite.java:99)
> at
> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
> The error most likely is in the way javabin codec encodes Sets. In the
> public boolean writeKnownType(Object val) method in JavaBinCodec.java, a Set
> is recognized as an instance of iterable and the writeIterator method is
> called.
> I briefly looked at the writeIterator and readIterator methods and was
> unable to pinpoint the error. I also looked at the javabin encoded byte
> stream (not exactly a good way to debug..) and it did not look like it was
> right.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.